Question

J'essaie d'appliquer des transformations sur des images à l'aide d'un CGContextRef. J'utilise les fonctions CGContextTranslateCTM, CGContextScaleCTM et CGContextRotateCTM, mais pour que les choses restent simples, concentrons-nous uniquement sur les premières. Je me demandais pourquoi le code suivant produit exactement l'image originale?! Est-ce que je manque quelque chose?

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef g = CGBitmapContextCreate((void*) pixelData, 
                                                       width, 
                                                       height, 
                                                       RGBA_8_BIT, 
                                                       bytesPerRow, 
                                                       colorSpace, 

                                                   kCGImageAlphaPremultipliedLast);

CGContextSetShouldAntialias(g, YES);

CGContextSetInterpolationQuality(g, kCGInterpolationHigh);

CGContextTranslateCTM( g,translateX, translateY );


CGImageRef tempImg  = CGBitmapContextCreateImage (g);
CGContextDrawImage( g, CGRectMake (0, 0, width, height), tempImg );
CGContextRelease(g);
CGColorSpaceRelease( colorSpace );

Aussi, après la traduction, comment dessiner une autre image sur celle-ci mais avec une transparence partielle (par exemple alpha = 0.5).

J'ai cherché beaucoup mais je n'ai pas trouvé de réponse, toute aide est appréciée ...:)

Veuillez noter que je crée le contexte à partir de pixelData et que tempImg est créé après la traduction. Il n’ya rien de mal à l’initialisation, car l’image originale est en cours de production, mais le problème est lié à la traduction, je suppose.

Était-ce utile?

La solution

Les transformations dans l'état graphique n'affectent que les opérations de dessin suivantes. Elles ne modifient pas les données d'image existantes. Si vous souhaitez appliquer des transformations à une image, essayez l'une des solutions suivantes:

  1. Créez un CGContext vide (sur iPhone, utilisez UIGraphicsBeginImageContext)
  2. Traduisez, mettez à l'échelle ou faites pivoter son état graphique
  3. Dessinez l’image existante.
  4. Obtenir une image du nouveau CGContext (sur iPhone, utilisez UIGraphicsGetImageFromCurrentImageContext)

Lorsque vous effectuez l'étape 3, l'image existante est dessinée dans votre nouveau contexte graphique avec les transformations appliquées. Le truc ici est que pour appliquer les transformations, nous devons dessiner quelque chose.

Vous pouvez faire des choses vraiment sympas avec des transformations de cette façon. Vous pouvez dessiner la moitié de votre image, appliquer des transformations et en dessiner d'autres.

Autres conseils

Comme indiqué dans d'autres réponses, les transformations ne s'appliquent qu'aux opérations de dessin suivantes; ils n'affectent pas le tampon de pixels avec lequel vous avez commencé.

Vous avez donc besoin d’une opération de dessin. La solution consiste à créer une image CGImage ; dessiner cette image est une opération de dessin. Elle est donc soumise à la matrice de transformation actuelle (CTM).

Pas à pas:

  1. Créez le contexte avec des données de pixels vides . (Si vous transmettez NULL aux tampons, Quartz devrait les créer pour vous. Cela fonctionne de toute façon sur le Mac.)
  2. Créez l'image avec les données en pixels que vous souhaitez dessiner transformées.
  3. Transformer la marque communautaire dans le contexte.
  4. Dessinez l'image.

Vous devez appeler CGBitmapContextCreateImage () après avoir dessiné l'image.

Ensuite, vous pouvez dessiner une autre image par-dessus la première et appeler CGBitmapContextCreateImage () à nouveau pour obtenir la deuxième image. Vous pouvez définir l'alpha à l'aide de CGContextSetAlpha (ctx, alphaValue);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top