从位图生成alpha通道的掩码

本文关键字:通道 掩码 alpha 位图 | 更新日期: 2023-09-27 18:06:21

我需要从System.Drawing.Bitmap的alpha通道生成一个灰度位图。

我尝试使用GetPixel和SetPixel,但这不适用于像素格式为Format16bppGrayScale的位图。

例如,将我的灰度图像中的所有像素设置为黑色。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);
    }
}

从位图生成alpha通道的掩码

可以使用BitmapData。BitmapData = bitmap.LockBits(…)然后使用use byte* pDataIn = (byte*) bitmapdata . 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);
            }