Я пытаюсь поймать 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 должен быть доступен для чтения.
Но я только что прочитал этот же адрес некоторое время назад!
Каковы фактические значения каналов, которые вы видите? –
Несколько образцов: 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
Привет, Джош, пожалуйста, проверьте мой вопрос. Я еще немного проверил несколько тестов. Tks! – RickON