scorpzonex Ответов: 3

c# изменение размера изображения с помощью нового растрового изображения vs draw image


в чем же разница?

Bitmap newImage = новое растровое изображение(_currentBitmap, newWidth, newHeight);
вернуть newImag;

И

Растровое изображение animage= новое растровое изображение( newWidth, newHeight);
использование (Graphics gr = графика.FromImage(не))
{
gr.SmoothingMode = SmoothingMode.высококачественный;
gr.InterpolationMode = Интерполяционный Режим.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.высококачественный;
gr.CompositingQuality = композиционное качество.высококачественный;
gr.DrawImage(_currentBitmap, new Rectangle(0, 0, newWidth, newHeight));
}
вернуться не может;

3 Ответов

Рейтинг:
22

Ron Beyer

Почти ничего, вот исходный код системы.Рисование.Растровое изображение(Image, int, int) в .net Framework:

public Bitmap(Image original, int width, int height) : this(width, height) {
            Graphics g = null;
            try {
                g = Graphics.FromImage(this);
                g.Clear(Color.Transparent);
                g.DrawImage(original, 0, 0, width, height);
            }
            finally {
                if (g != null) {
                    g.Dispose();
                }
            }
        }


Sergey Alexandrovich Kryukov

Хорошая информация, мой 5, но есть существенная разница: 1) Качество масштабирования, 2) код, который вы показываете, не гарантирован. Пожалуйста, смотрите мой ответ.
—СА

Ron Beyer

Да, интерфейс не изменится (может обесцениться), но реализация не гарантированно останется прежней. Кроме установки некоторых флагов GDI, это почти тот же процесс, но установка флагов действительно дает предсказуемое качество.

Рейтинг:
12

Sergey Alexandrovich Kryukov

Посмотрите на документацию: http://msdn.microsoft.com/en-us/library/334ey5b7.aspx[^].

Как видите, в документации по этому конструктору не указано, как масштабируется изображение, какое качество интерполяции. Во втором примере кода Вы можете указать его. Вы можете поиграть со вторым образцом кода и выяснить, как именно выполняется масштабирование (так как вы можете сравнивать конечные результаты пиксель за пикселем). Однако вы не можете полагаться на эти результаты: поскольку факт этой детали не описан в документации, результат может зависеть от некоторых неизвестных факторов, таких как версия .net Framework. Я бы всегда использовал второй вариант кода, как только качество изображения становится важным.

—СА


Ron Beyer

Да, +5

Sergey Alexandrovich Kryukov

- Спасибо, Рон.
—СА

Рейтинг:
1

drlockett

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

var bmp = new Bitmap(newWidth, newHeight);
using var g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.None;
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.AssumeLinear;
g.DrawImage(Image, new Rectangle(0, 0, newWidth, newHeight));
return bmp;

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