我从客户端收到一个代表jpg的base64字符串,我使用以下代码保存它
byte[] imageBytes = Convert.FromBase64String(base64File.base64Data);
using (var ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
{
Image image = Image.FromStream(ms, true);
image.Save("aPath");
}
问题是在客户端输入的原始图像(在base64编码之前)大约是3MB,一旦我使用上面的方法保存它,它就会变成24MB的图像!
有没有办法减少它的大小? (我知道发送用base64编码的大图像并不是很聪明,但我需要找到一个保留这部分的解决方案)
答案 0 :(得分:3)
只需保存字节,不要将其转换回图像,否则您必须使用与最初保存时相同的设置。
即它已经是您想要的图像,从流中加载并调用save,将其保存为大概32位的位图
更新
所以我尝试了下面的代码
byte[] imageBytes = Convert.FromBase64String(base64File.base64Data);
File.WriteAllBytes("apath"),imageBytes);
但它会生成一个18MB的文件, 仍远大于原来的
基本上这意味着,当你将它转换为base64(服务器端)时,它可能正在做同样的事情。也许它将它加载到Image
并在将其转换为Base64之前保存字节。
我相信在转换base64之前判断图像是否实际是位图(在您的情况下)的方法只是查看文件的前2个字节是否为BM。
无论哪种方式,图像在转换为base64之前在另一侧被操纵,也许它是一个位图或者它刚刚重新进入它,很难说。这就是说base64编码不够聪明,无法重新进行图像格式的重新设计并扩大尺寸