我调整大小放大的图像质量、尺寸较低,并且与使用 IrfanView 的相同调整大小的图像相比,它是模糊的

问题描述

我正在尝试调整/放大图像,以获得与 IrfanView 程序相同的良好效果。我只是将这个经验丰富的专业程序作为参考,比较了我在 .NET 中使用“自己的”图像大小调整算法可以获得的结果质量。

但是,我调整后的图像相比之下比较模糊,并且图像大小在画布大小内有所不同,例如小了 1px,我不知道为什么,我的意思是我不知道这种差异是否是我的错,或者 irfanview 的故障。

原图:

enter image description here

使用 irfanview 调整图像大小:

enter image description here

使用以下 .NET 代码调整图像大小:

enter image description here


除非您将两个图像都保存到磁盘,并使用任何图像查看器(如 irfanview)打开它们以在两个图像之间快速传递,否则可能根本不会注意到差异,因此您会注意到一些东西像这样:

enter image description here


这是我正在使用的代码

Public Function Resize(source As Image,size As Size,preserveAspectRatio As Boolean) As Drawing.Image

    If (size.Width <= 0) Then
        Throw New ArgumentException("Width bigger than zero is reqired.",NameOf(size))

    ElseIf (size.Height <= 0) Then
        Throw New ArgumentException("Height bigger than zero is reqired.",NameOf(size))

    Else
        Dim bmp As Drawing.Bitmap

        If (preserveAspectRatio) Then
            ' https://codereview.stackexchange.com/a/70916/25995
            Dim scaleHeight As Single = CSng(size.Height) / CSng(source.Height)
            Dim scaleWidth As Single = CSng(size.Width) / CSng(source.Width)
            Dim smallerScale As Single = Math.Min(scaleHeight,scaleWidth)

            bmp = New Bitmap(CInt(Math.Truncate(source.Width * smallerScale)),CInt(Math.Truncate(source.Height * smallerScale)),source.PixelFormat)

        Else
            bmp = New Bitmap(size.Width,size.Height,source.PixelFormat)

        End If

        Using g As Graphics = Graphics.FromImage(bmp),attributes As New ImageAttributes()

            ' g.CompositingQuality = CompositingQuality.AssumeLinear
            g.InterpolationMode = InterpolationMode.Bicubic
            g.PixelOffsetMode = PixelOffsetMode.Half
            g.SmoothingMode = SmoothingMode.None
            g.CompositingMode = CompositingMode.sourcecopy

            ' Avoid 1px semi-transparent black borders: 
            ' https://stackoverflow.com/a/41718683/1248295
            attributes.SetWrapMode(WrapMode.TileFlipX)
            g.DrawImage(source,New Rectangle(Point.Empty,bmp.Size),source.Width,source.Height,GraphicsUnit.Pixel,attributes)

        End Using

        Return bmp

    End If

End Function

为什么我得到的结果比 irfanview 差?。为什么我的图像模糊并且在画布大小内绘制了不同的大小?。我做错了什么,我该如何解决

请注意,在上面的代码中,我测试了几乎所有可能的质量组合。双三次插值为我提供了比高质量双三次更好/更清晰的图像,我不确定在放大图像时这是否总是适用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)