【问题标题】:Generate a mask of the alpha channel from a bitmap从位图生成 Alpha 通道的蒙版
【发布时间】:2013-03-28 20:02:18
【问题描述】:

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

我尝试使用 GetPixel 和 SetPixel,但这不适用于 PixelFormat 为 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);
    }
}

【问题讨论】:

  • 您能否展示您的代码并指出哪些部分不适用于 16bppGrayScale 图像?

标签: c# .net gdi+


【解决方案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);
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2011-07-03
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多