裁剪位图并根据需要扩展大小

时间:2011-12-08 13:38:19

标签: c# image-processing

我想使用此函数裁剪位图,但位图可能比裁剪区域小,所以我想在这种情况下让位图更大。

例如,我有一个200x250的位图,如果我使用250x250的CropBitmap方法,则会出现内存不足错误。它应该返回一个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 个答案:

答案 0 :(得分:3)

创建具有适当大小的新位图。然后获取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替换为&&。要使其与||一起使用,您必须计算源区域并使用another overload of Graphics.DrawImage