1

System.Drawing.Bitmap のアルファ チャネルからグレー スケール ビットマップを生成する必要があります。

GetPixel と SetPixel を使用してみましたが、これは Format16bppGrayScale の PixelFormat のビットマップでは機能しません。

たとえば、グレースケール イメージのすべてのピクセルを黒に設定します。SetPixel は例外をスローします。

var bitmap = new Bitmap(16, 16, PixelFormat.Format16bppGrayScale); 
for (int x = 0; x < bitmap.Width; x++)
{
    for (int y = 0; y < bitmap.Height; y++)
    {
       bitmap.SetPixel(x,y, Color.Black);
    }
}
4

1 に答える 1

1

BitmapData bitmapDataIn = bitmap.LockBits(... ) を使用できます。次に use byte* pDataIn = (byte*)bitmapDataIn.Scan0; を使用します。生のビットマップ データへのポインタを取得します。

これは32ビットのビットマップデータですが、

pDataIn[y * iStrideSize + x * 4 + 0] //Blue
pDataIn[y * iStrideSize + x * 4 + 1] //Greed
pDataIn[y * iStrideSize + x * 4 + 2] //Red 
pDataIn[y * iStrideSize + x * 4 + 3] //Alpha

ポインターでピクセル値を変更または読み取ることができます

これは私のコードのコピペです。

unsafe
            {
                byte* pDataIn = (byte*)bitmapDataIn.Scan0;
                int iStrideSize = bitmapDataIn.Stride; //one row size in bytes, iWidth * 4
                int y, x;
                byte B, G, R, A;

                for (y = 0; y < iHeight; y++)
                {
                    for (x = 0; x < iWidth; x++)
                    {
                        B = pDataIn[y * iStrideSize + x * 4 + 0];
                        G = pDataIn[y * iStrideSize + x * 4 + 1];
                        R = pDataIn[y * iStrideSize + x * 4 + 2];
                        A = pDataIn[y * iStrideSize + x * 4 + 3];

                    }
                }


                bitmap.UnlockBits(bitmapDataIn);
            }
于 2013-03-28T12:02:18.190 に答える