Как пропорционально изменить размер изображения любого типа в .NET?

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

Я знаю, что используя этот метод, но не знаю, куда его поместить (!).

Ответы

Ответ 1

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

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

Например, скажем, текущее изображение 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;
}

Ответ 2

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

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