2010-06-25 3 views
1

У меня есть UIImageView в UIScrollView, который я разрешил пользователю выполнять любое количество операций с переворачиванием и вращением. У меня есть все, что позволяет пользователю масштабировать, панорамировать, переворачивать и вращать. Теперь я хочу, чтобы сохранить окончательное изображение в png.Сохранить UIImage из UIImageView с CGAffineTransform

однако это делает мою голову, пытаясь решить эту проблему ...

Я видел довольно много других должностей, подобные этим, но требуют применения наиболее только одного преобразования, такие как вращение, например, Creating a UIImage from a rotated UIImageView

Я хотел бы применить любое преобразование, которое пользователь «создал», который будет представлять собой серию флипа и вращений сцепляются тусовки

Когда пользователь применяют различные повороты, сальто и т.д., я хранить каскадное преобразование с использованием CGAffineTransformConcat. Например, когда они вращаются я:

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

Следующий метод является лучшим я получил до сих пор для создания UIImage с полным преобразованием однако образ всегда переводится в неправильном месте. Например, изображение «смещено». Какая моя догадка связана с использованием неправильных границ, установленных в CGAffineTransformTranslate или CGContextDrawImage.

У кого-нибудь есть идеи? Это, кажется, намного сложнее, чем я думал, что это должно быть ...

- (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; 
} 

ответ

1

ли смещение предсказуемы, как всегда половина изображения, или это зависит от aTransform?

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

Если последний, установите tx и ty к нулю в aTransform перед его использованием.

+0

спасибо, но это зависит от трансформации. В конце я добавил дополнительный UIView, охватывающий UIImageView, и использовал renderInContext: UIGraphicsGetCurrentContext(), а затем обрезал его. – joneswah

+8

Напишите, что вы сделали в качестве ответа, и отметьте его как принятый. – drawnonward

Смежные вопросы