【问题标题】:Manipulating BitmapData, only 1/3rd gets altered操作 BitmapData,只有 1/3 被改变
【发布时间】:2017-08-11 10:26:29
【问题描述】:

我的目标是加载我的 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);
}

【问题讨论】:

  • TresholdFilter 的值是多少?
  • 它是一个 Int32,范围为 0-255
  • 有可能,在某些情况下,您的row[k] 中仍保留初始值?您是否尝试过使用其他图片?
  • 看起来你的位图是 rgb,所以那里没有“白色”像素,当像素的所有三个颜色部分都是 255 时是白色的。
  • bitmap.PixelFormat 的值是多少? Format24bppRgb 有任何机会吗?

标签: c# .net bitmap system.drawing


【解决方案1】:

您的问题是您将 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 是否都低于/高于ThresholdFilter,但只有在图像未灰度化的情况下才需要检查。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多