加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:27:50 所属栏目:百科 来源:网络整理
导读:我在c#中缩放图像,我将我的方法与Photoshop cs5中最好的方法进行了比较,无法复制. 在PS中,我使用的是双子叶尖锐,看起来真的很好.但是,当尝试在c#中执行相同操作时,我不会得到高质量的结果.我已经尝试了双三次插值以及HQ双三次,平滑模式HQ / None / AA.作曲模
我在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的类的自定义实现中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读