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


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

Метод DrawImage класса Graphics позволяет рисовать и размещать векторные и растровые изображения. Метод DrawImage перегружен, поэтому он поддерживает различные варианты передачи аргументов.

Варианты DrawImage

Один из вариантов метода DrawImage принимает объекты Bitmap и Rectangle. Прямоугольник задает область, в которой должно быть нарисовано изображение. Если размер прямоугольника назначения отличается от размеров исходного изображения, изображение масштабируется, чтобы соответствовать прямоугольнику назначения. В приведенном ниже примере кода демонстрируется три способа рисования одного изображения: рисование без масштабирования, рисование с увеличением и рисование со сжатием.

        Dim myBitmap As New Bitmap("Spiral.png")

        Dim expansionRectangle As New Rectangle(135, 10, _
           myBitmap.Width, myBitmap.Height)

        Dim compressionRectangle As New Rectangle(300, 10, _
           CType(myBitmap.Width / 2, Integer), CType(myBitmap.Height / 2, Integer))

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

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);

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

Масштабирование

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

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

        Dim myBitmap As New Bitmap("Runner.jpg")

        ' One hand of the runner
        Dim sourceRectangle As New Rectangle(80, 70, 80, 45)

        ' Compressed hand
        Dim destRectangle1 As New Rectangle(200, 10, 20, 16)

        ' Expanded hand
        Dim destRectangle2 As New Rectangle(200, 40, 200, 160)

        ' Draw the original image at (0, 0).
        myGraphics.DrawImage(myBitmap, 0, 0)

        ' Draw the compressed hand.
        myGraphics.DrawImage( _
           myBitmap, destRectangle1, sourceRectangle, GraphicsUnit.Pixel)

        ' Draw the expanded hand. 
        myGraphics.DrawImage( _
           myBitmap, destRectangle2, sourceRectangle, GraphicsUnit.Pixel)

Bitmap myBitmap = new Bitmap("Runner.jpg");

// One hand of the runner
Rectangle sourceRectangle = new Rectangle(80, 70, 80, 45);

// Compressed hand
Rectangle destRectangle1 = new Rectangle(200, 10, 20, 16);

// Expanded hand
Rectangle destRectangle2 = new Rectangle(200, 40, 200, 160);

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

// Draw the compressed hand.
myGraphics.DrawImage(
   myBitmap, destRectangle1, sourceRectangle, GraphicsUnit.Pixel);

// Draw the expanded hand. 
myGraphics.DrawImage(
   myBitmap, destRectangle2, sourceRectangle, GraphicsUnit.Pixel);

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

Обрезка и масштабирование

См. также

Другие ресурсы

Работа с растровыми и векторными изображениями с использованием классов Image, Bitmap и Metafile

Работа с растровыми и векторными изображениями