首页 > 解决方案 > C#将单色图像(1bpp)转换为灰度图像(8bpp)

问题描述

我尝试将图像从 1bpp 转换为 8bpp:

    BitmapData dstData = dstImage.LockBits(
    new Rectangle(0, 0, dstImage.Width, dstImage.Height),
    ImageLockMode.ReadWrite, dstImage.PixelFormat);

    try
    {
    int width = srcData.Width;
    int height = srcData.Height;

    unsafe
    {
        byte* srcBase = (byte*)srcData.Scan0.ToPointer();
        byte* dstBase = (byte*)dstData.Scan0.ToPointer();
        int srcStride = srcData.Stride;
        int dstStride = dstData.Stride;

        for (int y = 0; y < height; y++)
        {
            ushort* src = (ushort*)(srcBase + y * srcStride);
            ushort* dst = (ushort*)(dstBase + y * dstStride);

            for (int x = 0; x < width; x++)
            {
                byte mask = (byte)(0x80 >> (x & 0x07));
                *dst = ((*src) & mask) != 0 ? (ushort)255 : (ushort)0;
                if (mask == 1)
                {
                    src++;
                }

                dst++;
            }
        }                   
    }
}
finally
{
    dstImage.UnlockBits(dstData);
}

新图像不是预期的灰度图像。设置像素值的算法似乎是错误的。

标签: c#

解决方案


var src = srcBase + y * srcStride; var dst = dstBase + y * dstStride;

                    for (int x = 0; x < width; x++, dst++)
                    {
                        byte mask = (byte)(0x80 >> (x & 0x07));
                        *dst = ((*src) & mask) != 0 ? (byte)255 : (byte)0;
                        if (mask == 1)
                        {
                            src++;
                        }
                    }

推荐阅读