C # - изменить размер изображения холста (сохраняя исходные размеры в пикселях исходного изображения) - PullRequest
11 голосов
/ 11 мая 2011

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

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

// Load the image and determine new dimensions
System.Drawing.Image img = System.Drawing.Image.FromFile(srcFilePath);
Size szDimensions = new Size(GetNextPwr2(img.Width), GetNextPwr2(img.Height));

// Create blank canvas
Bitmap resizedImg = new Bitmap(szDimensions.Width, szDimensions.Height);
Graphics gfx = Graphics.FromImage(resizedImg);

// Paste source image on blank canvas, then save it as .png
gfx.DrawImageUnscaled(img, 0, 0);
resizedImg.Save(newFilePath, System.Drawing.Imaging.ImageFormat.Png);

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

Ответы [ 2 ]

16 голосов
/ 11 мая 2011

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

Используйте метод DrawImage вместо рисования изображения с использованием исходного размера пикселя:

gfx.DrawImage(img, 0, 0, img.Width, img.Height);
2 голосов
/ 11 мая 2011

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

См .: http://support.microsoft.com/?id=317174

...