2012-04-04 14 views
3

ユーザは、カットアンドペースト操作のためにイメージの一部を選択します。新しいビットマップを作成し、選択した部分を新しいイメージに貼り付け、ソース配列を消去して古いイメージに貼り付けます。動作しますが、少なくとも半分はハングアップして保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。マーシャル。コピー/アンロックビットがハングする

どのような考えや助け?

public BitmapSource CutToNew(double left, double top, double width, double height, double pageWidth, double pageHeight) 
{ 
    var destBmp = new Bitmap((int)pageWidth, (int)pageHeight); 
    var g = Graphics.FromImage(destBmp); 
    g.FillRectangle(new SolidBrush(Color.White), 0, 0, 
     (int)pageHeight, (int)pageWidth); 
    g.Dispose(); 

    var croppedArea = new Rectangle((int)left, (int)top, (int)width, (int)height); 
    BitmapData croppedSource = _bitmapImage.LockBits(croppedArea, 
      ImageLockMode.ReadWrite, BitmapImage.PixelFormat); 
    var croppedDestArea = new Rectangle((int)left, (int)top, (int)width, (int)height); 
    BitmapData croppedDest = destBmp.LockBits(croppedDestArea, 
      ImageLockMode.WriteOnly, BitmapImage.PixelFormat); 

    // Create data array to hold bmpSource pixel data 
    int stride = croppedSource.Stride; 
    int numBytes = stride * (int)height; 
    var srcData = new byte[numBytes]; 
    var destData = new byte[numBytes]; 

    Marshal.Copy(croppedSource.Scan0, srcData, 0, numBytes); 
    //Tried creating a separate array in case that helped. 
    Array.Copy(srcData, destData, srcData.Length); 
    //Often hangs here with Attempted to read or write protected memory. 
    Marshal.Copy(destData, 0, croppedDest.Scan0, numBytes); 

    destBmp.UnlockBits(croppedDest); 
    var retVal = new DocAppImage {BitmapImage = destBmp}; 
    destBmp.Dispose(); 

    //Blank the source area 
    for (int y = 0; y < srcData.Length; y++) 
     srcData[y] = 0xFF; 

    Marshal.Copy(srcData, 0, croppedSource.Scan0, numBytes); 
    _bitmapImage.UnlockBits(croppedSource); 

    return retVal.bmpSource; 
} 

private Bitmap _bitmapImage; 
public Bitmap BitmapImage 
{ 
    get 
    { 
     if (_bitmapImage != null) 
      return _bitmapImage; 

     if (FileImage != null) 
     { 
      var stream = new MemoryStream(FileImage); //Fileimage=TIFF read from file. 
      _bitmapImage = new Bitmap(stream); 
      return _bitmapImage; 
     } 
     return null; 
    } 
    set 
    { 
     if (value != null) 
     { 

      ImageCodecInfo codecInfo = GetImageCodecInfo("TIFF"); 
      ... implementation to set the bitmap image. 
+0

'VARのdestBmp =新しいビットマップ((int型)ページ幅、(int型)のpageHeight);'あなたがこのオブジェクトの作成時に送信先PixelFormatプロパティを設定しようとしましたか? –

+0

いいえ、私はそれを試すことができます。 – strattonn

+0

ブライアン、あなたのコメントを答えにして、私はそれを正しいものとしてマークし、自分がしなければならないことについてコメントします。 – strattonn

答えて

1

あなたは新しいオブジェクトを作成するときに、あなたのPixelFormatを指定しようとする場合があります。例えば

var destBmp = new Bitmap((int)pageWidth, (int)pageHeight, PixelFormat.Format24bppRgb); 
+0

はい。ビットマップデータをある画像から別の画像にコピーして、同じピクセルフォーマットでない場合、非常に悪いことが起こる可能性があります。 –

+0

ここでのキーは私のソースイメージが1ビットインデックスされていますが、destBmpはデフォルトで24bbpになります(グラフィックスはインデックス付きイメージに書き込めませんでした)。だから私は最初のイメージを空白にするために0xFFの配列を描きました。それはすべて美しく動作しています。ありがとう。 – strattonn

関連する問題