C#将int转换或比较为(不安全的)字节*

时间:2018-10-10 16:23:17

标签: c# int byte unsafe

原始场景

我严重误解了自己的代码,这种情况是无效的。

  

这是我普通驾驶室的出路,所以我将尽力解释一下   我可以。

     

我有一个用户设置的颜色代码。示例:

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*”进行比较?

2 个答案:

答案 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);