【问题标题】:iPhone - CGImageCreateWithImageInRect rotating some camera roll picturesiPhone - CGImageCreateWithImageInRect 旋转一些相机胶卷图片
【发布时间】:2011-07-01 21:19:15
【问题描述】:

我正在为 iPhone 开发像素化应用程序。因为用 iPhone 4 相机拍摄的照片太大,因此在更新像素化图片时应用程序运行非常缓慢,我尝试先创建图片的图块,然后只更新图块而不是孔图。

在构建图块时,它适用于以横向模式 (2592 x 1936 像素) 拍摄的相机胶卷照片和低分辨率图片,但不适用于以纵向模式 (1936 x 2592 像素) 拍摄的照片。

从原始图像中切割瓷砖的代码如下所示:

for (i = 0; i < NrOfTilesPerHeight; i++) {
  for (j = 0; j < NrOfTilesPerWidth; j++) {
    CGRect imageRect = CGRectMake(j*TILE_WIDTH, i*TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
    CGImageRef image = CGImageCreateWithImageInRect(aux.CGImage, imageRect);
    UIImage *img = [UIImage imageWithCGImage:image];
    UIImageView *imgView = [[UIImageView alloc] initWithImage:img];
  }
}

问题是使用这些图块创建的图像被逆时针旋转了 90 度角。

非常感谢, 安德烈

【问题讨论】:

    标签: iphone uiimage crop cgimage tile


    【解决方案1】:

    这是因为没有考虑 imageOrientation。

    有一个类似的问题 (Resizing UIimages pulled from the Camera also ROTATES the UIimage?),我已经稍微修改了代码以使用裁剪图像。

    你在这里:

    static inline double radians (double degrees) {return degrees * M_PI/180;}
    
    +(UIImage*)cropImage:(UIImage*)originalImage toRect:(CGRect)rect{
    
        CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], rect);
    
        CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
        CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);
        CGContextRef bitmap = CGBitmapContextCreate(NULL, rect.size.width, rect.size.height, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
    
        if (originalImage.imageOrientation == UIImageOrientationLeft) {
            CGContextRotateCTM (bitmap, radians(90));
            CGContextTranslateCTM (bitmap, 0, -rect.size.height);
    
        } else if (originalImage.imageOrientation == UIImageOrientationRight) {
            CGContextRotateCTM (bitmap, radians(-90));
            CGContextTranslateCTM (bitmap, -rect.size.width, 0);
    
        } else if (originalImage.imageOrientation == UIImageOrientationUp) {
            // NOTHING
        } else if (originalImage.imageOrientation == UIImageOrientationDown) {
            CGContextTranslateCTM (bitmap, rect.size.width, rect.size.height);
            CGContextRotateCTM (bitmap, radians(-180.));
        }
    
        CGContextDrawImage(bitmap, CGRectMake(0, 0, rect.size.width, rect.size.height), imageRef);
        CGImageRef ref = CGBitmapContextCreateImage(bitmap);
    
        UIImage *resultImage=[UIImage imageWithCGImage:ref];
        CGImageRelease(imageRef);
        CGContextRelease(bitmap);
        CGImageRelease(ref);
    
        return resultImage;
    }
    

    【讨论】:

    • 此代码是否真的适用于您在 iPhone 4G 相机上拍摄的图像?对我来说,在过去的 6 个小时里,它一直在失败(基本上是在图像的随机部分进行裁剪)。它适用于来自互联网的图像(可能是因为它们没有旋转信息)。
    • @Andrei 这段代码为我做了一些时髦的事情。在某些方向上,x 和 y 被切换了。所以如果我在一个向右的图片上使用一个矩形,它会切掉 y,x而不是 x,y 我认为。至少,如果我稍后在图片上向上移动矩形并再次执行此操作,则输出将向右移动。但是输出的方向是正确的..
    • 你好,在纵向模式下,x和y被切换了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多