2012-02-20 2 views
0

Я прочитал этот учебник http://tipsandtricks.runicsoft.com/Cpp/BitmapTutorial.html о растровом изображении, и это действительно помогло. Мне нужно прочитать целочисленные значения цвета из элементов матрицы пикселей. Как это сделать? Ok Heres код для ввода данных в массив RgBЗагрузка значений цвета из пиксельной матрицы

BYTE* ConvertBMPToRGBBuffer (BYTE* Buffer, int width, int height) 
{ 

if ((NULL == Buffer) || (width == 0) || (height == 0)) 
    return NULL; 

// find the number of padding bytes 

int padding = 0; 
int scanlinebytes = width * 3; 
while ((scanlinebytes + padding) % 4 != 0)  // DWORD = 4 bytes 
    padding++; 
// get the padded scanline width 
int psw = scanlinebytes + padding; 

// create new buffer 
BYTE* newbuf = new BYTE[width*height*3]; 

// now we loop trough all bytes of the original buffer, 
// swap the R and B bytes and the scanlines 
long bufpos = 0; 
long newpos = 0; 
for (int y = 0; y < height; y++) 
    for (int x = 0; x < 3 * width; x+=3) 
    { 
     newpos = y * 3 * width + x;  
     bufpos = (height - y - 1) * psw + x; 

     newbuf[newpos] = Buffer[bufpos + 2];  
     newbuf[newpos + 1] = Buffer[bufpos+1]; 
     newbuf[newpos + 2] = Buffer[bufpos];  
    } 

return newbuf; 
    } 
+0

Чувак, Если вы хотите, чтобы люди помогали вам здесь, вы должны предоставить код, который у вас есть, и не ожидайте, что люди сделают для вас всю работу. – guitarflow

+0

Не хотите добавить метки 'gdi'? Может быть, предоставить какой-то код, показать свое усилие, то, что вы пробовали ... может быть, вы хотите задать вопрос, который будет менее абстрактным, чем * «Как это сделать?» * ... – LihO

+0

И каков ваш вопрос сейчас? Как получить одно значение для красного, зеленого и синего? – guitarflow

ответ

2

Похоже, ваше изображение в RGB чередованием формате. Чтобы получить пиксель в (x, y), просто проиндексируйте массив в этом месте. Это было бы проще всего, если ваш буфер указал на тип структуры. Что-то вроде:

typedef struct RGBPixel { 
    BYTE red; 
    BYTE green; 
    BYTE blue; 
} RGBPixel; 

Тогда вы могли бы сделать что-то вроде этого:

RGBPixel* pixels = (RGBPixel*)newbuf; 

Чтобы получить пиксель в точке (х, у), вы могли бы сделать это:

RGBPixel aPixel = pixels [ y * width + x ];