2010-07-27 186 views
6

我正在使用一种方法将使用相机拍摄的图像转换为黑白图像。 我遇到的问题是,如果照片是在肖像模式下拍摄的,它会在下一个视图中旋转并拉伸。但是,如果在风景中采取它只是发现。将图像转换为黑白问题CGContext - iPhone Dev

我只能在将图像转换为黑白图像时复制此错误。 以下是我正在使用的方法。

我不是100%,这个错误是从转换,但它只发生在它的转换。 哦,你好。这是iOS的4

/// 

- (UIImage *)convertImageToGrayScale:(UIImage *)image 
{ 

// Create image rectangle with current image width/height 
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height); 

// Grayscale color space 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

// Create bitmap content with current image size and grayscale colorspace 
CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone); 

// Draw image into current context, with specified rectangle 
// using previously defined context (with grayscale colorspace) 
CGContextDrawImage(context, imageRect, [image CGImage]); 

// Create bitmap image info from pixel data in current context 
CGImageRef imageRef = CGBitmapContextCreateImage(context); 

// Create a new UIImage object 
UIImage *newImage = [UIImage imageWithCGImage:imageRef]; 

// Release colorspace, context and bitmap information 
CGColorSpaceRelease(colorSpace); 
CGContextRelease(context); 
CFRelease(imageRef); 

// Return the new grayscale image 
return newImage; 
} 

@lessfame

+0

请格式化你的代码......看不懂! – 2010-07-27 04:20:22

+0

???代码看起来格式化为我。 – Franky 2010-07-27 19:33:59

回答

13

K I得到它。

我最终做的是找到这个函数,根据方向旋转基于变换的图像。它所做的是修复这个奇怪的旋转错误。

继承人的代码片段:

- (UIImage *)rotateImage:(UIImage *)image { 

int kMaxResolution = 320; // Or whatever 

CGImageRef imgRef = image.CGImage; 

CGFloat width = CGImageGetWidth(imgRef); 
CGFloat height = CGImageGetHeight(imgRef); 


CGAffineTransform transform = CGAffineTransformIdentity; 
CGRect bounds = CGRectMake(0, 0, width, height); 
if (width > kMaxResolution || height > kMaxResolution) { 
    CGFloat ratio = width/height; 
    if (ratio > 1) { 
     bounds.size.width = kMaxResolution; 
     bounds.size.height = bounds.size.width/ratio; 
    } 
    else { 
     bounds.size.height = kMaxResolution; 
     bounds.size.width = bounds.size.height * ratio; 
    } 
} 

CGFloat scaleRatio = bounds.size.width/width; 
CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); 
CGFloat boundHeight; 
UIImageOrientation orient = image.imageOrientation; 
switch(orient) { 

    case UIImageOrientationUp: //EXIF = 1 
     transform = CGAffineTransformIdentity; 
     break; 

    case UIImageOrientationUpMirrored: //EXIF = 2 
     transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); 
     transform = CGAffineTransformScale(transform, -1.0, 1.0); 
     break; 

    case UIImageOrientationDown: //EXIF = 3 
     transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); 
     transform = CGAffineTransformRotate(transform, M_PI); 
     break; 

    case UIImageOrientationDownMirrored: //EXIF = 4 
     transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); 
     transform = CGAffineTransformScale(transform, 1.0, -1.0); 
     break; 

    case UIImageOrientationLeftMirrored: //EXIF = 5 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); 
     transform = CGAffineTransformScale(transform, -1.0, 1.0); 
     transform = CGAffineTransformRotate(transform, 3.0 * M_PI/2.0); 
     break; 

    case UIImageOrientationLeft: //EXIF = 6 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); 
     transform = CGAffineTransformRotate(transform, 3.0 * M_PI/2.0); 
     break; 

    case UIImageOrientationRightMirrored: //EXIF = 7 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeScale(-1.0, 1.0); 
     transform = CGAffineTransformRotate(transform, M_PI/2.0); 
     break; 

    case UIImageOrientationRight: //EXIF = 8 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); 
     transform = CGAffineTransformRotate(transform, M_PI/2.0); 
     break; 

    default: 
     [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; 

} 

UIGraphicsBeginImageContext(bounds.size); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { 
    CGContextScaleCTM(context, -scaleRatio, scaleRatio); 
    CGContextTranslateCTM(context, -height, 0); 
} 
else { 
    CGContextScaleCTM(context, scaleRatio, -scaleRatio); 
    CGContextTranslateCTM(context, 0, -height); 
} 

CGContextConcatCTM(context, transform); 

CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); 
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return imageCopy; } 

该方法返回的图片,然后我就可以在我的黑色使用和白色功能

- (UIImage *)convertImageToGrayScale:(UIImage *)image { 

image = [self rotateImage:image];//THIS IS WHERE REPAIR THE ROTATION PROBLEM 

// Create image rectangle with current image width/height 
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height); 

// Grayscale color space 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

// Create bitmap content with current image size and grayscale colorspace 
CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone); 

// Draw image into current context, with specified rectangle 
// using previously defined context (with grayscale colorspace) 
CGContextDrawImage(context, imageRect, [image CGImage]); 

// Create bitmap image info from pixel data in current context 
CGImageRef imageRef = CGBitmapContextCreateImage(context); 

// Create a new UIImage object 
UIImage *newImage = [UIImage imageWithCGImage:imageRef]; 

// Release colorspace, context and bitmap information 
CGColorSpaceRelease(colorSpace); 
CGContextRelease(context); 
CFRelease(imageRef); 

// Return the new grayscale image 
return newImage; } 

享受!

+0

它工作得很好。感谢Franky .... – Hemang 2012-08-20 06:11:47

+0

视网膜脱离... – Jonny 2013-06-05 03:15:46

+0

如何让它缩小意识? – 2013-08-27 07:57:33

0

我想我想通了这一点。 即将开始测试。

原来有UIImage方向标志。 我发现了一个支持线程: http://discussions.apple.com/message.jspa?messageID=7276709

我对这个问题的看法是使用一个开关来检查方向,并根据客,它旋转到合适的方向。

我发现后,发布代码。

Stanks!

  • @lessfame
1

我修改,以便能够处理2.0比例缩小图像不会丢失分辨率:

- (UIImage *)convertImageToGrayScale:(UIImage *)image { 
    // Create image rectangle with current image width/height 
    CGRect imageRect = CGRectMake(0, 0, image.scale*image.size.width, image.scale*image.size.height); 

    // Grayscale color space 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

    // Create bitmap content with current image size and grayscale colorspace 
    CGContextRef context = CGBitmapContextCreate(nil, image.scale*image.size.width, image.scale*image.size.height, 8, 0, colorSpace, kCGImageAlphaNone); 

    // Draw image into current context, with specified rectangle 
    // using previously defined context (with grayscale colorspace) 
    CGContextDrawImage(context, imageRect, [image CGImage]); 

    // Create bitmap image info from pixel data in current context 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 

    // Create a new UIImage object 
    UIImage *newImage = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation]; 

    // Release colorspace, context and bitmap information 
    CGColorSpaceRelease(colorSpace); 
    CGContextRelease(context); 
    CFRelease(imageRef); 

    // Return the new grayscale image 
    return newImage; 
} 
相关问题