2011-12-20 16 views
10

私はぼかしされたグレースケールUIImageをカラーPNGとアルファから作成するためのレシピを見つけようとしています。 ObjCにはレシピがありますが、MonoTouchはCGRect関数をバインドしないので、これを行う方法がわかりません。何か案は?ここでMonoTouchは、カラーUIImageをアルファでグレースケールに変換し、ぼかしていますか?

は、グレースケールの1つのにObjCの例である:

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

を、私はこの機能を使用しようとしましたが、それは1.0スケール以外の画像では動作しません...(休憩網膜上) – Jonny

答えて

13

MonoTouchでは、これを行うにはどのようにわからないCGRectの機能を結合しません。

モノタッチを使用する場合CGRectRectangleFにマップされます。 GCRectによって提供されるすべての機能にマップする必要がある多くの拡張メソッドが存在します。それらを使用してObjectiveCコードを移植する際に問題はありません。

何かが欠落している場合http://bugzilla.xamarin.com @バグレポートを記入し、我々はできるだけ早くそれを修正(および可能な場合は、回避策を提供し)ますしてください。

あなたがリンクを持っている場合は、あなたの質問を編集し、それらを追加してください

ありレシピはにObjCにそこにいるが、MonoTouchで

。それは、それが簡単にあなたを助けるために行います:)

UPDATEはここではあなたの例の、ライン・バイ・ライン、C#の翻訳です。それは私のために作品に思える(そしてそれは私がMonoTouchでのためのWWDCからぼかしや色合いUIImageカテゴリのネイティブポートを書いたのObjective-C ;-)

UIImage ConvertToGrayScale (UIImage image) 
    { 
     RectangleF imageRect = new RectangleF (PointF.Empty, image.Size); 
     using (var colorSpace = CGColorSpace.CreateDeviceGray()) 
     using (var context = new CGBitmapContext (IntPtr.Zero, (int) imageRect.Width, (int) imageRect.Height, 8, 0, colorSpace, CGImageAlphaInfo.None)) { 
      context.DrawImage (imageRect, image.CGImage); 
      using (var imageRef = context.ToImage()) 
       return new UIImage (imageRef); 
     } 
    } 
+0

うわー! ObjCの例を翻訳するのにもっと時間を費やす必要があると思います。なぜなら、明らかに簡単に見えるようにすることができるからです。ありがとう –

+0

喜んであなたのために:-)似たような質問を検索して、他の人が答えを見ることができるように、回答を受け入れる時間を取ってください(投票番号の下の緑色のマーク)。 – poupou

0

よりも私の目にはるかに簡単です。

色合いのためのサンプルコードとぼかし:

UIColor tintColor = UIColor.FromWhiteAlpha (0.11f, 0.73f); 

UIImage yourImage; 
yourImage.ApplyBlur (20f /*blurRadius*/, tintColor, 1.8f /*deltaSaturationFactor*/, null); 
+0

deltaSaturationFactorを0に設定する必要があります – evya

関連する問題