操作 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 格式,以避免应用程序崩溃(如果不是)。
我的目标是加载 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 格式,以避免应用程序崩溃(如果不是)。