2010-12-28 11 views
13

Ich habe versucht, ein Array RGBA-Daten (int Bytes) in ein UIImage zu konvertieren. Mein Code sieht wie folgt aus:Erstellen von UIImage aus Raw-RGBA-Daten

/*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; 

Das Ausgangsbild, die ich erhalte ist ein Bild der Breite 0 und Höhe 1080950784 (vorausgesetzt, meine initil Höhe und Breite waren 240 und 240). Ich habe versucht, dies aussortiert und haben viele verwandte Foren überprüft, z. (link text) auf, wie man es geht, aber mit wenig Erfolg.

+1

Beachten Sie, dass 'kCGBitmapByteOrderDefault' den Alpha-Kanal nicht auf das Bild zu übertragen scheint. Verwenden Sie stattdessen 'kCGBitmapByteOrder32Big | kCGImageAlphaLast'. –

+0

Ich denke, Sie sollten ColorSpaceRef ('CGColorSpaceRelease (ColorSpaceRef)') vor der Rückgabe von NewImage release. – velkyel

+0

@velkyel muss er auch den Datenanbieter 'CGDataProviderRelease (Provider) freigeben;' – medvedNick

Antwort

9

Es stellt sich heraus, das Problem ist ein ziemlich dummer Fehler, den wir beide übersehen. UIImage-Dimensionen werden als Gleitkommazahlen gespeichert, nicht als Ganzzahlen. : D

Versuchen

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

statt. Die Bildgröße wurde korrekt übertragen.

2

Das Problem ist jetzt gelöst. Ich bekomme das Bild, das ich anzeigen möchte, aber immer noch nicht herausfinden, warum die Breite und Höhe unterschiedlich sind. Im Wesentlichen nichts falsch mit dem Programm pro sagen. Das einzige Problem ist die Breite und Höhe.

2

Ich habe gerade dieses Problem unabhängig überprüft, ich denke, es sollte als ein Fehler bei Apple gemeldet werden. +(UIImage)imageWithCGImage: überträgt die Breite und Höhe der Quelle CGImageRef nicht ordnungsgemäß an die UIImage.