2012-07-09 13 views
7

私はAFnetworkingライブラリのsetImageWithUrlを使ってテーブルセル内にUImageViewsを設定していますが、画像をグレースケールにする必要があります。私はいくつかのUIImageグレースケールコンバータを試しましたが、私はまだダウンロードしていないものを設定しているので動作しないと思います。私はここでそれを見つけたUIImageViewを灰色にする

- (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; 
} 

+1

[このようなコアイメージフィルタを試してみてください] [1] [1]:http://stackoverflow.com/questions/10030631/what-is-the-best-core-イメージフィルタからモノクロまでの効果 –

答えて

14
+1

これは私にとって非常にうまくいった! Core Image Filterを試しましたが、コレクションのビューでパフォーマンスが低下しました。この方法を使うと非常に簡単です。 well done –

+1

これは透明度を使用しない場合にのみ機能します(アルファはNoneに設定されています)。 –

1

を代わりにuiimageViewの、のUIViewのサブクラスを、与えること

@property (strong, nonatomic) UIImage *image; 

@synthesize image = _image; 

オーバーライドセッターどこか

-(void)setImage:(UIImage *)image{ 
    _image = [self makeImageBW:image]; 
    [self setNeedsDisplay]; 
} 

- (UIImage *)makeImageBW:(UIImage *)source 
{ 
    CIImage *beginImage = source.CIImage; 
    CIImage *blackAndWhite = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, beginImage, @"inputBrightness", [NSNumber numberWithFloat:0.0], @"inputContrast", [NSNumber numberWithFloat:1.1], @"inputSaturation", [NSNumber numberWithFloat:0.0], nil].outputImage; 
    CIImage *output = [CIFilter filterWithName:@"CIExposureAdjust" keysAndValues:kCIInputImageKey, blackAndWhite, @"inputEV", [NSNumber numberWithFloat:0.7], nil].outputImage; 
    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef ref = [context createCGImage:output fromRect:output.extent]; 
    UIImage *newImage = [UIImage imageWithCGImage:ref]; 
    CGImageRelease(cgiimage); 
    return newImage; 
} 

-(void)drawRect:(CGRect)rect{ 
    [_image drawInRect:rect]; 
} 

あなたはNSURLRequestで画像を設定することができます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ 
     NSData *data = [NSURLConnection sendSynchronousRequest:(NSURLRequest *) returningResponse:nil error:nil]; 
     if (data){ 
      UIImage *image = [UIImage imageWithData:data]; 
      if (image) dispatch_async(dispatch_get_main_queue(),^{ 
       [view setImage:image]; 
      }); 
     } 
}); 
+0

私はUIViewを使ってAFNetworkingのsetImageWithUrlメソッドを使用することはできないと思っています。 – cannyboy

+0

私はAFNetworkingに慣れていないので、AFライブラリなしで動作するようにコードを追加しました –

+0

個人的に私は 'UIImage'のカテゴリとして追加したいと思います:' - [UIImage(Greyscale)grayscaleImage] '... then youサブクラス化する必要はありません。 – nielsbot

3

私は上記の、@Jesse Gumpoの例からコードを取ったが、ここでは、インターフェイスとしてあります。

@implementation UIImage (Greyscale) 

- (UIImage *)greyscaleImage 
{ 
    CIImage * beginImage = [ self CIImage ] ; 
    CIImage * evAdjustedCIImage = nil ; 
    { 
     CIFilter * filter = [ CIFilter filterWithName:@"CIColorControls" 
             keysAndValues:kCIInputImageKey, beginImage 
              , @"inputBrightness", @0.0 
              , @"inputContrast", @1.1 
              , @"inputSaturation", @0.0 
              , nil ] ; 
     evAdjustedCIImage = [ filter outputImage ] ; 
    } 

    CIImage * resultCIImage = nil ; 
    { 
     CIFilter * filter = [ CIFilter filterWithName:@"CIExposureAdjust" 
             keysAndValues:kCIInputImageKey, evAdjustedCIImage 
              , @"inputEV", @0.7 
              , nil ] ; 
     resultCIImage = [ filter outputImage ] ; 
    } 

    CIContext * context = [ CIContext contextWithOptions:nil ] ; 
    CGImageRef resultCGImage = [ context createCGImage:resultCIImage 
               fromRect:resultCIImage.extent ] ; 
    UIImage * result = [ UIImage imageWithCGImage:resultCGImage ] ; 
    CGImageRelease(resultCGImage) ; 

    return result; 
} 

@end 

今、あなたはちょうどこの操作を行うことができます。

UIImage * downloadedImage = ... get from AFNetwork results ... ; 
downloadedImage = [ downloadedImage greyscaleImage ] ; 

... use 'downloadedImage' ... 
+0

UIImageで呼び出されているソースを渡す必要がありますか?下位の関数呼び出しは単純ですが、上記のインタフェースは入力パラメータを取ります。これは不要です。ちょうど(UIImage *)greyscaleImageと呼ばれるのであれば? – Cindeselia

+0

はい - それはタイプミスでした。ありがとう。 – nielsbot

1

このスレッドは少し古いですが、私は私の検索でそれに出くわしました。 this postでは、イメージのアルファとスケールを考慮してimageViewに表示できるグレースケールイメージを作成するために、Swiftの2つの異なるメソッドを指摘しました。

import CoreImage 

extension UIImage 
{ 
    /// Applies grayscale with CIColorControls by settings saturation to 0.0. 
    /// - Parameter brightness: Default is 0.0. 
    /// - Parameter contrast: Default is 1.0. 
    /// - Returns: The grayscale image of self if available. 
    func grayscaleImage(brightness: Double = 0.0, contrast: Double = 1.0) -> UIImage? 
    { 
     if let ciImage = CoreImage.CIImage(image: self, options: nil) 
     { 
      let paramsColor: [String : AnyObject] = [ kCIInputBrightnessKey: NSNumber(double: brightness), 
                 kCIInputContrastKey: NSNumber(double: contrast), 
                 kCIInputSaturationKey: NSNumber(double: 0.0) ] 
      let grayscale = ciImage.imageByApplyingFilter("CIColorControls", withInputParameters: paramsColor) 

      let processedCGImage = CIContext().createCGImage(grayscale, fromRect: grayscale.extent) 
      return UIImage(CGImage: processedCGImage, scale: self.scale, orientation: self.imageOrientation) 
     } 
     return nil 
    } 

    /// Create a grayscale image with alpha channel. Is 5 times faster than grayscaleImage(). 
    /// - Returns: The grayscale image of self if available. 
    func convertToGrayScale() -> UIImage? 
    { 
     // Create image rectangle with current image width/height * scale 
     let pixelSize = CGSize(width: self.size.width * self.scale, height: self.size.height * self.scale) 
     let imageRect = CGRect(origin: CGPointZero, size: pixelSize) 
     // Grayscale color space 
     if let colorSpace: CGColorSpaceRef = CGColorSpaceCreateDeviceGray() 
     { 
      // Create bitmap content with current image size and grayscale colorspace 
      let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.None.rawValue) 
      if let context: CGContextRef = CGBitmapContextCreate(nil, Int(pixelSize.width), Int(pixelSize.height), 8, 0, colorSpace, bitmapInfo.rawValue) 
      { 
       // Draw image into current context, with specified rectangle 
       // using previously defined context (with grayscale colorspace) 
       CGContextDrawImage(context, imageRect, self.CGImage) 
       // Create bitmap image info from pixel data in current context 
       if let imageRef: CGImageRef = CGBitmapContextCreateImage(context) 
       { 
        let bitmapInfoAlphaOnly = CGBitmapInfo(rawValue: CGImageAlphaInfo.Only.rawValue) 
        if let contextAlpha = CGBitmapContextCreate(nil, Int(pixelSize.width), Int(pixelSize.height), 8, 0, nil, bitmapInfoAlphaOnly.rawValue) 
        { 
         CGContextDrawImage(contextAlpha, imageRect, self.CGImage) 
         if let mask: CGImageRef = CGBitmapContextCreateImage(contextAlpha) 
         { 
          // Create a new UIImage object 
          if let newCGImage = CGImageCreateWithMask(imageRef, mask) 
          { 
           // Return the new grayscale image 
           return UIImage(CGImage: newCGImage, scale: self.scale, orientation: self.imageOrientation) 
          } 
         } 
        } 
       } 
      } 

     } 
     // A required variable was unexpected nil 
     return nil 
    } 
} 
+0

この回答をこのサイトに掲載したい場合は、あなたの投稿を詳細にする必要があります。 – Martin

+0

@Martinあなたの拡張コードをコピーしました。 – FBente

関連する問題