操作 BitmapData,只有 1/3 被改变

Manipulating BitmapData, only 1/3rd gets altered

我的目标是加载 256x256 像素大小的位图,并根据实际值是否低于特定阈值为每个像素分配白色或黑色颜色值。

问题是,只有位图宽度的 1/3 具有新的像素数据,即使内部 for 语句遍历整个宽度也是如此。

unsafe
{
    BitmapData bitmapData = bitmap.LockBits(new Rectangle(0,0, 256, 256), ImageLockMode.ReadWrite, bitmap.PixelFormat);

    for (int j = 0; j < bitmapData.Height; j++)
    {
        byte* row = (byte*)bitmapData.Scan0 + (j * bitmapData.Stride);
        for (int k = 0; k < bitmapData.Width; k++)
        {
            if (row[k] <= TresholdFilter)
                row[k] = 0;
            if (row[k] > 0)
                row[k] = 255;
        }
    }
    bitmap.UnlockBits(bitmapData);
}

您的问题是您将 24bpp 的图像视为 8bpp。每个像素由 3 个字节描述,而不是一个。可以按以下方式修改代码:

unsafe
{
    BitmapData bitmapData = bitmap.LockBits(new Rectangle(0,0, 256, 256),ImageLockMode.ReadWrite, bitmap.PixelFormat);

    for (int j = 0; j < bitmapData.Height; j++)
    {
        byte* row = (byte*)bitmapData.Scan0 + (j * bitmapData.Stride);
        for (int k = 0; k < bitmapData.Width * 3; k += 3)
        {
            if (row[k] <= TresholdFilter)
            {
               row[k] = 0;
               row[k + 1] = 0;
               row[k + 2] = 0;
            }
            if (row[k] > 0)
            {
               row[k] = 255;
               row[k + 1] = 255;
               row[k + 2] = 255;
            }
        }
    }
    bitmap.UnlockBits(bitmapData);
}

只是为了确保您可以检查 row[k], k + 1 and k + 2 是否都是 below/above 和 ThresholdFilter,但您只需要在图像未灰度化的情况下进行检查。

此外,您可能应该在开始时检查图像是否实际上是 24bppRgb 格式,以避免应用程序崩溃(如果不是)。