iPhone - UIImage imageWithData возвращается ноль - PullRequest
2 голосов
/ 27 февраля 2011

Мне нужно создать UIImage из байтового массива. Вот теперь я создаю байтовый массив:

image = CGImageCreateWithImageInRect(aux.CGImage, imageRect);
context = CGBitmapContextCreate (data[i][j], TILE_WIDTH, TILE_HEIGHT, 
                                 bitsPerComponent, bitmapBytesPerRow, colorSpace,
                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);//kCGImageAlphaNoneSkipFirst);//kCGImageAlphaNone);//

CGContextDrawImage(context, CGRectMake(0, 0, TILE_WIDTH, TILE_HEIGHT), image);

data[i][j] = CGBitmapContextGetData (context);

Переменная data является беззнаковым символом.

И вот как я пытаюсь получить UIImage:

NSData *imgData = [NSData dataWithBytes:data[i][j] length:TILE_WIDTH*TILE_HEIGHT*numberOfCompponents];
        UIImage *img = [UIImage imageWithData: imgData];

img (UIImage) остается нулевым.

ОК, это не фон: я пытаюсь создать приложение pixelate :). Изображения с камеры iPhone 4 слишком велики по размеру, поэтому я разделил изображение на более мелкие. Таким образом, когда необходимо обновить область с пикселизацией (касание), чтобы отобразить эффект пикселизации, я обновляю меньший UIImage. Мне нужно было сделать это так, потому что в предыдущих тестах он казался таким, будто обновление UIImage убивает процессор. Тем не менее, уменьшенные изображения теперь имеют размер 80x100 pxl, и обновление работает не настолько гладко, насколько это возможно. Иногда, если вы двигаете пальцем быстро, он пропускает некоторые места: D. Я думаю, что использование этого метода для создания UIImage из байтового массива быстрее, чем этот:

CGImageRef cgImage = CGImageCreate(TILE_WIDTH, TILE_HEIGHT, bitsPerComponent,
                                   bitsPerPixel, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big, 
                                   dataProvider, NULL, false, kCGRenderingIntentDefault);
UIImage *imageToBeUpdated = [UIImage imageWithCGImage:cgImage];

Я прав?

1 Ответ

3 голосов
/ 27 февраля 2011

[UIImage imageWithData:data] анализирует данные в известном формате файла изображения (например, jpeg, png или gif; полный список в документации . Вы передаете ему необработанные данные пикселей, которые не поддерживаются .

Попробуйте вместо CGBitmapContextGetData вывести изображение из контекста:

CGImageRef imgRef = CGBitmapContextCreateImage(context);
UIImage *img = [UIImage imageWithCGImage:imgRef];
...