UIImage Вращение

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

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

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

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


person Kamchatka    schedule 16.05.2010    source источник


Ответы (2)


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

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

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

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

person drawnonward    schedule 16.05.2010
comment
На самом деле я храню изображения в формате JPEG, и я думаю, что он поддерживает ориентацию. Но могу ли я получить к нему доступ из Cocoa? - person Kamchatka; 17.05.2010

Для анимации поверните 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;

}

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

person Satish Azad    schedule 07.01.2013