iPhone - CGImageCreateWithImageInRect вращение некоторых снимков с камеры - PullRequest
8 голосов
/ 22 февраля 2011

Я работаю над приложением pixelate для iPhone.Поскольку снимки, сделанные с помощью камеры 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];
  }
}

Проблема в том, что изображение, созданное с помощью этих плиток, поворачивается на 90 градусов против часовой стрелки.

СпасибоВас много, Андрей

1 Ответ

7 голосов
/ 03 марта 2011

Это потому, что imageOrientation не принимается во внимание.

Есть похожий вопрос ( Изменение размера изображений, извлеченных из камеры, также ОБРАТИТ 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;
}
...