c# – 缩小图像时如何获得更好的结果?

前端之家收集整理的这篇文章主要介绍了c# – 缩小图像时如何获得更好的结果?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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的类的自定义实现中.

原文链接:https://www.f2er.com/csharp/91592.html

猜你在找的C#相关文章