GDIplus Scale Bitmap - PullRequest
       15

GDIplus Scale Bitmap

4 голосов
/ 28 октября 2010

Здравствуйте, я пытаюсь изменить масштаб GDIplus :: Bitmap и сохранить в памяти масштабированный BItmap, и у меня возникла проблема. Я пробую много разных образцов, и мой результат NULL. Например, я пытаюсь изменить разрешение для изображения, используя SetResolution, также я пытаюсь преобразовать растровое изображение из image-> graphic и использовать один из конструкторов GDIplus :: Bitmap scale, но у меня ничего не получилось. Например я пытаюсь следующий код:

Bitmap *bitmap = new Bitmap((int32)width, (int32)height,PixelFormat32bppARGB);
bitmap=bmp.Clone(0,0,W,H,PixelFormat32bppPARGB);
mBitmap=(void *)bitmap->Clone(0.0f,0.0f,width,height,PixelFormat32bppPARGB);

Ответы [ 3 ]

8 голосов
/ 06 июня 2014

Вычислить новые ширину и высоту (если у вас есть коэффициенты масштабирования)

float newWidth = horizontalScalingFactor * (float) originalBitmap->GetWidth();
float newHeight = verticalScalingFactor * (float) originalBitmap->GetHeight();

или коэффициенты масштабирования, если известны новые размеры

float horizontalScalingFactor = (float) newWidth / (float) originalBitmap->GetWidth();
float verticalScalingFactor = (float) newHeight / (float) originalBitmap->GetHeight();

Создать новое пустое растровое изображение с достаточным пространством для масштабированного изображения

Image* img = new Bitmap((int) newWidth, (int) newHeight);

Создание новой графики для рисования на созданном растровом изображении:

Graphics g(img);

Примените масштабное преобразование к Графике и нарисуйте изображение

g.ScaleTransform(horizontalScalingFactor, verticalScalingFactor);
g.DrawImage(originalBitmap, 0, 0);

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

1 голос
/ 27 февраля 2018

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

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

Image* img = new Bitmap((int) newWidth, (int) newHeight);
horizontalScalingFactor *= originalBitmap->GetHorizontalResolution() / img->GetHorizontalResolution();
verticalScalingFactor *= originalBitmap->GetVerticalResolution() / img->GetVerticalResolution();

(примечание: разрешение по умолчанию для нового Bitmap, по-видимому, составляет 96 ppi, по крайней мере, на моем компьютере)

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

Image* img = new Bitmap((int) newWidth, (int) newHeight);
img->SetResolution(originalBitmap->GetHorizontalResolution(),  originalBitmap->GetVerticalResolution());    
0 голосов
/ 02 июля 2011

http://msdn.microsoft.com/en-us/library/e06tc8a5.aspx

Bitmap myBitmap = new Bitmap("Spiral.png");
Rectangle expansionRectangle = new Rectangle(135, 10,
   myBitmap.Width, myBitmap.Height);

Rectangle compressionRectangle = new Rectangle(300, 10,
   myBitmap.Width / 2, myBitmap.Height / 2);

myGraphics.DrawImage(myBitmap, 10, 10);
myGraphics.DrawImage(myBitmap, expansionRectangle);
myGraphics.DrawImage(myBitmap, compressionRectangle);
...