2011-12-20 12 views
10

Sto cercando una ricetta per produrre una scala di grigio sfocata UIImage da un colore PNG e alfa. Esistono ricette in ObjC ma MonoTouch non associa le funzioni CGRect quindi non si è sicuri di come farlo. Qualche idea?MonoTouch converte il colore UIImmagine con alpha in scala di grigi e sfocatura?

Ecco uno objC esempio di scala di grigi:

(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

Ho provato ad utilizzare questa funzione, ma non funzionerà con le immagini diversi scala 1,0 ... (pause su retina) – Jonny

risposta

13

MonoTouch non vincola le funzioni CGRect quindi non so come fare questo.

Quando si utilizza MonoTouch CGRect viene mappata RectangleF. Esistono molti metodi di estensione che dovrebbero essere associati a tutte le funzioni fornite da GCRect. Non dovresti avere alcun problema nel porting del codice ObjectiveC che li usa.

Se manca qualcosa, si prega di compilare un bug report @http://bugzilla.xamarin.com e lo ripareremo al più presto (e fornire una soluzione alternativa quando possibile).

ci sono ricette là fuori nel objC ma MonoTouch

Se si dispone di collegamenti quindi si prega di modificare la tua domanda e aggiungerli. Questo renderà più facile per aiutare :)

UPDATE

Ecco una, riga per riga, C# traduzione del vostro esempio. Sembra di opere per me (ed è molto più facile ai miei occhi di 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

FUNZIONA GRANDE! Penso che probabilmente dovrò dedicare più tempo a imparare a tradurre gli esempi ObjC perché ovviamente può essere fatto sembrare semplice (come hai appena fatto). Grazie –

+0

Contento che funzioni per voi :-) Si prega di prendere il tempo di accettare la risposta (segno verde sotto i numeri dei voti) per consentire ad altre persone, alla ricerca di una domanda simile, di vedere una risposta è disponibile. – poupou

0

ho scritto una porta nativa della sfocatura e tinta categorie UIImage dal WWDC per MonoTouch.

Codice di esempio per tinta e sfocatura:

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

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

È necessario impostare il valore di deltaSaturation su 0 – evya

Problemi correlati