我正在使用一个非常基本的文件上传,只需要一个基本的小页面。
但问题是上传到服务器后文件大小增加到大约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是不是没有运行?因为它似乎不会以任何方式影响图像
答案 0 :(得分:2)
您将图像保存为位图。 这可以解释看到位图未压缩的文件大小的增加。
如果你在这里快速浏览一下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.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;
}
希望这有帮助。