Wie generieren Sie eine RGBA-Bild in Core Graphics?
Ich versuche zu generieren, die eine RGBA8 Bild von text zu verwenden, als eine OpenGL-ES-2.0-textur.
+(UIImage *)imageFromText:(NSString *)text
{
UIFont *font = [UIFont systemFontOfSize:20.0];
CGSize size = [text sizeWithFont:font];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef contextRef = CGBitmapContextCreate (NULL,
size.width, size.height,
8, 4*size.width,
colorSpace,
kCGImageAlphaLast
);
CGColorSpaceRelease(colorSpace);
UIGraphicsPushContext(contextRef);
[text drawAtPoint:CGPointMake(0.0, 0.0) withFont:font];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsPopContext();
return image;
}
Leider gibt es keine CGColorSpaceCreateDeviceRGBA
, und CGColorSpaceCreateDeviceRGB
Ergebnisse in die folgende Fehlermeldung:
CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 448 bytes/row.
Was bin ich auf die richtigen format RGBA8, dass OpenGL hier will?
Update: ich habe die letzten parameter von CGBitmapContextCreate
aus kCGImageAlphaNone
(was es war, wenn ich die Kopie eingefügt den code) zu kCGImageAlphaLast
, das ist eine von mehreren Varianten, die ich ausprobiert habe, der Fehler.
Update 2: UIGraphicsGetImageFromCurrentImageContext()
gibt es nil zurück, wenn der Kontext wurde nicht erstellt, mit UIGraphicsBeginImageContext()
, so ist es notwendig, zu extrahieren, die das Bild anders: [UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)]
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Farbraum, den Sie angeben, während der Erstellung nicht dazu führen würde, Fehler.
Deshalb sind Sie immer, dass Fehler, die Sie angegeben haben 8 bit pro Komponente, vermutlich 4-Farb-Komponenten in der
4*size.width
Wert, den Sie übergeben, fürbytesPerRow
noch einebitmapInfo
parameter derkCGImageAlphaNone
.kCGImageAlphaNone
bedeutet nurRGB
, nichtRGBA
. Wenn Sie möchtenRGBA
sollten Sie wahrscheinlich geben SiekCGImageAlphaLast
kCGImageAlphaPremultipliedLast
.[EDIT] sorry. Ich habe gesagt
kCGImageAlphaPremultipliedLast
, nichtkCGImageAlphaLast
.So, in etwa so:
kCGImageAlphaPremultipliedLast
eher alskCGImageAlphaLast
.CGBitmapInfo
umfasst eineCGImageAlphaInfo
als Teil der Maske. Aus (developer.apple.com/library/ios/documentation/graphicsimaging/...): "Die Konstanten für die Angabe der alpha-Kanal-Informationen sind deklariert mit derCGImageAlphaInfo
Typ, kann aber weitergegeben werden, um diese parameter sicher. Sie können auch an die anderen Konstanten im Zusammenhang mit derCGBitmapInfo
geben."War ich immer die gleichen
unsupported parameter combination
Fehler, obwohl ich mitkCGImageAlphaPremultipliedLast
. Das Problem in meinem Fall stellte sich heraus, dass die Breite, die ich immer war, war Bruch. Drehen Sie es in eine Ganzzahl durch die übergabeint(width)
zu CGBitmapContextCreate das problem gelöst.--Edit-Antwort auf Steven ' s Kommentar--
Das Problem mit der Fütterung in einen Bruchteil der Breite als das zweite argument ist nicht, dass
CGBitmapContextCreate
interpretiert es als solche -- wie gesagt, es wird gegossen, implizit in das argument ist ein unsigned-integer-Typ. Vielmehr erzeugt es eine Diskrepanz in derbytes_per_row
argument, da int(Breite * 4) ist nicht das gleiche wie int(Breite) * 4. E. g. wenn die Breite beträgt 22,5, dann Breite abgeschnitten wird um 22, aberwidth * 4
berechnet, um 90, nicht 88.CGBitmapContextCreate
ist bereits ein (unsigned) integer. Das casting ist für Sie erledigt.