2014-01-26 6 views
1

У меня есть этот код, который я использую для изменения размера и сохранения файла, который публикуется пользователем. Проблема заключается в том, что когда я пересчитываю ширину 480 пикселей, изображение теряет много качества, а размер в kb по-прежнему довольно большой.Asp.net image resizing quality

Например, при изменении размера изображения на 480px «вручную» с использованием программного обеспечения, такого как Paint, качество по-прежнему не хуже оригинала (от того, что может сказать мой глаз), и размер в kb очень много меньше, чем изменение размера с использованием метода GetThumbNailImage.

Mdn говорит «Если вы запросите большое уменьшенное изображение (например, 300 x 300) из изображения с встроенной миниатюрой, может быть заметная потеря качества в миниатюрном изображении. Возможно, было бы лучше масштабируйте основное изображение (вместо масштабирования встроенного эскиза), вызвав метод DrawImage »., но это похоже на формы Windows, и мне нужно для веб-приложения.

Какой код следует использовать для этого?

System.IO.Stream st = FileUploadPost.PostedFile.InputStream; 

myImage = System.Drawing.Image.FromStream(st); 
thumb = myImage.GetThumbnailImage(newWidth, newHeight, null, System.IntPtr.Zero); 

thumb.Save(myPath); 
+0

Я написал эту функцию, которая изменяет размеры изображений JPEG, где вы можете установить качество http://codingstill.com/2011/07/creating-thumbnails-from-jpg-images-with-net/. Надеюсь, это поможет –

+0

спасибо за ваш ответ, но ваша функция - только для jpg-изображений, и я также работаю с другими форматами. – user2974961

ответ

2

Вот код, который работал для меня. Вы можете установить новое разрешение растрового изображения:

using System.Drawing; 

Bitmap img = (Bitmap)Bitmap.FromStream(FileUploadPost.PostedFile.InputStream); 
Bitmap newImg = new Bitmap(maxWidth, maxHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
newImg.SetResolution(72, 72); 
Graphics newGraphic = Graphics.FromImage(newImg); 
newGraphic.Clear(Color.Transparent); 
newGraphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
newGraphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
newGraphic.DrawImage(img, 0, 0, maxWidth, maxHeight); 
System.Drawing.Imaging.ImageFormat format = default(System.Drawing.Imaging.ImageFormat); 
string ext = Path.GetExtension(FileUploadPost.PostedFile.FileName); 
switch (ext.ToLower()) 
{ 
    case ".gif": 
     format = System.Drawing.Imaging.ImageFormat.Gif; 
     break; 
    case ".png": 
     format = System.Drawing.Imaging.ImageFormat.Png; 
     break; 
    default: 
     format = System.Drawing.Imaging.ImageFormat.Jpeg; 
     break; 
} 
newImg.Save(myPath, format); 

Вы можете обернуть его в пустой функции в глобальном классе:

public static void UploadImage(HttpPostedFileBase file, int maxWidth, int maxHeight) 
{ 
    //paste all the above code in here and replace FileUploadPost.PostedFile with file 
} 

Тогда вы можете позвонить из любого места в вашем проекте:

ClassName.UploadImage(FileUploadPost.PostedFile, 300, 300); 
+0

тоже пробовал, и он тоже хорошо работал. Мой комментарий тот же, что и для Рамзи. Изображение поддерживает высокое качество изображения, но размер в kb очень велик. В то время как на краске я мог уменьшить файл 2 МБ до 89 кб (при его уменьшении до 480 пикселей), этот код уменьшился до 394 КБ. – user2974961

0

Попробуйте

using System.Drawing; 
using System.Drawing.Imaging; 
using System.Drawing.Drawing2D; 

public static System.Drawing.Image ResizeImage(System.Drawing.Image image, int percent) { 
    // percent is the actual integer percent of the original size 

    System.Drawing.Bitmap imgThumb = new System.Drawing.Bitmap(image.Width * percent/100, image.Height * percent/100); 

    Rectangle sourceRect = new Rectangle(0, 0, image.Width, image.Height); 
    Rectangle destRect = new Rectangle(0, 0, imgThumb.Width, imgThumb.Height); 


    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(imgThumb); 
    g.CompositingQuality = CompositingQuality.HighQuality; 
    g.SmoothingMode = SmoothingMode.HighQuality; 
    g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    g.DrawImage(image, destRect, sourceRect, GraphicsUnit.Pixel); 
    return (imgThumb); 
} 
+0

ОК, это сработало хорошо. Визуальное качество оставалось очень хорошим. Проблема с размером остается. Оригинальный загруженный файл - 2.518 kb. Загрузив его и используя этот код для его изменения, новый размер станет 421kb. Но когда я делаю это вручную, используя краску, я могу уменьшить 2.518kb до 89kb и оставаться с визуальным качеством. Любые идеи? – user2974961