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;
}
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
Notez ce que vous avez fait comme réponse et marquez-le comme accepté. – drawnonward