2013-09-03 3 views
0

Есть ли в нем какая-либо конкретная функция, которая может генерировать красный канал изображения для сравнения с исходным изображением?SDL Library для извлечения красного канала

+0

SDL на самом деле не является библиотекой обработки изображений. – jrok

+0

Итак, что мы можем сделать с SDL? Может ли он генерировать соответствующий красный канал или зеленый канал? – user2711681

ответ

2

Вы можете получить доступ к данным о пикселях с помощью surface->pixels и изображений Rmask с surface->format->Rmask. Посмотрите в битовые операции для извлечения данных

SDL_Surface* t; 
//Code 
Uint32* pixels = (Uint32*)t->pixels; 
int x = 10 ,y = 10; //For pixel at 10, 10 
Uint32* MyPixel = pixels + ((y-1) + t->w) + x; 

Uint32 RedOnly = *MyPixel & t->format->Rmask; 

Примечание: Сделана глупая ошибка и забыли у должно быть у-1.

Uint32* MyPixel = pixels + ((y-1) + t->w) + x работает так:

пикселей указатель, указывающий на первый элемент в массиве данных uint32. (32 бит int). Если я делаю пиксели + 1, то это говорит о том, что 1 Uint32 размер байт памяти по дороге. Если я хочу пиксель 10,10 в 2D системе координат, нам нужно преобразовать его в одномерное линейное значение. SDL_Surface пикселей по горизонтали и линейной так далее:

1,2,3,4,5 
6,7,8,9,10 

Так ((y-1) * t->w) + x получит целое значение для пикселя в форме lineaer. Для пикселя при 2,2, например, в случае выше, ширина равна 5, становится ((2-1)*5)+2), которая равна 7. Затем мы берем пиксели и смещаем их на 7 (pixels+7), который является адресом для 7-битных Uint32 (7 * 32 бит) из начала массива.

Uint32 RedOnly = *MyPixel & t->format->Rmask работает следующим образом: Позвольте мне предположить некоторый случайный Uint32 для вашего пикселя (0xFF41A401), допустим, формат изображения ARGB. Это означает, что ваш Rmask равен 0x00FF0000.
В бинарном тех

*MyPixel = 1111 1111 0100 0001 1010 0100 0000 0001 
Rmask = 0000 0000 1111 1111 0000 0000 0000 0000 

//And a bitwise & operation will result in: 

RedOnly = 0000 0000 0100 0001 0000 0000 0000 0000 

Таким образом, только красные значения остаются, так что вы «стереть» все синяя/зеленый информации.

+0

Что такое t-> w? Я нашел эту функцию подходящей в этом случае http://wiki.libsdl.org/SDL_CreateRGBSurface? – user2711681

+1

t-> w является 'surface-> w' или шириной в пиксельном подсчете поверхности. 'surface-> h' - высота, но не нужна для этого. '(y + t-> w) + x превращает координату x, y в линейное значение пикселя. – Chemistpp

+0

Итак, я должен запустить цикл for, но до этого я должен получить значение w и h, соответственно, обряда? Но изначально у вас есть все пиксели в этом переменном обряде? Тогда то, что вы здесь делаете, - это не ясные пиксели + (y + t-> w) + x; – user2711681

Смежные вопросы