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.
Beachten Sie, dass 'kCGBitmapByteOrderDefault' den Alpha-Kanal nicht auf das Bild zu übertragen scheint. Verwenden Sie stattdessen 'kCGBitmapByteOrder32Big | kCGImageAlphaLast'. –
Ich denke, Sie sollten ColorSpaceRef ('CGColorSpaceRelease (ColorSpaceRef)') vor der Rückgabe von NewImage release. – velkyel
@velkyel muss er auch den Datenanbieter 'CGDataProviderRelease (Provider) freigeben;' – medvedNick