2010-05-16 3 views
0

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

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

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

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

ответ

1

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

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

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

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

+0

Я фактически храню изображения в формате JPEG, и я думаю, что он поддерживает ориентацию. Но могу ли я получить доступ к этому от Cocoa? – Kamchatka

1

Для анимации вращать уры ImageView пути ее преобразования:

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

    imageViewObject.transform = CGAffineTransformMakeRotation(angle); 

[UIView commitAnimations]; 

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

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

} 

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