Сохранить UIImage из UIImageView с помощью CGAffineTransform - PullRequest
1 голос
/ 25 июня 2010

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

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

Я видел немало другихсообщения, подобные этому, но большинство требует применения только одного преобразования, такого как вращение, например Создание UIImage из повернутого 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 Ответ

1 голос
/ 25 июня 2010

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

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

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

...