如何在.NET中等比例调整任何类型的图像大小?

14

是否有可能以一种与图像类型(bmp、jpg、png等)无关的比例调整图像大小?

我有这段代码,但知道还缺少一些东西(但不知道是什么):

public bool ResizeImage(string fileName, string imgFileName,
    ImageFormat format, int width, int height)
{
    try
    {
        using (Image img = Image.FromFile(fileName))
        {
            Image thumbNail = new Bitmap(width, height, img.PixelFormat);
            Graphics g = Graphics.FromImage(thumbNail);
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            Rectangle rect = new Rectangle(0, 0, width, height);
            g.DrawImage(img, rect);
            thumbNail.Save(imgFileName, format);
        }
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

如果不行,我该如何等比例调整jpeg图像的大小呢?

我知道可以使用这种方法,但是不知道在哪里放这个方法(!)。


5
当调整大小时,8位PNG和GIF图像需要重新量化和重新抖动(这很不容易!)。 最好的解决方案是使用经过管理的库,该库旨在正确处理所有格式/边缘情况,保持纵横比等。 ImageResizer库是执行此任务以及裁剪,旋转和翻转的经过验证的工具。 它是开源的,因此如果您想自己编写解决方案,只需复制并粘贴即可。 它还通过插件允许许多其他有用的事情,例如水印,磁盘缓存,SQL Blob,S3读取等。 - Lilith River
来这里是为了改进我自己编写的图像调整大小工具,结果发现了ImageResizer库。它太棒了!给Computer Linguist点赞! - Chris
1
上面计算机语言学家的回答中的URL应该是:http://imageresizing.net/。 - glenatron
2个回答

16

首先,您没有获取图像的当前高度和宽度。为了等比例缩放,您需要获取图像的当前高度/宽度并根据此进行调整。

从那里开始,找到最大属性并根据其等比例调整大小。

例如,假设当前图像为800 x 600,您想要在400 x 400空间内等比例调整大小。抓取最大比例(800),然后查找它相对于新尺寸的比例。800-> 400 = .5 现在将该比率乘以第二个尺寸(600 * .5 = 300)。

您的新大小是400 x 300。 这是一个PHP示例(抱歉...但您会明白的)

$thumb_width = 400;
$thumb_height = 400;

$orig_w=imagesx($src_img); 
$orig_h=imagesy($src_img);      

if ($orig_w>$orig_h){//find the greater proportion
    $ratio=$thumb_width/$orig_w; 
    $thumb_height=$orig_h*$ratio;
}else{
    $ratio=$thumb_height/$orig_h; 
    $thumb_width=$orig_w*$ratio;
}

9

我认为你的代码没问题,但是参数中包含宽度和高度可能是你的问题所在。为什么调用这个方法的人要决定他们想要多大的宽度和高度呢?我建议将其改为百分比:

public bool ResizeImage(string fileName, string imgFileName,
    ImageFormat format, int percent)
{
    try
    {
        using (Image img = Image.FromFile(fileName))
        {
            int width = img.Width * (percent * .01);
            int height = img.Height * (percent * .01);
            Image thumbNail = new Bitmap(width, height, img.PixelFormat);
            Graphics g = Graphics.FromImage(thumbNail);
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            Rectangle rect = new Rectangle(0, 0, width, height);
            g.DrawImage(img, rect);
            thumbNail.Save(imgFileName, format);
        }
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

6
对于呼叫者而言,了解他们想要的图像精确尺寸可能非常重要。例如,如果我有一张尺寸为1024X768的图像,我想将其缩小到50X50用作缩略图,我不应该必须计算百分比。个人建议标准化宽度/高度,并提供一个百分比超载,最终调用宽度/高度版本,既实现了两种方法的优点,也不需要太多额外的代码。 - ctorx
我知道这是一个旧评论,但是...我个人会提供宽度或高度作为约束,并保持纵横比,以便图像不会变形。你甚至可以只想将最大边缘调整为50,无论是高度还是宽度。 - David McLean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接