2009-06-21 8 views
1

J'essaie d'appliquer certaines transformations sur des images en utilisant un CGContextRef. J'utilise les fonctions CGContextTranslateCTM, CGContextScaleCTM et CGContextRotateCTM, mais pour garder les choses simples, je me concentre uniquement sur la première. Je me demandais pourquoi le code suivant produit exactement l'image originale ?! Est-ce que je manque quelque chose?iPhone: Transformer une image à l'aide de Quartz 2D

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); 

En outre, après la traduction, à dessiner une autre image sur celui-ci mais avec une transparence partielle (par exemple, alpha = 0,5).

Je cherchai beaucoup mais n'a pas trouvé une réponse, toute aide est appréciée ... :)

S'il vous plaît noter que je suis en train de créer le contexte de pixelData, et que tempImg est créé après la traduction. Il n'y a rien de mal à l'initialisation, comme l'image d'origine est actuellement produit, mais la question est la traduction, je suppose ..

Répondre

5

Les transformations de 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 quelque chose comme ceci:

  1. Créer un vide CGContext (sur iPhone, utilisez UIGraphicsBeginImageContext)
  2. Traduisez, l'échelle ou faire pivoter son graphiques état
  3. Dessine image existante dans ça.
  4. Obtenir l'image de la nouvelle CGContext (sur iPhone, utilisez UIGraphicsGetImageFromCurrentImageContext)

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

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

+0

Vous êtes la vedette! Ta première phrase m'a tout raflé, bravo :-) – Garry

-1

Vous devez appeler CGBitmapContextCreateImage() après vous dessinez l'image.

Ensuite, vous pouvez dessiner une autre image sur le premier et appeler à nouveau CGBitmapContextCreateImage() pour obtenir la deuxième image. Vous pouvez définir l'alpha en utilisant CGContextSetAlpha (ctx, alphaValue);

+0

Veuillez noter que je crée le contexte à partir de pixelData, et que tempImg est créé après la traduction. Il n'y a rien de mal dans l'initialisation, comme l'image originale est actuellement produite, mais le problème est avec la traduction je suppose .. –

+0

Ah, je comprends ce que vous essayez de faire maintenant. Vous ne pouvez pas modifier ce qui est dans le tampon d'un contexte (ou ce qui a déjà été dessiné) en utilisant CGContextTranslateCTM. La transformation du contexte ne fonctionne que sur ce qui sera dessiné après. Donc, si vous voulez transformer l'image originale de vos données, vous devrez la dessiner dans un second contexte. –

1

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 est à create a CGImage; drawing that image est une opération de dessin, elle sera donc soumise à la matrice de transformation actuelle (CTM).

étape par étape:

  1. Créer le contexte avec vide données de pixels. (Si vous passez les tampons NULL, Quartz devrait les créer pour vous, cela fonctionne sur le Mac, de toute façon.)
  2. Créez l'image avec les données de pixel que vous voulez transformer.
  3. Transformez le CTM dans le contexte.
  4. Dessinez l'image.
Questions connexes