上传后图像文件会增大
本文关键字:文件 图像 | 更新日期: 2023-09-27 18:01:47
我在一个小页面上使用了一个非常基本的文件上传,只需要一个基本的文件上传。
但是这里的问题是文件大小在上传到服务器后会增加,从大约800 kb到1,7 mb
这可能是因为我们实际上并没有上传文件本身,只是复制流并基于它制作一个新的图像。
我已经尝试更改graphichandle。InterpolationMode,并尝试添加graphichandle。CompositingQuality可以改变各种质量,但是由于某些原因,它们的大小和质量总是相同的,就像它不影响图像一样,就像graphichandle不做任何事情一样。
我使用的代码如下
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
一切都很好,除了文件大小翻倍。
graphichandle不运行吗?因为它似乎不会以任何方式影响图像
您将图像保存为位图。这可以解释位图未压缩时文件大小增加的原因。
如果你快速浏览一下msdn: http://msdn.microsoft.com/en-us/library/9t4syfhh(v=vs.110).aspx和http://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageformat(v=vs.110).aspx
你可以看到你可以给newImage添加一个参数。
定义保存的格式。那么你的代码就会变成这样:
newImage.Save(path + fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
上传代码后将其保存为未压缩的BMP。
要解决此问题,请查看以下内容:http://msdn.microsoft.com/en-us/library/ytz20d80(v=vs.110).aspx
在这里,他们解释了如何将图像保存为jpeg或任何其他图像类型,包括压缩!为了方便大小,我建议使用jpeg。
我希望这对你有所帮助!
为了改变文件的大小,你可以尝试保存新图像,调整其属性,如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;
}