上传后图像文件大小增加

时间:2014-05-06 07:38:28

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

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

但问题是上传到服务器后文件大小增加到大约800千字节到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是不是没有运行?因为它似乎不会以任何方式影响图像

3 个答案:

答案 0 :(得分:2)

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

如果你在这里快速浏览一下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);

答案 1 :(得分:1)

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

我希望这能帮到你一点!

答案 2 :(得分:1)

为了更改文件的大小,您可以尝试保存新图像,以调整其属性,例如CompositingQuality,InterpolationMode以及质量和压缩。例如,CompositingQuality可以设置为" HighSpeed"值,InterpolationMode到"低"等等。这取决于你有什么样的图像,需要进行测试。

作为代码的一个例子

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;
}

希望这有帮助。