2011-01-15 15 views
3

画像を黒色に変換するためにおなじみのコードを使用しました。&白はいくつかのフォーラムで作成しました。
コードは次のとおりです。iPhone SDKの画像を白黒画像に変換する

CGColorSpaceRef colorSapce = CGColorSpaceCreateDeviceGray(); 
CGContextRef context = CGBitmapContextCreate(nil, originalImage.size.width,  originalImage.size.height, 8, originalImage.size.width, colorSapce, kCGImageAlphaNone); 
CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
CGContextSetShouldAntialias(context, NO); 
CGContextDrawImage(context, CGRectMake(0, 0, originalImage.size.width, originalImage.size.height), [originalImage CGImage]); 
CGImageRef bwImage = CGBitmapContextCreateImage(context); 
CGContextRelease(context); 
CGColorSpaceRelease(colorSapce); 

UIImage *resultImage = [UIImage imageWithCGImage:bwImage]; // This is result B/W image. 
CGImageRelease(bwImage); 

return resultImage; 

私は水平方向の画像上でこのコードを使用しているとき、それは仕事の罰金、
だが、私は垂直画像上でこのコードを使用しようとしているとき、結果は 不釣り合いであります90度左に回転します。

誰でも問題が分かるのですか?

ありがとう、 Kfir。

答えて

1

UIImageは回転できます(imageOrientationプロパティを確認してください)。この場合、レンダリングの前に回転をCGImageに適用する必要があります。それ以外の場合は、あなたが経験している結果を得る。解決方法は、イメージを描画する前にCGContextに正しい変換を適用することです。たとえば、次のコードはそのような変換を生成して適用します。

// image is the original UIImage 
    CGImageRef imgRef = image.CGImage; 

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

    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); 
    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"]; 

    } 

    CGContextConcatCTM(context, transform); 
    // Do the drawing 
    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); 
+0

ありがとうございました!私はそれを確認します。 – KfirS

関連する問題