Помогите с методами изменения размера изображения GDI - PullRequest
1 голос
/ 17 мая 2011

Так что мне нужно немного изменить размер.

Я нашел два разных метода.

Один выглядит так:

public static Byte[] ResizeImageNew(System.Drawing.Image imageFile, int targetWidth, int targetHeight) {
        using(imageFile){
            Size newSize = CalculateDimensions(imageFile.Size, targetWidth, targetHeight);

            using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format32bppRgb)) {
                newImage.SetResolution(imageFile.HorizontalResolution, imageFile.VerticalResolution);
                using (Graphics canvas = Graphics.FromImage(newImage)) {
                    canvas.SmoothingMode = SmoothingMode.AntiAlias;
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    canvas.DrawImage(imageFile, new Rectangle(new Point(0, 0), newSize));
                    MemoryStream m = new MemoryStream();
                    newImage.Save(m, ImageFormat.Jpeg);
                    return m.GetBuffer();
                }
            }
        }
    }

И другой:

    public static System.Drawing.Image ResizeImage(System.Drawing.Image originalImage, int width, int maxHeight) {
        originalImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
        originalImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

        int NewHeight = originalImage.Height * width / originalImage.Width;
        if (NewHeight > maxHeight) {
            // Resize with height instead
            width = originalImage.Width * maxHeight / originalImage.Height;
            NewHeight = maxHeight;
        }

        System.Drawing.Image newImage = originalImage.GetThumbnailImage(width, NewHeight, null, IntPtr.Zero);

        return newImage;
    }

Я в основном «позаимствовал» оба метода и просто изменил их по кусочкам.

Однако - используя первый, всякий раз, когда я изменяю размер изображения до небольшого размера, размер файлана самом деле больше, чем оригинал (!?)

А второй при значительном улучшении размера выглядит ужасно: /

Я, конечно, полагаюсь просто на улучшение качества изображения в первом методе, есливозможно, но я не понимаю, как, с моей точки зрения, все выглядит «качественно»?

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Независимо от размера файла, я бы определенно рекомендовал использовать первый метод, а не метод с GetThumbnailImage.

GetThumbnailImage фактически вытянет встроенный эскиз из исходного изображения, если он существует. К сожалению, это означает, что вы масштабируете от какого-то неизвестного оригинального размера и качества файла (по сравнению с оригиналом), если вы не ожидаете и не учитываете встроенный эскиз. Это также означает, что вы получите результаты совершенно другого качества за один прогон (со встроенной миниатюрой), чем вы получили бы за другой прогон (без встроенной миниатюры).

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

1 голос
/ 17 мая 2011

Возможно, вам придется установить уровень сжатия JPEG.В настоящее время он, вероятно, сохраняет на очень высоком уровне качества, что может быть не тем, что вы хотите.

См. Здесь для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/bb882583.aspx

Обратите внимание, однако, что просто снижение разрешенияизображение не обязательно уменьшает размер файла.Из-за того, как работает сжатие, файл с меньшим разрешением, который был размытым из-за режимов интерполяции, может быть значительно больше, чем оригинал, хотя с JPEG это, вероятно, не большая проблема из-за алгоритма с потерями.Однако это может иметь огромное значение для PNG, если исходный файл был очень простым до этого (например, «плоская» веб-комическая или простая векторная графика) и был размытым после изменения размера.

...