【问题标题】:Image file size increases after uploading上传后图像文件大小增加
【发布时间】:2014-05-06 16:06:23
【问题描述】:

我正在为一个只需要一个基本文件的小页面使用一个非常基本的文件上传。

但这里的问题是文件大小在上传到服务器后会增加,大约 800 KB 到 1.7 兆字节

这大概是因为我们实际上并没有上传文件本身,只是复制流并基于它制作新图像。

我尝试更改 graphicsHandle.InterpolationMode 并尝试添加 graphicsHandle.CompositingQuality 以更改各种质量,但由于某种原因它们的大小和质量始终相同,就像它不会影响图像一样,就像 graphicsHandle 什么都不做一样。

我使用的代码如下

Stream stream = imageUpload.PostedFile.InputStream;
Bitmap image = new Bitmap(stream);

System.Drawing.Image newImage = new Bitmap(image.Width, image.Height);
using (Graphics graphicsHandle = Graphics.FromImage(newImage))
{
     graphicsHandle.InterpolationMode = InterpolationMode.HighQualityBicubic;
     //graphicsHandle.CompositingQuality = CompositingQuality.Default;
     graphicsHandle.DrawImage(image, 0, 0, image.Width, image.Height);
}


DateTime date = DateTime.Now;
string dateString = date.ToString("yyyyMMdd_HHmmss");
Guid guid = Guid.NewGuid();

fileName = string.Format("{0}_{1}{2}", dateString, guid, extension);

newImage.Save(path + fileName);
response = true;

imageUpload 是一个 asp:FileUpload

除了文件大小翻倍之外,一切都很好。

graphicsHandle 不运行吗?因为它似乎不会以任何方式影响图像

【问题讨论】:

  • 你为什么要从流中创建 btimap 而不是创建文件流并将整个内容直接写入文件中.....
  • 我的猜测是,如果有任何验证它实际上是图像,那么您不需要做太多事情。作为旁注,它不仅仅是将图像保存为位图,因此未压缩会解释文件大小的增加
  • dbw 是对的:您可能上传了 JPG,然后将其转换为位图,这是不必要的(并且比原始图像文件大得多)。

标签: c# asp.net .net file-upload


【解决方案1】:

您将图像保存为位图。 这可以解释看到位图未压缩时文件大小的增加。

如果您在这里快速浏览一下 msdn:http://msdn.microsoft.com/en-us/library/9t4syfhh(v=vs.110).aspxhttp://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageformat(v=vs.110).aspx

你可以看到你可以在newImage.Save中添加一个参数来定义保存的格式。

所以你的代码会变成这样:

newImage.Save(path + fileName, System.Drawing.Imaging.ImageFormat.Jpeg);

【讨论】:

    【解决方案2】:

    上传后,您的代码会将其保存为未压缩的 BMP。
    要解决此问题,请查看以下内容:http://msdn.microsoft.com/en-us/library/ytz20d80(v=vs.110).aspx
    在这里,他们解释了如何将图像保存为 jpeg 或任何其他图像类型,包括压缩!为了尺寸方便,我建议使用 jpeg。

    希望对你有所帮助!

    【讨论】:

    • 好吧,所以我错过了压缩部分。谢谢!
    • 是的,没问题!祝你有美好的一天!
    【解决方案3】:

    为了更改文件的大小,您可以尝试保存新图像,调整其属性,例如 CompositingQuality、InterpolationMode 以及质量和压缩。例如,CompositingQuality 可以设置为“HighSpeed”值,InterpolationMode 设置为“Low”等。这完全取决于您拥有的图像类型以及需要对其进行测试。

    以代码为例

    Stream stream = imageUpload.PostedFile.InputStream;
    Bitmap source = new Bitmap(stream);
    
    Bitmap target = new Bitmap(source.Width, source.Height);
    Graphics g = Graphics.FromImage(target); 
    
    EncoderParameters e;
    g.CompositingQuality = CompositingQuality.HighSpeed; <-- here
    g.InterpolationMode = InterpolationMode.Low; <-- here 
    
    Rectangle recCompression = new Rectangle(0, 0, source.Width, source.Height);
    g.DrawImage(source, recCompression);
    
    e = new EncoderParameters(2);
    e.Param[0] = new EncoderParameter(Encoder.Quality, 70); <-- here 70% quality
    e.Param[1] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionLZW); <-- here
    
    target.Save(newName, GetEncoderInfo("image/jpeg"), e);
    
    g.Dispose();
    target.Dispose();
    
    public static ImageCodecInfo GetEncoderInfo(string sMime)
    {
       ImageCodecInfo[] objEncoders;
       objEncoders = ImageCodecInfo.GetImageEncoders();
       for (int iLoop = 0; iLoop <= (objEncoders.Length - 1); iLoop++)
       {
           if (objEncoders[iLoop].MimeType == sMime)
              return objEncoders[iLoop];
       }
       return null;
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-03
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 2016-01-26
      • 2012-04-04
      • 2013-02-12
      相关资源
      最近更新 更多