C # Создание миниатюры (проблема низкого качества и большого размера) - PullRequest
3 голосов
/ 18 мая 2010
public void CreateThumbnail(Image img1, Photo photo, string targetDirectoryThumbs)
        {
            int newWidth = 700;
            int newHeight = 700;
            double ratio = 0;

            if (img1.Width > img1.Height)
            {
                ratio = img1.Width / (double)img1.Height;
                newHeight = (int)(newHeight / ratio);
            }
            else
            {
                ratio = img1.Height / (double)img1.Width;
                newWidth = (int)(newWidth / ratio);
            }

            Image bmp1 = img1.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero);
            bmp1.Save(targetDirectoryThumbs + photo.PhotoID + ".jpg");

            img1.Dispose();
            bmp1.Dispose();
        }

Я поставил 700px, чтобы вы могли лучше понять проблему. Вот оригинальное изображение и изменение размера один.

Любая хорошая рекомендация?

Спасибо
Ile

Ответы [ 5 ]

6 голосов
/ 18 мая 2010

Вы должны найти мой ответ на этот вопрос полезным. Он включает в себя образец для высококачественного масштабирования изображения в C #.

Полный пример в моем другом ответе включает в себя, как сохранить изображение в формате JPEG.

Вот соответствующий бит кода ...

    /// <summary> 
    /// Resize the image to the specified width and height. 
    /// </summary> 
    /// <param name="image">The image to resize.</param> 
    /// <param name="width">The width to resize to.</param> 
    /// <param name="height">The height to resize to.</param> 
    /// <returns>The resized image.</returns> 
    public static System.Drawing.Bitmap ResizeImage(System.Drawing.Image image, int width, int height) 
    { 
        //a holder for the result 
        Bitmap result = new Bitmap(width, height); 

        //use a graphics object to draw the resized image into the bitmap 
        using (Graphics graphics = Graphics.FromImage(result)) 
        { 
            //set the resize quality modes to high quality 
            graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
            graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
            //draw the image into the target bitmap 
            graphics.DrawImage(image, 0, 0, result.Width, result.Height); 
        } 

        //return the resulting bitmap 
        return result; 
    } 
2 голосов
/ 18 мая 2010

Если изображение содержит миниатюру, оно автоматически растянется до желаемого размера ... что сделает его похожим на дерьмо (как ваш случай;))

Прямо из MSDN ...

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

В вашем случае я просто дважды проверил исходное изображение на наличие его эскиза и получил это ...

  • Новая миниатюра Windows: формат JPEG (смещение: 830Размер: 3234)
  • Тип эскиза: JPEG
  • Thumnail Ширина: 112
  • Высота миниатюры: 84
1 голос
/ 18 мая 2010

Попробуйте нарисовать исходное изображение на другом меньшем изображении и сохраните результат.

Bitmap bmp1 = new Bitmap(newWidth, newHeight);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(img1, 0, 0, newWidth, newHeight);
bmp1.Save(targetDirectoryThumbs + photo.PhotoID + ".jpg", ImageFormat.Jpeg);
0 голосов
/ 28 января 2014

Я написал бесплатный .dll, который делает это легко. Это здесь, если вы хотите увидеть документацию .... Git Repository & Tutorial

0 голосов
/ 18 мая 2010

Вам разрешено использовать сторонние приложения? Если это так, вы можете воспользоваться ImageMagick для управления созданием миниатюр. Есть оболочка .NET.

http://imagemagick.codeplex.com/

...