我在c#中缩放图像,我将我的方法与Photoshop cs5中最好的方法进行了比较,无法复制.
在PS中,我使用的是双子叶尖锐,看起来真的很好.但是,当尝试在c#中执行相同操作时,我不会得到高质量的结果.我已经尝试了双三次插值以及HQ双三次,平滑模式HQ / None / AA.作曲模式,我尝试了大约50种不同的变体,每一种都出现在右边的图像上.
你会注意到她的背后和标题的像素化,以及作者的名字不太好.
(左是PS,右是c#.)
似乎c#bicubic做平滑甚至平滑设置为无.我一直在玩各种各样的以下代码:
g.CompositingQuality = CompositingQuality.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.PixelOffsetMode = PixelOffsetMode.None; g.SmoothingMode = SmoothingMode.None;
编辑:根据要求,起始图像(1mb).
解决方法
也许我错过了一些东西,但是我通常使用下面的代码来调整/压缩JPEG图像.就个人而言,我觉得根据您的来源形象,结果很好.代码不处理与输入参数有关的几个边缘情况,但是总体上完成了工作(我有其他扩展方法用于裁剪,如果感兴趣则组合图像转换).
图像缩放至原始尺寸的25%,使用90%压缩. (〜30KB输出文件)
图像缩放扩展方法:
public static Image Resize(this Image image,Single scale) { if (image == null) return null; scale = Math.Max(0.0F,scale); Int32 scaledWidth = Convert.ToInt32(image.Width * scale); Int32 scaledHeight = Convert.ToInt32(image.Height * scale); return image.Resize(new Size(scaledWidth,scaledHeight)); } public static Image Resize(this Image image,Size size) { if (image == null || size.IsEmpty) return null; var resizedImage = new Bitmap(size.Width,size.Height,image.PixelFormat); resizedImage.SetResolution(image.HorizontalResolution,image.VerticalResolution); using (var g = Graphics.FromImage(resizedImage)) { var location = new Point(0,0); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(image,new Rectangle(location,size),image.Size),GraphicsUnit.Pixel); } return resizedImage; }
压缩扩展方法:
public static Image Compress(this Image image,Int32 quality) { if (image == null) return null; quality = Math.Max(0,Math.Min(100,quality)); using (var encoderParameters = new EncoderParameters(1)) { var imageCodecInfo = ImageCodecInfo.GetImageEncoders().First(encoder => String.Compare(encoder.MimeType,"image/jpeg",StringComparison.OrdinalIgnoreCase) == 0); var memoryStream = new MemoryStream(); encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality,Convert.ToInt64(quality)); image.Save(memoryStream,imageCodecInfo,encoderParameters); return Image.FromStream(memoryStream); } }
用法:
using(var source = Image.FromFile(@"C:\~\Source.jpg")) using(var resized = source.Resize(0.25F)) using(var compressed = resized.Compress(90)) compressed.Save(@"C:\~\Output.jpg");
注意:对于任何可能发表评论的人,您无法处理在压缩方法中创建的MemoryStream,直到图像被丢弃为止.如果您反思在MemoryStream上执行Dispose,实际上保存为不显式调用处理.唯一的选择是将图像/内存流包装在实现Image / IDisposable的类的自定义实现中.