Как пропорционально изменить размер изображения любого типа в .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;
}
}