对于上一篇文章感到抱歉。我现在在这里显示完整的代码。 我需要知道bitmap.Width和bitmap.Height - 1是什么以及bitmap.Scan0。 我在互联网上搜索,但它没有给出任何完整的解释。 我将非常感谢能够简要解释整件事的人。谢谢。
public static double[][] GetRgbProjections(Bitmap bitmap)
{
var width = bitmap.Width - 1;
var height = bitmap.Height - 1;
var horizontalProjection = new double[width];
var verticalProjection = new double[height];
var bitmapData1 = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe
{
var imagePointer1 = (byte*)bitmapData1.Scan0;
for (var y = 0; y < height; y++)
{
for (var x = 0; x < width; x++)
{
var blu = imagePointer1[0];
var green = imagePointer1[1];
var red = imagePointer1[2];
int luminosity = (byte)(((0.2126 * red) + (0.7152 * green)) + (0.0722 * blu));
horizontalProjection[x] += luminosity;
verticalProjection[y] += luminosity;
imagePointer1 += 4;
}
imagePointer1 += bitmapData1.Stride - (bitmapData1.Width * 4);
}
}
MaximizeScale(ref horizontalProjection, height);
MaximizeScale(ref verticalProjection, width);
var projections =
new[]
{
horizontalProjection,
verticalProjection
};
bitmap.UnlockBits(bitmapData1);
return projections;
}
答案 0 :(得分:1)
显然它会遍历RGBA位图的每个像素,并计算每个像素的亮度,它在两个阵列中的轨迹,每条水平线的亮度和每条垂直线的亮度。
除非我弄错了,否则-1应该不存在。当你有一个100x100的位图时,你想要创建一个包含100个元素的数组,而不是一个包含99个元素(width-1)的数组,因为你想要跟踪每条水平线和垂直线。