Tôi đã cố gắng chuyển đổi dữ liệu RGBA mảng (int byte) thành UIImage. Mã của tôi trông giống như sau:Tạo UIImage từ dữ liệu RGBA thô
/*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;
Hình ảnh đầu ra tôi nhận được là chiều rộng 0 và chiều cao 1080950784 (giả định chiều cao và chiều rộng initil là 240 và 240). Tôi đã cố gắng sắp xếp điều này và đã kiểm tra nhiều diễn đàn có liên quan, ví dụ: (link text) về cách đi về nó nhưng với rất ít thành công.
Lưu ý rằng 'kCGBitmapByteOrderDefault' dường như không chuyển kênh alpha sang hình ảnh. Thay vào đó hãy sử dụng 'kCGBitmapByteOrder32Big | kCGImageAlphaLast'. –
Tôi nghĩ rằng bạn nên relase colorSpaceRef ('CGColorSpaceRelease (colorSpaceRef)') trước khi trở về newImage. – velkyel
@velkyel ông cũng phải phát hành nhà cung cấp dữ liệu 'CGDataProviderRelease (nhà cung cấp); ' – medvedNick