2011-12-20 14 views
10

Próbuję znaleźć przepis na tworzenie rozmytej skali szarości UIImage z kolorowego PNG i alfa. Istnieją receptury w ObjC, ale MonoTouch nie wiąże funkcji CGRect, więc nie wiesz, jak to zrobić. Jakieś pomysły?MonoTouch konwertuje kolory UIImage z alfa na skalę szarości i rozmycie?

Oto jeden z przykładów ObjC skali szarości:

(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

Próbowałem korzystać z tej funkcji, ale nie będzie pracować z obrazami innych niż skalę 1,0 ... (przerw na siatkówce) – Jonny

Odpowiedz

13

MonoTouch nie wiąże funkcje CGRect więc nie wiem jak to zrobić.

Podczas korzystania z MonoTouch CGRect jest zamapowany na RectangleF. Istnieje wiele metod rozszerzenia, które powinny być odwzorowane na każdą funkcję zapewnianą przez GCRect. Nie powinieneś mieć problemu z przeniesieniem kodu ObjectiveC za ich pomocą.

Jeśli czegoś brakuje, wypełnij zgłoszenie błędu @http://bugzilla.xamarin.com, a naprawimy je najszybciej jak to możliwe (i jeśli to możliwe, zapewnij obejście problemu).

Są tam recepty w ObjC ale MonoTouch

Jeśli masz linki to proszę edytować swoje pytanie i dodać je. Że będzie łatwiej pomóc :)

UPDATE

Oto, wiersz po wierszu, C# przekład swoim przykładzie. Wydaje się, że pracuje dla mnie (i to o wiele łatwiejsze do moich oczach niż 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

DZIAŁA WIELKIE! Myślę, że prawdopodobnie będę musiał poświęcić więcej czasu na naukę tłumaczenia przykładów ObjC, ponieważ oczywiście można sprawić, że będzie wyglądać łatwo (tak jak właśnie). Dzięki –

+0

Cieszymy się, że to działa :-) Poświęć trochę czasu, aby zaakceptować odpowiedź (zielony znak poniżej liczb głosów), aby umożliwić innym osobom, szukając podobnego pytania, aby zobaczyć odpowiedź jest dostępna. – poupou

0

pisałem natywny port rozmycie i odcień kategoriach UIImage z WWDC dla MonoTouch.

Przykładowy kod odcieniem i rozmycie:

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

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

Powinieneś tylko ustawić deltaSaturationFactor na 0 – evya

Powiązane problemy