2016-07-02 8 views
0

私は安全ではないコードとポインタを使用してプロセス全体を高速化するクロッピングメソッドを自分自身で実装しようとしています。C#画像からの領域をカット

private unsafe void Cut(Bitmap bmp, Rectangle r) { 

Bitmap result = new Bitmap(r.Width, r.Height, bmp.PixelFormat); 
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat); 
BitmapData bmData2 = result.LockBits(new Rectangle(0, 0, result.Width, result.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, result.PixelFormat); 
IntPtr scan0 = bmData.Scan0; 
IntPtr scan02 = bmData2.Scan0; 
int stride = bmData.Stride; 
int stride2 = bmData2.Stride; 


int x = r.X; 
int y = r.Y; 
int width = r.Width; 
int height = r.Height; 

for (; y < height; y++) { 
byte * p = (byte *) scan0.ToPointer(); 
p += y * stride; 
byte * p2 = (byte *) scan02.ToPointer(); 
p2 += y * stride2; 

for (; x < width; x++) { 

    p2[0] = p[0]; 
    p2[1] = p[1]; 
    p2[2] = p[2]; 
    p2[3]=p[3]; 
    p += 4; 
    p2 += 4; 

} 

} 

result.Save("a.png"); 

}

そして、このメソッドの呼び出し::

 Bitmap b = (Bitmap)Bitmap.FromFile(@"C:\Users\itapi\Desktop\1.png"); 
     Rectangle r = new Rectangle(200, 500, 300, 450); 
     Cut(b, r); 

私は、コードを実行すると、私はちょうどその結果として、黒の四角形を取得

これは私のコードです。私はインライン画像からコピーしたいピクセルではありません。

上記の例からの画像は、私がwrong..i'll任意の助けに感謝やっているかわからないんだけど32bpprgb形式 です。

ありがとうございました。

答えて

0

結果として、 "System.Drawing.Image.ImageLockMode.ReadOnly"を選択しました。私はあなたがReadWriteまたはWriteOnlyを望んでいると思います。

私がデバッガを通過したとき、次のステートメント:for(; y < height; y ++)の条件が、かなり大きなイメージですぐに失敗しました。あなたのループロジックは、ラインを実行するために間違っています...デバッガを使用してください:

EDIT私はデバッガを介してそれを実行し、YとXのロジックが間違っています。私はYのロジックを素早く修正して、それも作った。あなたは、正しいクリッピングポイントを得るために、Xに似た何かをしなければならないでしょう。

 int x = r.X; 
     int y = r.Y; 
     int width = r.Width; 
     int height = r.Height; 
     int newY = 0; 
     for (y = r.Y; y < height+r.Y; y++) //For each line in the old image 
     { 
      byte* p = (byte*)scan0.ToPointer(); 
      p += y * stride; 
      byte* p2 = (byte*)scan02.ToPointer(); 
      p2 += newY * stride2; 

      for (x=r.X; x < width+r.X; x++) 
      { 

       p2[0] = p[0]; 
       p2[1] = p[1]; 
       p2[2] = p[2]; 
       p2[3] = p[3]; 
       p += 4; 
       p2 += 4; 

      } 
      newY++; 
     } 

     result.Save("\\a.png"); 
+0

は、あなたはそれが:)まだ問題は解決しませんでしたright..but気にいら指さ: それはトリミングして、ファイルを保存し、これを試してみてください。私は同じ黒いイメージを見る。 – Slashy

+0

for(; y CharlesW

+0

あなたのコードにできるだけ小さな変更を加えました。私はあなたのためにそれを書き直さなかった、ちょうどそれがYのために働かせた、それは間違った場所でXを作ったが、あなたはそれを理解することができる....... – CharlesW

関連する問題