2014-01-06 2 views
0

Я пытаюсь поймать R, G и B из некоторых пикселей на игровой сцене. Для этого я создал растровое изображение в черном & Белый.Получение неожиданных пикселей от сырого изображения

Это изображение сначала загружается на Init(), после чего каждое управление sprite проверяется, потому что это действительно доступное место.

Дело в том, что я получаю неожиданные данные в R, G и B. Я пробовал два растровых изображения (8 бит и 24 бит). Оба они имеют только черно-белые пиксели. Но r, g и b продолжают говорить мне, что эти пиксели - это любой другой цвет. Я думаю, что «no_of_channels» должен быть 3, так как я не работаю с альфа-каналом, правильно? Есть идеи?

App.h

// background mask 
UIImage* bgmask; 
CGImageRef aCGImageRef; 
CFDataRef rawData; 
UInt8 * bgmaskbuf; 

Init():

// BG Mask 
    bgmask = [UIImage imageNamed:@"mask.bmp"]; 
    aCGImageRef = bgmask.CGImage; 

    rawData = CGDataProviderCopyData(CGImageGetDataProvider(aCGImageRef)); 
    bgmaskbuf = (UInt8 *) CFDataGetBytePtr(rawData); 

Метод проверки данных пикселя:

-(BOOL) checkPixel: (CGFloat)x : (CGFloat)y{ 

BOOL result = FALSE; 


//int length = CFDataGetLength(rawData); 

//for(int i=0; i<length; i+=3) 
//{ 
// int r = bgmaskbuf[i]; 
// int g = bgmaskbuf[i+1]; 
// int b = bgmaskbuf[i+2]; 

// NSLog(@"Ptr: %d, R: %d, G: %d, B: %d", i, r, g, b); 
//} 


int no_of_channels = 3; 
int image_width = SCREEN_WIDTH(); 

unsigned long row_stride = image_width * no_of_channels; // 960 bytes in this case 
unsigned long x_offset = x * no_of_channels; 

/* assuming RGB byte order (as opposed to BGR) */ 
row_stride * (int)y + x_offset 
int r = bgmaskbuf[next_pixel]; 
int g = bgmaskbuf[next_pixel + 1]; 
int b = bgmaskbuf[next_pixel + 2]; 
NSLog(@"Ptr: %d, R: %d, G: %d, B: %d",next_pixel r, g, b); 

if((r==0)&&(g==0)&&(b==0)){ 
    result = TRUE; 
} 

    return result; 
} 

Как это исправить? Спасибо.

После этого вопрос:

Вот что я сделал, чтобы попытаться решить эту проблему:

При проверке пиксельной я стараюсь работать каждый пиксель внутри:

int length = CFDataGetLength(rawData); 

for(int i=0; i<length; i+=3) 
{ 
    int r = bgmaskbuf[i]; 
    int g = bgmaskbuf[i+1]; 
    int b = bgmaskbuf[i+2]; 

    NSLog(@"Ptr: %d, R: %d, G: %d, B: %d", i, r, g, b); 
} 

длина 786432, что имеет смысл (1024 * 768 пикселей). Я могу видеть/читать все пиксели, всего 2359296 байт (R + G + B).

Теперь, что странно, что при работе с сенсорным и движением пользователя индекс данных, такой как 793941, дает мне EXC_BAD_ACCESS по адресу 0x13200555.

Это происходит, когда я пытаюсь читать это нравится:

row_stride * (int)y + x_offset 
int r = bgmaskbuf[next_pixel]; 
int g = bgmaskbuf[next_pixel + 1]; 
int b = bgmaskbuf[next_pixel + 2]; 

bgmaskbuf начинается 0x13240000.

Итак, диапазон адресов от 0x13240000 до 0x13480000 должен быть доступен для чтения.

Но я только что прочитал этот же адрес некоторое время назад!

+0

Каковы фактические значения каналов, которые вы видите? –

+0

Несколько образцов: 2014-01-06 07: 25: 26.190 цвет [3022: 70b] R: 160, G: 182, B: 0 2014-01-06 07: 25: 26.244 цвет [3022: 70b] R : 80, G: 111, B: 105 2014-01-06 07: 25: 26.247 цвет [3022: 70b] R: 67, G: 84, B: 114 2014-01-06 07: 25: 26.256 цвет [3022: 70b] R: 32, G: 109, B: 97 2014-01-06 07: 25: 26.298 цвет [3022: 70b] R: 116, G: 104, B: 0 2014-01-06 07: 25: 26.300 color [3022: 70b] R: 116, G: 67, B: 111 – RickON

+0

Привет, Джош, пожалуйста, проверьте мой вопрос. Я еще немного проверил несколько тестов. Tks! – RickON

ответ

0

Что действительно работает для меня:

  • Сохраненный растровое изображение 1 бит только (лучший и самый простой способ сделать это Ms Paint, я не мог найти Mac App).
  • Сгенерированная маска действительно была повернута на 180 градусов от изображения на экране.

Для этого я использовал только 1 канал:

-(BOOL) checkPixel: (CGFloat)x : (CGFloat)y{ 

BOOL result = FALSE; 

int no_of_channels = 1; 
int image_width = SCREEN_WIDTH(); 

unsigned long row_stride = image_width * no_of_channels; // 960 bytes in this case 
unsigned long x_offset = x * no_of_channels; 


row_stride * (int)y + x_offset 
int pixie = bgmaskbuf[next_pixel]; 

if(pixie==0)){ 
    result = TRUE; 
} 

Вместо кода вращающейся маски, я думал, что для редактирования изображений проще =)

Благодаря вам всем!

0

Вам нужно будет проверить некоторые значения. Шаг строки может фактически не быть шириной изображения и количеством каналов. Они любят заполнять строки, чтобы держать их на границах. Вы должны иметь возможность получить эту информацию с изображения. Чтобы проверить, можно ли проверить, правильно ли работает checkpixel в верхней/нижней строке (некоторые изображения также находятся в перевернутом состоянии), чтобы проверить правильность значений.

+0

Привет, Fade! Я вижу вашу мысль! И действительно, изображение было перевернуто. Я сделал еще несколько тестов. Не могли бы вы еще раз проверить мой вопрос? Там есть дополнительная информация. Tks! – RickON

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