Обрезать растровое изображение и при необходимости увеличить размер - PullRequest
2 голосов
/ 08 декабря 2011

Я хочу обрезать растровое изображение с помощью этой функции, но растровое изображение может быть меньше, чем область обрезки, поэтому я хочу увеличить растровое изображение в этом случае.

В качестве примера у меня есть растровое изображение размером 200x250, и если я использую метод CropBitmap с 250x250, я получаю ошибку нехватки памяти. Он должен вернуть растровое изображение с размером 250x250, где недостающие левые 50px заполнены белым.

Как мне этого добиться?

public Bitmap CropBitmap(Bitmap bitmap, int cropX, int cropY, int cropWidth, int cropHeight)
{
    var rect = new Rectangle(cropX, cropY, cropWidth, cropHeight);

    if(bitmap.Width < cropWidth || bitmap.Height < cropHeight)
    {
        // what now?
    }

    return bitmap.Clone(rect, bitmap.PixelFormat);
}

1 Ответ

3 голосов
/ 08 декабря 2011

Создайте новое растровое изображение с соответствующим размером. Затем получите System.Drawing.Graphics и используйте его, чтобы создать белую область и вставить исходное изображение. Как то так:

    if (bitmap.Width < cropWidth && bitmap.Height < cropHeight)
    {
        Bitmap newImage = new Bitmap(cropWidth, cropHeight, bitmap.PixelFormat);
        using (Graphics g = Graphics.FromImage(newImage))
        {
            // fill target image with white color
            g.FillRectangle(Brushes.White, 0, 0, cropWidth, cropHeight);

            // place source image inside the target image
            var dstX = cropWidth - bitmap.Width;
            var dstY = cropHeight - bitmap.Height;
            g.DrawImage(bitmap, dstX, dstY);
        }
        return newImage;
    }

Обратите внимание, что я заменил || во внешнем выражении if на &&. Чтобы заставить его работать с ||, вы должны вычислить исходную область и использовать другую перегрузку Graphics.DrawImage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...