9
votes

Comment générez-vous une image RGBA dans les graphiques de base?

J'essaie de générer une image RGBA8 du texte à utiliser en tant que texture OpenGL ES 2.0. XXX PRE>

Malheureusement, il n'y a pas de CGColorsPacecreateDevicegba code> et CGColorsPacecreateDeDeDevicergB Code> Résultats dans l'erreur suivante: P>

CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 448 bytes/row.


0 commentaires

3 Réponses :


16
votes

L'espace de couleur que vous spécifiez lors de la création ne provoquerait pas une erreur comme celle-là.

La raison pour laquelle vous obtenez cette erreur est que vous avez spécifié 8 bits par composant, probablement 4 composants de couleur dans le 4 * Taille.Width Valeur Vous avez transmis pour BYTESPERROW , mais un bitmapInfo Paramètre de KCGIMAGELPHANONE . kcgimagealphanone signifie uniquement rgb , pas rgba . Si vous voulez rgba , vous devez spécifier probablement spécifier kcgimagealphalast kcgimagealphapremultipliedlast .

[modifier ] Pardon. J'aurais dû dire kcgimagealpropremultipliedlast , pas kcgimaquealphalast .

donc, quelque chose comme ceci: xxx


7 commentaires

J'avais essayé aussi; Malheureusement, je reçois la même erreur (ISH): "CGBITMAPCONTExtCreate: Combinaison de paramètres non pris en charge: 8 bits integer / composant; 32 bits / pixels; espace couleur à 3 composants; kcgimagealphalast; 448 octets / rangées."


J'ai mis à jour la question à montrer que l'erreur survient toujours avec KCGIMAGEALPHALAST.


@Ian Terrell: Yup, désolé, je me suis trompé; Consultez ma réponse mise à jour avec kcgimagealphapremultipliedlast plutôt que kcgimagealphalast .


Cela corrige l'erreur; Mon uiimage a été encore créé de manière incorrecte, mais j'ai résolu que Via IMAGE = [UIIMAGE ImageWithCGIMAGE: CGBITMAPCONTExtCreateImage (Contextref)]. Merci!


Apple Docs disent que KCGIMAGEALPHAXX est soutenu depuis 2,0, mais seulement KCGIMACEALPHAPREMULTIPLIEXXXX semble fonctionner.


Je suis désolé, mais selon le SDK, le dernier paramètre sur la cgbitmapcontextCreate doit être un CGBITMAPInfo, pas une constante CGIMAGELPHA. développeur.apple.com/library/ios/documentation/graphicsimagin g / ...


@ROBVanderveer: A cgbitmapinfo comprend un cgimaalphanfo dans le cadre du masque. De ( développeur.apple.com/library/ios/documentation/graphicsimagi ng / ... ):" Les constantes de spécification des informations sur les canaux alpha sont déclarées avec le type cgimaSealphainfo mais peut être transmis à ce paramètre en toute sécurité. Vous pouvez également transmettre les autres constantes associées au type cgbitmapinfo . "



1
votes

Je reçois la même combinaison de paramètres non prise en charge Erreur même si j'utilisais kcgimagealphapremultipliedlast . Le problème dans mon cas s'est avéré être que la largeur que j'avais eu était fractionnelle. Le transformant en un entier en passant int (largeur) à cgbitmapcontextcreate a résolu le problème.

- Modifier en réponse au commentaire de Steven -

Le problème avec l'alimentation dans une largeur fractionnée, car le deuxième argument n'est pas que cgbitmapcontextexcreate interprète comme tel - comme indiqué, il est fondé implicitement au type d'entier non signé de l'argument. Au contraire, il produit une divergence dans l'argument bytes_per_row , car int (largeur * 4) n'est pas la même que INT (largeur) * 4. E. G. Si la largeur est 22,5, la largeur est tronquée à 22, mais largeur * 4 calcule à 90, pas 88.


3 commentaires

Impossible, l'argument de largeur à cgbitmapcontextexcreate est déjà un entier (non signé). Le casting est fait pour vous.


La note a signalé une observation, donc il n'est pas impossible de définir, car elle s'est produite. Cela dit, mon analyse était incomplète. J'ai édité ma réponse et précisé pourquoi utiliser une largeur fractionnée est un problème.


C'est vrai, je me suis mis en question les observations / mesures. Merci de clarifier. Au fait, si vous utilisez NULL pour l'argument de données comme l'OP, vous passez également 0 pour les octets par ligne afin que le système puisse choisir une valeur correcte (et peut encore plus performante).



0
votes
    CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);

    CGBitmapInfo    bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little;

    CGContextRef theContext = CGBitmapContextCreate(NULL, imgSize.width, imgSize.height, 8, 4*imgSize.width, colorSpace, bitmapInfo);

0 commentaires