Проблемы с Lockbits и GetPixels

Я пытаюсь получить все пиксели изображения, используя Bitmap и GetPixels. Теперь я знаю, что это очень неэффективно, поэтому я изучил LockBits. Я успешно сделал то, что, как я думаю, блокирует биты, но я не могу получить все пиксели. Мой код до сих пор...

//Creates Rectangle for holding picture
Rectangle bmpRec = new Rectangle(0, 0, bmp.Width, bmp.Height); 

BitmapData bmpData = bmp.LockBits(bmpRec, ImageLockMode.ReadWrite, bmp.PixelFormat); 

IntPtr Pointer = bmpData.Scan0; //Scans the first line of data

int DataBytes = Math.Abs(bmpData.Stride) * bmp.Height; //Gets array size

byte[] rgbValues = new byte[DataBytes]; //Creates array
string Pix = " ";
Marshal.Copy(Pointer, rgbValues, 0, DataBytes); //Copies of out memory

bmp.UnlockBits(bmpData);

for (int p = 0; p < DataBytes; p++)
{
     Pix += " " + rgbValues[p];
}

Я хотел бы использовать Lockbits, так как это лучший способ получить пиксели. Любая помощь?

Спасибо.


person Rynoh97    schedule 05.05.2014    source источник
comment
Не знаю, о чем вы спрашиваете... Просто посмотрите на остальную часть LockBits, который вы скопировали в сообщение о том, как получить значения пикселей...   -  person Alexei Levenkov    schedule 05.05.2014
comment
@AlexeiLevenkov У меня проблема с эффективным получением каждого значения каждого пикселя. Действительно ли мои LockBits работают правильно? и как мне получить каждый пиксель? Любая помощь, пожалуйста?   -  person Rynoh97    schedule 05.05.2014
comment
Я не вижу никаких попыток получить цвета из буфера - поэтому трудно понять, где у вас проблема... Код выглядит нормально, но нельзя сказать наверняка, так как Pixels не определено. Сначала начните с простого формата (16bpp или 32bpp), так как проще обрабатывать пиксели, которые напрямую отображаются на short или int.   -  person Alexei Levenkov    schedule 05.05.2014
comment
@AlexeiLevenkov Хорошо, теперь я могу получить пиксели, но когда я использую GetPixels, я получаю числа, отличные от тех, что я получаю с помощью LockBits? Это неправильный формат моего пикселя? э.и. bmp.GetPixels(i,j) Цвет [A=255, R=15, G=18, B=23] LockBits 23 18 15... Я тут что-то не так делаю. (Я обновил свой код для получения дополнительной помощи.   -  person Rynoh97    schedule 05.05.2014
comment
Выглядит хорошо. Скорее всего, ваше растровое изображение имеет разрешение 24 бита на пиксель (RGB, без A)... Пиксель всегда имеет разрешение 32 бита на пиксель (ARGB), при этом значение A по умолчанию равно 255, если оно не используется в растровом изображении, поэтому вы просто видите значения RGB.   -  person Alexei Levenkov    schedule 05.05.2014
comment
@AlexeiLevenkov Я думаю, что моя проблема сейчас в том, что мои пиксели отображаются в правильном порядке ... Также я установил свой формат пикселей на PixelFormat Pixels = PixelFormat.Format32bppArgb;, и все же мои числа не совпадают? Это мой GetPixels неверен?   -  person Rynoh97    schedule 05.05.2014
comment
en.wikipedia.org/wiki/BMP_file_format 24 бита на пиксель — конкретно в порядке (синий, зеленый и красный, 8 бит на каждый образец)   -  person Alexei Levenkov    schedule 05.05.2014


Ответы (1)


При доступе к данным непосредственно из LockBits порядок хранения — B-G-R, а не RGB... поэтому вы получаете значения в обратном порядке.

person Eric    schedule 12.01.2017