Как пропорционально изменить размер изображения любого типа в .NET? - PullRequest
14 голосов
/ 01 апреля 2009

Можно ли пропорционально изменить размер изображения независимо от его типа (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?

Я знаю, что с помощью этот метод , но не знаю, где это (!).

Ответы [ 2 ]

16 голосов
/ 01 апреля 2009

Прежде всего, вы не захватываете ТЕКУЩУЮ высоту и ширину изображения. Чтобы пропорционально изменить размер, вам нужно получить текущую высоту / ширину изображения и изменить его размер на основе этого.

Оттуда найдите величайший атрибут и пропорционально измените его размер.

Например, предположим, что текущее изображение имеет размер 800 x 600, и вы хотите пропорционально изменить размер в пределах 400 x 400. Возьмите наибольшую пропорцию (800) и найдите ее соотношение с новым размером. 800 -> 400 = .5 Теперь возьмите это соотношение и умножьте на второе измерение (600 * .5 = 300).

Ваш новый размер 400 х 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 голосов
/ 01 апреля 2009

Я думаю, что ваш код в порядке, но принимая ширину и высоту в качестве параметров, я думаю, вы ошибаетесь. Почему вызывающий метод должен решить, насколько большой он хочет ширину и высоту? Я бы предложил изменить его в процентах:

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;
    }
}
...