【问题标题】:How to reduce jpg size saved from a base64 string C#如何减少从 base64 字符串 C# 保存的 jpg 大小
【发布时间】:2018-03-12 12:04:19
【问题描述】:

我从客户端收到一个代表 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编码的大图不是很聪明,但我需要找到一个解决方案保留这部分)

【问题讨论】:

  • 为什么要先将其转换为Image?如果是 JPEG,则直接保存 imageBytes
  • 您想减小它在磁盘上的大小吗?您是否尝试将其保存为其他格式,例如 PNG? :image.Save("apath", ImageFormat.Png);
  • base64 字符串本身有多大?
  • "image.Save(path)",没有保存类型参数,总是生成png。

标签: c# image base64


【解决方案1】:

只需保存字节,不要将其转换回图像,否则您将不得不使用与最初保存时相同的设置。

即它已经是您想要的图像,从流中加载并调用保存,将其保存为可能 32 位的位图

更新

所以我尝试了下面的代码

byte[] imageBytes = Convert.FromBase64String(base64File.base64Data);File.WriteAllBytes("apath"),imageBytes);

但它会生成一个 18MB 的文件, 还是比原来大很多

基本上这意味着,当您将其转换为 base64(服务器端)时,它可能正在做同样的事情。也许它将其加载到Image 并在将其转换为 Base64 之前保存字节。

我相信在转换 base64 之前判断图像是否实际上是位图(在您的情况下)的方法是查看文件的前 2 个字节是否为 BM。

无论哪种方式,图像在转换为 base64 之前都在另一侧被处理,可能是位图或只是重新编码,很难说。也就是说base64编码不够聪明,无法重新编码图像格式并扩大尺寸

【讨论】:

  • 感谢您的回答!所以我尝试了byte[] imageBytes = Convert.FromBase64String(base64File.base64Data); File.WriteAllBytes("apath"),imageBytes);下面的代码,但它生成了一个18MB的文件,仍然比原来的大很多。你还有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多