Создание UIImage из необработанных данных RGBA - PullRequest
14 голосов
/ 28 декабря 2010

Я пытался преобразовать данные массива RGBA (int bytes) в UIImage.Мой код выглядит следующим образом:

/*height and width are integers denoting the dimensions of the image*/
unsigned char *rawData = malloc(width*height*4);

for (int i=0; i<width*height; ++i) 
{
    rawData[4*i] = <red_val>;
    rawData[4*i+1] = <green_val>;
    rawData[4*i+2] = <blue_val>;
    rawData[4*i+3] = 255;
}


/*I Have the correct values displayed
    - ensuring the rawData is well populated*/

NSLog(@"(%i,%i,%i,%f)",rawData[0],rawData[1],rawData[2],rawData[3]/255.0f);
NSLog(@"(%i,%i,%i,%f)",rawData[4],rawData[5],rawData[6],rawData[7]/255.0f);
NSLog(@"(%i,%i,%i,%f)",rawData[8],rawData[9],rawData[10],rawData[11]/255.0f);



CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, 
                                                          rawData, 
                                                          width*height*4, 
                                                          NULL);

int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4*width;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(width,
                                    height,
                                    8,
                                    32,
                                    4*width,colorSpaceRef,
                                    bitmapInfo,
                                    provider,NULL,NO,renderingIntent);
/*I get the current dimensions displayed here */
NSLog(@"width=%i, height: %i", CGImageGetWidth(imageRef),
      CGImageGetHeight(imageRef) );
UIImage *newImage = [UIImage imageWithCGImage:imageRef];
/*This is where the problem lies. 
  The width, height displayed are of completely different dimensions
  viz. the width is always zero and the height is a very huge number */

NSLog(@"resultImg width:%i, height:%i",
          newImage.size.width,newImage.size.height);


return newImage;

Выходное изображение, которое я получаю, представляет собой изображение шириной 0 и высотой 1080950784 (при условии, что мои исходные высота и ширина были 240 и 240).Я пытался разобраться с этим и проверил многие связанные форумы, например ( текст ссылки ), как это сделать, но без особого успеха.

Ответы [ 3 ]

10 голосов
/ 28 января 2011

Оказывается, проблема довольно глупая ошибка, которую мы оба упустили из виду. Размеры UIImage хранятся как числа с плавающей точкой, а не как целые числа. : D

Попробуйте

NSLog(@"resultImg width:%f, height:%f",
          newImage.size.width,newImage.size.height);

Вместо. Размер изображения был передан правильно.

2 голосов
/ 14 января 2011

Я только что самостоятельно проверил эту проблему, думаю, об этом следует сообщить Apple как об ошибке.+(UIImage)imageWithCGImage: неправильно передает ширину и высоту источника CGImageRef в UIImage.

2 голосов
/ 31 декабря 2010

Проблема решена сейчас. Я получаю изображение, которое хочу отобразить, но все еще не могу понять, почему ширина и высота отличаются. По сути, ничего плохого в программе, скажем так. Единственная проблема - ширина и высота.

...