iPhone - CGImageCreateWithImageInRect旋转一些相机胶卷图片

And*_*csu 8 iphone crop tile uiimage cgimage

我正在为iPhone设计一个pixelate应用程序.因为使用iPhone 4相机拍摄的照片太大,因此在更新像素化图片时应用程序工作非常慢,我试图先创建图片的图块,然后更新图块而不是孔图片.

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

从原始图像切割切片的代码如下所示:

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];
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是用这些瓷砖创建的图像逆时针旋转到90度角.

非常感谢,Andrei

b12*_*400 7

这是因为不考虑imageOrientation.

有一个类似的问题(调整从相机中拉出UIimages还调整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;
}
Run Code Online (Sandbox Code Playgroud)

  • 对于在iPhone 4G相机上拍摄的图像,此代码是否真的适用于您?在过去的6个小时里,它一直在失败(基本上是在图像的随机部分中裁剪).它适用于来自互联网的图像(可能是因为它们没有旋转信息). (6认同)