2010-12-28 41 views
13

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.

+1

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'. –

+0

Tôi nghĩ rằng bạn nên relase colorSpaceRef ('CGColorSpaceRelease (colorSpaceRef)') trước khi trở về newImage. – velkyel

+0

@velkyel ông cũng phải phát hành nhà cung cấp dữ liệu 'CGDataProviderRelease (nhà cung cấp); ' – medvedNick

Trả lời

9

Nó chỉ ra vấn đề là một sai lầm khá ngớ ngẩn mà cả hai chúng ta đều bỏ qua. Kích thước UIImage được lưu trữ dưới dạng phao, không phải là số nguyên. : D

Hãy thử

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

Thay vào đó. Kích thước hình ảnh đã được chuyển chính xác.

2

Sự cố đã được giải quyết ngay bây giờ. Tôi nhận được hình ảnh mà tôi muốn hiển thị nhưng vẫn không thể tìm ra lý do tại sao chiều rộng và chiều cao là khác nhau. Về cơ bản không có gì sai với chương trình cho mỗi nói. Vấn đề duy nhất là chiều rộng và chiều cao.

2

Tôi chỉ xác minh độc lập vấn đề này, tôi nghĩ rằng nó nên được báo cáo như là một lỗi cho Apple. +(UIImage)imageWithCGImage: không truyền đúng chiều rộng và chiều cao của nguồn CGImageRef đến UIImage.

Các vấn đề liên quan