Поделиться через


О кадрировании и масштабировании изображений с использованием GDI+

Вы можете использовать метод DrawImage класса Graphics для рисования и размещения изображений. DrawImage — это перегруженный метод, поэтому его можно вызывать с различными аргументами. Один из вариантов метода Graphics::DrawImage получает адрес объекта и ссылку на объект Rect. Прямоугольник указывает назначение для операции рисования; то есть указывает прямоугольник, в котором будет нарисовано изображение. Если размер прямоугольника назначения отличается от размера исходного изображения, изображение масштабируется, чтобы оно соответствовало целевому прямоугольнику. Следующий пример рисует один и тот же образ три раза: один раз без масштабирования, один раз с расширением и один раз с сжатием.

Bitmap myBitmap(L"Spiral.png");
Rect expansionRect(80, 10, 2 * myBitmap.GetWidth(), myBitmap.GetHeight());
Rect compressionRect(210, 10, myBitmap.GetWidth() / 2, 
   myBitmap.GetHeight() / 2);

myGraphics.DrawImage(&myBitmap, 10, 10);
myGraphics.DrawImage(&myBitmap, expansionRect);
myGraphics.DrawImage(&myBitmap, compressionRect);

Предыдущий код, а также конкретный файл, Spiral.png, создал следующие выходные данные.

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

Некоторые варианты метода Graphics::DrawImage имеют параметр прямоугольник-источник, а также параметр прямоугольника назначения. Исходный прямоугольник указывает часть исходного изображения, который будет нарисован. Прямоугольник назначения указывает, где будет нарисована эта часть изображения. Если размер целевого прямоугольника отличается от размера исходного прямоугольника, изображение масштабируется в соответствии с прямоугольником назначения.

В следующем примере создается объектрастрового изображенияиз файла Runner.jpg. Весь рисунок рисуется без масштабирования (0, 0). Затем небольшая часть изображения рисуется дважды: один раз с сжатием и один раз с расширением.

Bitmap myBitmap(L"Runner.jpg"); 

// The rectangle (in myBitmap) with upper-left corner (80, 70), 
// width 80, and height 45, encloses one of the runner's hands.

// Small destination rectangle for compressed hand.
Rect destRect1(200, 10, 20, 16);

// Large destination rectangle for expanded hand.
Rect destRect2(200, 40, 200, 160);

// Draw the original image at (0, 0).
myGraphics.DrawImage(&myBitmap, 0, 0);

// Draw the compressed hand.
myGraphics.DrawImage(
   &myBitmap, destRect1, 80, 70, 80, 45, UnitPixel);

// Draw the expanded hand. 
myGraphics.DrawImage(
   &myBitmap, destRect2, 80, 70, 80, 45, UnitPixel);

На следующем рисунке показаны немасштабированные изображения и сжатые и развернутые части изображения.

снимок экрана с изображением, затем часть изображения сжата, и затем та же часть развёрнута