如何旋转CGImageRef?

时间:2013-01-15 21:12:45

标签: ios objective-c

我有一个UIImage,当我的iPad以纵向方式显示时,它看起来是正确的方式,但当我得到CGImageRef与之关联时,CGImageRef被旋转90度逆时针。经过一些谷歌搜索,我得知这是因为CGImageRef没有与UIImage不同的方向数据。我需要查看和修改CGImageRef中的一些像素,我现在通过直接访问rawData变量(图像是UIImage *)来实现这一点:

CGImageRef imageRef = [image CGImage];

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); //maybe make ...Gray();
unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpaceRef, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);

但是,为了让我正确修改存储在rawData中的像素数据,我需要CGImageRef处于正确的方向。如何顺时针旋转CGImageRef 90度然后访问rawData(像素信息)?

1 个答案:

答案 0 :(得分:0)

试试这个:

CGImageRef imageRef = [sourceImage CGImage];
CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);


CGContextRef bitmap;

if (sourceImage.imageOrientation == UIImageOrientationUp || sourceImage.imageOrientation == UIImageOrientationDown) {
    bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

} else {
    bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

}   

if (sourceImage.imageOrientation == UIImageOrientationLeft) {
    CGContextRotateCTM (bitmap, radians(90));
    CGContextTranslateCTM (bitmap, 0, -targetHeight);

} else if (sourceImage.imageOrientation == UIImageOrientationRight) {
    CGContextRotateCTM (bitmap, radians(-90));
    CGContextTranslateCTM (bitmap, -targetWidth, 0);

} else if (sourceImage.imageOrientation == UIImageOrientationUp) {
    // NOTHING
} else if (sourceImage.imageOrientation == UIImageOrientationDown) {
    CGContextTranslateCTM (bitmap, targetWidth, targetHeight);
    CGContextRotateCTM (bitmap, radians(-180.));
}

CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);