【问题标题】:Iphone app: Taking 2-3 seconds to rotate large imagesIphone 应用程序:需要 2-3 秒来旋转大图像
【发布时间】:2012-12-18 13:24:56
【问题描述】:

我正在使用此方法来解决从相机捕获的图像的方向问题(默认情况下,图像向左旋转 90 度)。但是对于高分辨率图像,这需要大约 2-3 秒的旋转时间。

@implementation UIImage (fixOrientation)

- (UIImage *)fixOrientation {

    // No-op if the orientation is already correct
    if (self.imageOrientation == UIImageOrientationUp) return self;

    // We need to calculate the proper transformation to make the image upright.
    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
    CGAffineTransform transform = CGAffineTransformIdentity;

    switch (self.imageOrientation) {
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;

        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0);
            transform = CGAffineTransformRotate(transform, M_PI_2);
            break;

        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, self.size.height);
            transform = CGAffineTransformRotate(transform, -M_PI_2);
            break;
        case UIImageOrientationUp:
        case UIImageOrientationUpMirrored:
            break;
    }

    switch (self.imageOrientation) {
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;

        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
        case UIImageOrientationUp:
        case UIImageOrientationDown:
        case UIImageOrientationLeft:
        case UIImageOrientationRight:
            break;
    }

    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
                                             CGImageGetBitsPerComponent(self.CGImage), 0,
                                             CGImageGetColorSpace(self.CGImage),
                                             CGImageGetBitmapInfo(self.CGImage));
    CGContextConcatCTM(ctx, transform);
    switch (self.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            // Grr...
            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
            break;

        default:
            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage);
            break;
    }

    // And now we just create a new UIImage from the drawing context
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage *img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    return img;
}

@end

那么我该如何解决这个时间延迟问题。

谢谢, 乳糜泻

【问题讨论】:

  • 数字中的“高分辨率”是什么意思?
  • 3264*2448 我想如果大的话会更多。
  • 所以我们谈论的是 800 万像素——每个像素至少由 3 个颜色分量表示。围绕内存转移它需要做很多工作。您应该尝试使用小得多的图像,看看效果如何。

标签: iphone objective-c ios uiimagepickercontroller uiimageorientation


【解决方案1】:

试试这个代码..

     [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0];///set delay time here
    CGAffineTransform transform = CGAffineTransformMakeRotation(-3.14);
    transform = CGAffineTransformRotate(transform, -3.14);
    pictureView.transform = transform;
    [UIView commitAnimations];

也许你从这段代码中得到了灵感..

希望对您有所帮助...

【讨论】:

  • 你知道 math.h 定义了 M_PI 和 M_PI_2 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2021-11-09
  • 2012-03-25
相关资源
最近更新 更多