2016-03-31 6 views
0

私のプロジェクトの前の男は、私が理解しようとするコードを書きました。私はC#ではそれほど良くはありませんが、それを保留にしようとしています。ビットマップ操作 - 画像の幅が1/4に縮小されました

次のコードは、色の値にしきい値を適用することを意図していますが、画像をコピーしてすべての画像操作がどのように機能するかを確認しようとしています。

残念ながら、私のイメージの4分の1は単に切り捨てられています。私はstrides、scan0について読んでみましたが、この動作の理由が見つかりませんでした。私は

public unsafe Bitmap AdjustThreshold(int value) 
{ 
    int maxX = _internalBitmapMemory.Width; 
    int maxY = _internalBitmapMemory.Height; 

    BitmapData bmpDataImage_1, bmpDataImage_2; 
    Bitmap newBitmap = new Bitmap(_internalBitmapMemory.Width, _internalBitmapMemory.Height, _internalBitmapMemory.PixelFormat); 

    bmpDataImage_1 = _internalBitmapMemory.LockBits(new Rectangle(0, 0, maxX, maxY), System.Drawing.Imaging.ImageLockMode.ReadOnly, _internalBitmapMemory.PixelFormat); 
    bmpDataImage_2 = newBitmap.LockBits(new Rectangle(0, 0, maxX, maxY), System.Drawing.Imaging.ImageLockMode.WriteOnly, newBitmap.PixelFormat); 

    byte* currentPtrImage_1 = (byte*)bmpDataImage_1.Scan0; 
    byte* currentPtrImage_2 = (byte*)bmpDataImage_2.Scan0; 

    int offsetImage_1 = bmpDataImage_1.Stride - maxX * 4; 
    int offsetImage_2 = bmpDataImage_2.Stride - maxX * 4; 

    // Color cNow; 

    for (int currentRow = 0; currentRow < newBitmap.Height; currentRow++) 
    { 
     for (int currentColumn = 0; currentColumn < newBitmap.Width; currentColumn++, currentPtrImage_1 += 4, currentPtrImage_2 += 4) 
     { 
      // cNow = Color.FromArgb(*(currentPtrImage_1), *(currentPtrImage_1 + 1), *(currentPtrImage_1 + 2)); 

      *(currentPtrImage_2) = *(currentPtrImage_1); 
      *(currentPtrImage_2 + 1) = (byte)(*(currentPtrImage_1 + 1)/2); 
      *(currentPtrImage_2 + 2) = *(currentPtrImage_1 + 2); 
      *(currentPtrImage_2 + 3) = *(currentPtrImage_1 + 3); 
     } 

     currentPtrImage_1 += offsetImage_1; 
     currentPtrImage_2 += offsetImage_2; 
    } 

    _internalBitmapMemory.UnlockBits(bmpDataImage_1); 
    newBitmap.UnlockBits(bmpDataImage_2); 

    return newBitmap; 
} 

に次のコード

public unsafe Bitmap AdjustThreshold(int value) 
{ 
    int maxX = _internalBitmapMemory.Width; 
    int maxY = _internalBitmapMemory.Height; 

    BitmapData bmpDataImage_1, bmpDataImage_2; 
    Bitmap newBitmap = new Bitmap(_internalBitmapMemory.Width, _internalBitmapMemory.Height, _internalBitmapMemory.PixelFormat); 

    bmpDataImage_1 = _internalBitmapMemory.LockBits(new Rectangle(0, 0, maxX, maxY), System.Drawing.Imaging.ImageLockMode.ReadOnly, _internalBitmapMemory.PixelFormat); 
    bmpDataImage_2 = newBitmap.LockBits(new Rectangle(0, 0, maxX, maxY), System.Drawing.Imaging.ImageLockMode.WriteOnly, newBitmap.PixelFormat); 

    byte* currentPtrImage_1 = (byte*)bmpDataImage_1.Scan0; 
    byte* currentPtrImage_2 = (byte*)bmpDataImage_2.Scan0; 

    int offsetImage_1 = bmpDataImage_1.Stride - maxX * 3; 
    int offsetImage_2 = bmpDataImage_2.Stride - maxX * 3; 

    // Color cNow; 

    for (int currentRow = 0; currentRow < newBitmap.Height; currentRow++) 
    { 
     for (int currentColumn = 0; currentColumn < newBitmap.Width; currentColumn++, currentPtrImage_1 += 3, currentPtrImage_2 += 3) 
     { 
      // cNow = Color.FromArgb(*(currentPtrImage_1), *(currentPtrImage_1 + 1), *(currentPtrImage_1 + 2)); 

      *(currentPtrImage_2) = *(currentPtrImage_1); 
      *(currentPtrImage_2 + 1) = *(currentPtrImage_1 + 1); 
      *(currentPtrImage_2 + 2) = *(currentPtrImage_1 + 2); 

     } 

     currentPtrImage_1 += offsetImage_1; 
     currentPtrImage_2 += offsetImage_2; 
    } 

    _internalBitmapMemory.UnlockBits(bmpDataImage_1); 
    newBitmap.UnlockBits(bmpDataImage_2); 

    return newBitmap; 
} 

を変更し、それが動作するようになりましたので、これはアルファチャンネルによって引き起こされると予想しました。

本当に混乱しているのは、前にコードが動作していて、それが私にとってうまくいかなかった理由があるか、コードが期待どおりに機能しなかったのですが、

私はこの関数に32bbpARGBイメージを渡しました。私は別の色の部署があればどうなりますか?私の理解のため、ビットマップバッファの最大値を超えるポインタのためにアクセス違反が発生します。

Bitmap myBitmap = new Bitmap(Width, Height); 

どのようなbbpが適用されますか?システム標準?

色数が違う可能性がある場合は、どうすればよいですか?すべてのビットマップの色深度を32bbpARGBに変更するだけですか?またはここに確立されている方法は何ですか?あなたの入力のための

感謝:)

答えて

1

私は一つの質問にお答えします:

Bitmap myBitmap = new Bitmap(Width, Height);

apliedされるものBBPを?システム標準?

あなたがBitmap consctructorをチェックした場合:

このコンストラクタはFormat32bppArgbのピクセルフォーマットの列挙値を持つビットマップを作成します。

フォーマットがピクセル当たり32ビットであることを指定している

。アルファ、赤、緑、青の各成分にはそれぞれ8ビットが使用されます。

+0

私はstdコンストラクタを使用する場合、それは常に32bbpargbにつながります。それは古いコンピュータで使用すると他のエラーを防ぎます。ありがとうございました。 – AllDayPiano

関連する問題