2011-12-08 9 views
2

この関数でビットマップをトリミングしたいのですが、ビットマップがトリミング領域より小さくなる可能性がありますので、その場合はビットマップを大きくしたいと考えています。ビットマップをトリミングし、必要に応じてサイズを拡大してください

例として、200x250のビットマップがあり、250x250のCropBitmapメソッドを使用すると、メモリ不足エラーが発生します。欠落した左の50ピクセルが白で塗りつぶされた250x250のビットマップを返します。

どうすれば実現できますか?

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); 
} 
+0

これはサイズ変更の必要性に役立ちます:http://snippets.dzone.com/posts/show/4336 – ThePower

答えて

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

+0

私は 'dstX = cropWidth - bitmap.Width'を 'dstX = bitmap.Width - cropWidth'に変更しました。 (そしてdstYと同じです) – Marc

関連する問題