C # конвертировать или сравнивать int с (небезопасным) байтом * - PullRequest
0 голосов
/ 10 октября 2018

Оригинальный сценарий

Я неправильно понял мой собственный код, и этот сценарий недействителен.

Это выход из моей обычной рубки, поэтому яЯ собираюсь объяснить, как могу.

У меня установлен код цвета.Пример:

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 s в небезопасные байты ... указатели? ..., просто Converter.ToByte(myInt).


Реальный вопрос

Но так как я думаю, что это все еще возможно действительный вопрос вне моего сценария, я собираюсь оставить эту часть для кого-тоответить и, надеюсь, помочь кому-нибудь в будущем:

Как вы берете любой заданный int в C # и сравниваете его с указателем «небезопасный байт» byte*?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Давайте откроем растровое изображение и обработаем каждый пиксель

//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);
0 голосов
/ 10 октября 2018

Вы можете просто разыменовать байтовый указатель и сравнить его с целым числом.

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;
}
...