2

可能重复:
如何调整图像大小并保存在文件夹中?

我想调整大小并保存为给定文件夹中的图像。但我想以尽可能高的质量做到这一点。我愿意使用第三方软件。

像paint.net 或photoshop。

那么实现这一目标的最佳方法是什么?

谢谢你。

4

3 回答 3

3

免责声明:以下链接/代码来自我的博客:

你应该看看我网站上的这篇文章http://samuelhaddad.com/2011/01/26/net-high-quality-thumbnail-generation/

帖子中的代码如下所示:

//Image Resize Helper Method
private static Bitmap ResizeImage(String filename, int maxWidth, int maxHeight)
{
    using (Image originalImage = Image.FromFile(filename))
    {
        //Caluate new Size
        int newWidth = originalImage.Width;
        int newHeight = originalImage.Height;
        double aspectRatio = (double)originalImage.Width / (double)originalImage.Height;
        if (aspectRatio <= 1 && originalImage.Width > maxWidth)
        {
            newWidth = maxWidth;
            newHeight = (int)Math.Round(newWidth / aspectRatio);
        }
        else if (aspectRatio > 1 && originalImage.Height > maxHeight)
        {
            newHeight = maxHeight;
            newWidth = (int)Math.Round(newHeight * aspectRatio);
        }
        Bitmap newImage = new Bitmap(newWidth, newHeight);
        using (Graphics g = Graphics.FromImage(newImage))
        {
            //--Quality Settings Adjust to fit your application
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.DrawImage(originalImage, 0, 0, newImage.Width, newImage.Height);
            return newImage;
        }
    }
}

您可以将其包装在 for 循环中以进行批处理。

于 2012-12-05T20:55:22.433 回答
1

编辑:实际上,为了更好地介绍和描述我在下面讨论的信息类型,请参阅这个库这篇文章

但我也想大多数图像库都有可用的 lanczos。我使用过FreeImage,它似乎有一个非常不错的 C# 包装器。


质量主要与使用的插值算法和调整大小的比率有关。在 Paint.net 和 Photoshop 中,它们有一个下拉菜单可供选择。每种算法在它最擅长的方面会有所不同(缩小规模、扩大规模、按整数比例调整大小......)并且每种算法都有不同的速度。Paint.net 也有“最佳质量”选项,它会告诉你它决定使用什么(虽然我不确定超级采样指的是什么......),用你的一些图像和目标大小手动执行此操作看看它使用什么可能会帮助您选择更快的算法。

@SamPlusPlus 的答案使用 HighQualityBilinear,IIRC 非常适合调整大小和添加少量模糊(因此算法会消除锐利的线条),其中 Bicubic 将保留更多的线条清晰度。所以在这两者中,双线性通常更适合升迁,而双三次通常更适合缩小规模。

我相信Lanczos算法是最好的全能算法之一(在任何规模的扩大或缩小方面都非常好),但也是速度较慢的算法之一。如果您将图像缩小 7%(100:93 的比例很难缩小),我强烈建议您这样做。

如果你做 50%、25%、200% 等,所有的算法都会得到非常相似的结果,唯一的区别是速度。

如果输入或输出文件的大小变化很大,我建议寻找一个具有 Lanczos 调整大小算法的库,因为无论调整大小的类型如何,它都非常好,而且因为你没有提到速度是重要,只有质量。我没有在 C# 中使用过这样的库,所以我没有任何直接的建议。

于 2012-12-05T22:35:04.400 回答
-1

你应该看看颜色量化。我为此实现了一个库,并且效果很好。进行搜索,您应该会找到很多。今天晚些时候我可能会发布一些代码。

.NET 中的彩色图像量化

C# 中的简单调色板量化器

http://msdn.microsoft.com/en-us/library/aa479306.aspx

于 2012-12-05T21:04:18.203 回答