2010-06-25 6 views
1

J'ai un UIImageView dans un UIScrollView sur lequel j'ai permis à l'utilisateur d'effectuer un nombre quelconque d'opérations de retournement et de retournement. J'ai tout ce qui fonctionne, ce qui permet à l'utilisateur de zoomer, casser, retourner et faire pivoter. Maintenant, je veux être en mesure de sauvegarder l'image finale sur un png.Enregistrer un UIImage à partir d'un UIImageView avec CGAffineTransform

mais il fait ma tête pour essayer de nous en sortir ...

Je l'ai vu quelques autres postes similaires à cela, mais la plupart ne nécessitent l'application d'une seule transformée, comme par exemple une rotation Creating a UIImage from a rotated UIImageView

Je voudrais appliquer toute transform que l'utilisateur a « créé » qui sera une série de feuilles mobiles et rotations concaténé rencontres

Lorsque l'utilisateur applique plusieurs rotations, flips etc, je stocke concaténés transformation à l'aide CGAffineTransformConcat. Par exemple, quand ils tournent que je fais:

CGAffineTransform newTransform = CGAffineTransformMakeRotation(angle); 
self.theFullTransform = CGAffineTransformConcat(self.theFullTransform, newTransform); 
self.fullPhotoImageView.transform = self.theFullTransform; 

La méthode suivante est le meilleur que j'ai obtenu jusqu'à présent pour créer un UIImage avec la pleine transformée mais l'image est toujours traduit dans le mauvais endroit. Par exemple, l'image est "décalée". Ce que je suppose est lié à l'utilisation des mauvaises limites définies dans CGAffineTransformTranslate ou CGContextDrawImage.

Quelqu'un a-t-il des idées? Cela semble beaucoup plus difficile que je pensais que ce devrait être ...

- (UIImage *) translateImageFromImageView: (UIImageView *) imageView withTransform:(CGAffineTransform) aTransform 
{ 
    UIImage *rotatedImage; 

    // Get image width, height of the bounding rectangle 
    CGRect boundingRect = CGRectApplyAffineTransform(imageView.bounds, aTransform); 

    // Create a graphics context the size of the bounding rectangle 
    UIGraphicsBeginImageContext(boundingRect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGAffineTransform transform = CGAffineTransformIdentity; 

    //I think this translaton is the problem? 

    transform = CGAffineTransformTranslate(transform, boundingRect.size.width/2, boundingRect.size.height/2); 
    transform = CGAffineTransformScale(transform, 1.0, -1.0); 
    transform = CGAffineTransformConcat(transform, aTransform); 

    CGContextConcatCTM(context, transform); 

    // Draw the image into the context 

    // or the boundingRect is incorrect here? 

    CGContextDrawImage(context, boundingRect, imageView.image.CGImage); 

    // Get an image from the context 
    rotatedImage = [UIImage imageWithCGImage: CGBitmapContextCreateImage(context)]; 

    // Clean up 
    UIGraphicsEndImageContext(); 
    return rotatedImage; 
} 

Répondre

1

Est-ce prévisible offset, comme toujours la moitié de l'image, ou dépend-elle aTransform?

struct CGAffineTransform { 
    CGFloat a, b, c, d; 
    CGFloat tx, ty; 
}; 

Dans ce dernier cas, définissez tx et ty à zéro en aTransform avant de l'utiliser.

+0

merci mais cela dépend de la transformation. À la fin, j'ai ajouté un UIView supplémentaire en incluant UIImageView et j'ai utilisé le renderInContext: UIGraphicsGetCurrentContext(), puis l'ai recadré. – joneswah

+8

Notez ce que vous avez fait comme réponse et marquez-le comme accepté. – drawnonward

Questions connexes