2011-12-20 7 views
10

मैं रंग पीएनजी और अल्फा से धुंधला ग्रेस्केल UIImage बनाने के लिए एक नुस्खा ढूंढने की कोशिश कर रहा हूं। ObjC में वहां व्यंजन हैं लेकिन मोनो टच CGRect फ़ंक्शंस को बाध्य नहीं करता है, इसलिए यह सुनिश्चित न करें कि यह कैसे करें। कोई विचार?मोनो टच कलर यूआईएममेज को अल्फा के साथ ग्रेस्केल और ब्लर में कनवर्ट करें?

(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 कार्यों के लिए बाध्य नहीं है तो यह कैसे करना है यकीन नहीं:

यहाँ ग्रेस्केल में से एक ObjC उदाहरण है।

MonoTouch CGRect का उपयोग करते समय RectangleF को मैप किया है। बहुत सारे एक्सटेंशन विधियां मौजूद हैं जो GCRect द्वारा प्रदान किए गए प्रत्येक फ़ंक्शन को मैप करना चाहिए। आप का उपयोग कर ObjectiveC कोड पोर्टिंग में कोई समस्या नहीं होनी चाहिए।

अगर कुछ गुम है तो कृपया एक बग रिपोर्ट @http://bugzilla.xamarin.com भरें और हम इसे एएसएपी (और जब संभव हो तो एक समाधान प्रदान करेंगे) भर देंगे।

वहाँ आप लिंक तो अपने प्रश्न को संपादित करने और उन्हें जोड़ने अपना लिया है तो ObjC लेकिन MonoTouch

में वहाँ व्यंजनों हैं। यही कारण है कि यह आसान आप मदद करने के लिए कर देगा :)

अद्यतन

यहाँ एक है, पंक्ति-दर-पंक्ति, अपने उदाहरण के सी # अनुवाद। यह मेरे लिए काम करता है लगता है (और यह बहुत ऑब्जेक्टिव-सी ;-)

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

बढ़िया काम करता है! मुझे लगता है कि मुझे शायद ओबीजेसी उदाहरणों का अनुवाद करने के लिए और अधिक समय बिताने की जरूरत है क्योंकि जाहिर है इसे आसान दिखने के लिए बनाया जा सकता है (जैसा आपने अभी किया था)। धन्यवाद –

+0

खुशी है कि यह आपके लिए काम करता है :-) कृपया उत्तर देने के लिए समय दें (वोट संख्याओं के नीचे हरा चिह्न) अन्य लोगों को एक समान प्रश्न की तलाश करने के लिए, एक उत्तर देखने के लिए उपलब्ध है। – poupou

0

मैं Monotouch के लिए WWDC से कलंक और टिंट UIImage श्रेणियों में से एक नेटिव पोर्ट लिखा था की तुलना में मेरी आँखों करना आसान है। टिंट के लिए

नमूना कोड और धुंधला:

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

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

आपको केवल डेल्टा सेटरेशन फैक्टर 0 पर सेट करना चाहिए – evya

संबंधित मुद्दे