UIImage Вращение - PullRequest
       6

UIImage Вращение

0 голосов
/ 16 мая 2010

Я отображаю изображение в UIImageView (в UIScrollView), которое также хранится в CoreData.

В интерфейсе я хочу, чтобы пользователь мог поворачивать картинку на 90 градусов. Я также хочу сохранить его в CoreData.

Что мне повернуть на дисплее? scrollview, uiimageview или само изображение? (Если возможно, я бы хотел, чтобы вращение было анимированным) Но тогда я также должен сохранить изображение в CoreData.

Я думал об изменении ориентации изображения, но это свойство только для чтения.

Ответы [ 2 ]

1 голос
/ 07 января 2013

Для анимации поверните ur ImageView, преобразовав его:

 [UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
[UIView setAnimationRepeatAutoreverses:NO];
[UIView setAnimationRepeatCount:0];

   imageViewObject.transform = CGAffineTransformMakeRotation(angle);

[UIView commitAnimations];

и когда вы сохраняете изображение в базовые данные, то перед сохранением изображения поверните это изображение на угол imageViewRotated из текущей позиции. для вращения UIImage используйте это: // Помните, что угол должен быть в радианах, если он не в радианах, то конвертировать угол в радиан.

  - (UIImage*) rotateInRadians:(float)radians
{
    const size_t width = self.size.width;
    const size_t height = self.size.height;

    CGRect imgRect = (CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = width, .size.height = height};
    CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, CGAffineTransformMakeRotation(radians));

    /// Create an ARGB bitmap context
    CGContextRef bmContext = CreateARGBBitmapContext(rotatedRect.size.width, rotatedRect.size.height, 0);
    if (!bmContext)
        return nil;

    CGContextSetShouldAntialias(bmContext, true);
    CGContextSetAllowsAntialiasing(bmContext, true);
    CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh);

    /// Rotation happen here (around the center)
    CGContextTranslateCTM(bmContext, +(rotatedRect.size.width * 0.5f), +(rotatedRect.size.height * 0.5f));
    CGContextRotateCTM(bmContext, radians);

    /// Draw the image in the bitmap context
    CGContextDrawImage(bmContext, (CGRect){.origin.x = -(width * 0.5f), .origin.y = -(height * 0.5f), .size.width = width, .size.height = height}, self.CGImage);

    /// Create an image object from the context
    CGImageRef rotatedImageRef = CGBitmapContextCreateImage(bmContext);
    UIImage* rotated = [UIImage imageWithCGImage:rotatedImageRef];

    /// Cleanup
    CGImageRelease(rotatedImageRef);
    CGContextRelease(bmContext);

    return rotated;

}

Надеюсь, это вам поможет.

1 голос
/ 16 мая 2010

Чтобы просто отобразить повернутое изображение, вы должны повернуть UIImageView.

Вы можете сохранить некоторые метаданные вместе с изображением в CoreData, сообщая, какой поворот следует применить.

Некоторые форматы изображений имеют свойство неявного поворота. Если вам известен формат данных сжатого изображения, вы можете посмотреть спецификацию и посмотреть, поддерживает ли она.

Если вы собираетесь вращать пиксели изображения, вам придется сделать это вручную. Вы можете создать CGBitmapContext и нарисовать изображение в нем, повернув его, повредив матрицу преобразования, а затем создать новое изображение из растрового изображения.

...