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


Сведения об обрезке и масштабировании изображений GDI+

Для рисования и размещения изображений можно использовать метод DrawImage класса Graphics . DrawImage — это перегруженный метод, поэтому существует несколько способов предоставления ему аргументов. Один из вариантов метода Graphics::D rawImage получает адрес объекта Image и ссылку на объект 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::D rawImage имеют параметр source-rectangle и параметр destination-rectangle. Исходный прямоугольник указывает часть исходного изображения, которая будет нарисована. Прямоугольник назначения указывает, где будет отрисована эта часть изображения. Если размер прямоугольника назначения отличается от размера исходного прямоугольника, изображение масштабируется в соответствии с прямоугольником назначения.

В следующем примере создается объект Bitmap из файла 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);

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

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