原始场景
我严重误解了自己的代码,这种情况是无效的。
这是我普通驾驶室的出路,所以我将尽力解释一下 我可以。
我有一个用户设置的颜色代码。示例:
int R = 255; int G = 255; int B = 255;
我有很多大图像需要检查颜色 与用户设置的颜色相对应的某些坐标集上的像素。一世 可以成功获取图像中任何像素的
byte*
,并获得 我期望的价值。我使用
BitmapData
中的Bitmap.LockBits(...)
执行此操作。我的 理解是锁定对于性能至关重要 原因。将会有很多这种情况被使用 跨非常大的图像集合,因此性能是主要 考虑。出于同样的性能原因,我试图避免将 检索由不安全字节表示为整数的像素颜色-我会 宁愿一次将我的int转换为一个字节并将其用于 可能会针对每一个像素运行数百万个像素 调用。
但是...我不知道如何获取我的用户设置的整数 转换为不安全字节(
byte*
)并将其与不安全字节进行比较 从像素中检索。
不安全字节(byte*
)是像素数据的8位指针(至少,这就是我的理解),但是我将各个颜色作为常规旧字节获取。
byte* pixel = //value here pulled from image;
pixel[2] //red value byte
pixel[1] //green value byte
pixel[0] //blue value byte
因此,我不需要将我的int
转换为不安全的字节……指针?...,而只是简单的Converter.ToByte(myInt)
。
真正的问题
但是,由于我认为这在我的情况之外仍然可能是一个有效的问题,因此我将把这一部分留给别人回答,并希望将来能帮助某人:
如何在C#中获取给定的int
并将其与“不安全字节”指针“ byte*
”进行比较?
答案 0 :(得分:1)
您只想取消引用字节指针并将其与整数进行比较。
unsafe void Main()
{
byte x = 15;
int y = 15;
Console.WriteLine(AreEqual(&x, y)); // True
}
public unsafe bool AreEqual(byte* bytePtr, int val) {
var byteVal = *bytePtr;
return byteVal == val;
}
答案 1 :(得分:0)
让我们打开一个打开的位图并处理每个像素
//Note this has several overloads, including a path to an image
//Use the proper one for yourself
Bitmap b = new Bitmap(_image);
//Lock(and Load baby)
BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat);
//Bits per pixel, obviously
byte bitsPerPixel = Image.GetPixelFormatSize(bitmap.PixelFormat);
//Gets the address of the first pixel data in the bitmap.
//This can also be thought of as the first scan line in the bitmap.
byte* scan0 = (byte*)bData.Scan0.ToPointer();
for (int i = 0; i < bData.Height; ++i)
{
for (int j = 0; j < bData.Width; ++j)
{
byte* data = scan0 + i * bData.Stride + j * bitsPerPixel / 8;
//data is a pointer to the first byte of the 3-byte color data
//Do your magic here, compare your RGB values here
byte R = *b; //Dereferencing pointer here
byte G = *(b+1);
byte B = *(b+2);
}
}
//Unlocking here is important or memoryleak
b.UnlockBits(bData);