我创建了一个调整图片大小和裁剪图片的功能,然后保存生成的图片文件。 在我的开发环境中,它的效果非常好,但在生产时,生成的图像是“颗粒状的”。 您可以在此处查看不同的质量http://test.powersport.it/canc2.aspx
以下是生成调整大小和裁剪图像的代码
// width: width of cropped img - height: height of cropped img
System.Drawing.Bitmap thumbnail = new Bitmap(width, height);
// image: original System.Drawing.Image containing full size img
thumbnail.SetResolution(image.HorizontalResolution, image.VerticalResolution);
// size[0]: width of resized img - size[1]: height of resized image
System.Drawing.Image mini = new Bitmap(image, size[0], size[1]);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(thumbnail);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawImage(mini, ((width - size[0]) / 2), ((height - size[1]) / 2), size[0], size[1]);
EncoderParameters encoderParameters;
encoderParameters = new EncoderParameters(1);
ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
// img: original file name
switch (Path.GetExtension(img).ToLower())
{
case ".png": // info[4]
thumbnail.Save(dest, System.Drawing.Imaging.ImageFormat.Png);
break;
case ".bmp": // info[0]
thumbnail.Save(dest, System.Drawing.Imaging.ImageFormat.Bmp);
break;
case ".tiff": // info[3]
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW);
thumbnail.Save(dest, info[3], encoderParameters);
break;
case ".tif": // info[3]
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW);
thumbnail.Save(dest, info[3], encoderParameters);
break;
default: //jpeg info[1]
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, compression);
thumbnail.Save(dest, info[1], encoderParameters);
break;
}
感谢任何帮助。感谢。
更新:我尝试过使用PNG,BMP和TIFF,但他们遇到了同样的问题
答案 0 :(得分:1)
这是一个非常有趣的问题,根据您提供compression=100
的事实,您可能会认为根本不应该应用压缩。
不幸的是,根据MSDN article on setting the JPEG Compression Level:
质量等级0对应于最大压缩,和a 质量等级100对应于最小压缩。
所以100
并不意味着没有压缩,这意味着压缩可能性最小。
至于它在不同机器之间的变化,这是相当一致的 - 我已经观察到了这一点,并且Stack Overflow上甚至还有许多其他questions。
由于压缩的实际机制由GDI +(在.Net Framework之外)处理,因此它将取决于机器上安装的实际版本。
答案 1 :(得分:1)
可能每台机器实际上都是以不同的格式压缩图像,而不是文件扩展名。
WS2008和WS2008 R2具有不同的图形子系统。在后者中,GDI +只是WIC编码器的包装器,它具有不同的怪癖发送。
我真的希望你决定use a library that handles these differences for you。服务器端映像既不简单也不直观,has an endless list of pitfalls to avoid。除了你在这里遇到的编码问题之外,看起来你的印象是.NET实际上会从System.Drawing
命名空间中垃圾收集类。它不会,除非每个引用都在using(){}
子句中,否则你会遇到一些严重的稳定性问题。