2009-08-28 13 views
9

मैं एक UIImageView है जो अपने आप रंग या ख में आकर्षित कर सकते हैं की जरूरत है/एक ध्वज के अनुसार w का सम्मान करते हुए एक UIImage के शीर्ष पर एक आकार आकर्षित करने के लिए कैसे:छवि के अल्फा मुखौटा

BOOL isGrey; 

मैं कोशिश कर रहा हूँ मूल छवि के शीर्ष पर एक काले आयताकार को रंग में सेट करें क्वार्ट्ज ब्लेंडमोड के साथ करें। यह काम करता है सिवाय इसके कि यह छवि के अल्फा मास्क का सम्मान नहीं करता है।

चित्रण देखें: alt text http://img214.imageshack.us/img214/1407/converttogreyscaleillo.png

गूगल सर्च कर रहे हैं और इसलिए, मैं मिल गया है और कई समाधान की कोशिश की, लेकिन कोई भी या तो मुखौटा सम्मान करते हैं।

- (void)drawRect:(CGRect)rect { 

    if (isGrey) { 
     CGContextRef context = UIGraphicsGetCurrentContext(); 

     // flip orientation 
     CGContextTranslateCTM(context, 0, self.bounds.size.height); 
     CGContextScaleCTM(context, 1.0, -1.0); 

     // draw the image 
     CGContextDrawImage(context, self.bounds, self.image.CGImage); 

     // set the blend mode and draw rectangle on top of image 
     CGContextSetBlendMode(context, kCGBlendModeSaturation); 
     CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0); 
     CGContextFillRect(context, rect);  
    } else { 
     [self.image drawInRect:rect]; 
    } 
} 

वहाँ कुछ क्वार्ट्ज ड्राइंग मोड है कि मैं स्थापित करने के लिए भूल रहा है:

यहाँ कोड है कि इसके बाद के संस्करण 'क्या मैं' छवि का उत्पादन होता है? मैंने क्वार्ट्ज प्रोग्रामिंग गाइड के माध्यम से देखा है लेकिन ओवरलैपिंग और हाइपरलिंक्ड विषयों से आपको थोड़ी सी जानकारी निकालने में बहुत मुश्किल है।

जाहिर है, मैं एक सामान्य समाधान की तलाश में हूं जो कि किसी भी मुखौटा आकार वाले चित्रों पर लागू होगा, न केवल सर्कल दिखाया गया है।

उत्तर

10

एक आकार आकर्षित करने के लिए, जबकि एक छवि के अल्फा मुखौटा का सम्मान, बस से पहले आप आकर्षित एक पंक्ति जोड़ें:

CGContextClipToMask(context, self.bounds, image.CGImage); 

// example usage 
    - (void)drawRect:(CGRect)rect { 

    if (isGrey) { 
      CGContextRef context = UIGraphicsGetCurrentContext(); 

      // flip orientation 
      CGContextTranslateCTM(context, 0.0, self.bounds.size.height); 
      CGContextScaleCTM(context, 1.0, -1.0); 

      // draw the image 
      CGContextDrawImage(context, self.bounds, self.image.CGImage); 

      // set the blend mode and draw rectangle on top of image 
      CGContextSetBlendMode(context, kCGBlendModeColor); 
      CGContextClipToMask(context, self.bounds, image.CGImage); // respect alpha mask 
      CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0); 
      CGContextFillRect(context, rect);    
    } else { 
      [self.image drawInRect:rect]; 
    } 

}

+0

सिवाय इसके कि यह काम नहीं करता है अगर आपका दृश्य पृष्ठभूमि रंग UIColor clearcolor है। –

1

हालांकि यह सीधे अपने सवाल का जवाब नहीं है, आप प्रभाव आप kCGBlendModeLuminosity मिश्रण मोड का उपयोग करके देख रहे प्राप्त करने में सक्षम हो सकता है:

- (void)drawRect:(CGRect)rect { 
    CGSize imageSize = [image size]; 
    CGContextRef c = UIGraphicsGetCurrentContext(); 
    if (isGrey) 
     CGContextSetBlendMode(c, kCGBlendModeLuminosity); 
    CGContextScaleCTM(c, 1.0, -1.0); 
    CGContextDrawImage(c, CGRectMake(0.0f, 0.0f, imageSize.width, -imageSize.height), [image CGImage]); 
} 

इसके अलावा, रेक्ट drawRect: को पारित कर दिया है अमान्य क्षेत्र, पूरे क्षेत्र में नहीं। आपको bounds का उपयोग

+0

आप इस कोशिश की? क्योंकि यह मुझे वही गलत परिणाम देता है जैसे मैंने कोशिश की सभी अन्य चीजें। – willc2

+0

ऐसा लगता है - [UIImage drawInRect:] CGContext पर सेट मिश्रण मोड को ध्यान में रखता नहीं है। मैंने CGContextDrawImage का उपयोग करने के लिए अपना उत्तर अपडेट कर दिया है - परीक्षण और काम कर रहा है :) – rpetrich

+0

क्या आपने इसे अल्फा चैनल के साथ एक छवि पर एक स्पष्ट रंग पृष्ठभूमि रंग या गैर-अपारदर्शी UIImageView के साथ किया था? आपका कोड गैर-मुखौटा छवियों, या छवि दृश्यों पर काम करता है जिनमें एक अपारदर्शी बीजी रंग है, या छवि दृश्य जो ओपेक संपत्ति = हाँ है। अगर छवि मेरे उदाहरण में हरे रंग की गेंद की तरह है, तो रंग ग्रेस्केल में नहीं बदलता है। – willc2

0

आप दृश्य की कोर एनीमेशन परत में एक मुखौटा जोड़ने का प्रयास कर सकते हैं।

CALayer *maskLayer = [CALayer layer]; 
[maskLayer setBounds:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)]; 

// Center the layer 
[maskLayer setPosition:CGPointMake([self view].bounds.size.width/2, 
          [self view].bounds.size.height/2)]; 

// Set the cornerRadius to half the width/height to get a circle. 
[maskLayer setCornerRadius:50.f]; 
[maskLayer setMasksToBounds:YES]; 

// Any solid color will do. Just using black here. 
[maskLayer setBackgroundColor:[[UIColor blackColor] CGColor]]; 

// Set the mask which will only allow that which is in the 
// circle show through 
[[[self view] layer] setMask:maskLayer]; 

एक अन्य विचार। आप छवि के बी & डब्ल्यू संस्करण क्यों नहीं बना सकते हैं और अपने ध्वज के आधार पर इसे स्वैप कर सकते हैं?

+1

क्योंकि मैं मौजूदा अल्फा चैनल का सम्मान करते समय छवि में चित्रण की सामान्य समस्या को हल करना सीखना चाहता हूं। क्या आप जानते हैं कि वह काम कैसे करना है? – willc2

+0

मैं देखता हूं। उचित लगता है। मुझे नहीं पता कि कुछ शोध किए बिना ऐसा कैसे किया जाए। माफ़ कीजिये। –

+0

गुणा मिश्रण मोड का उपयोग करें ... बस एक अनुमान – dontWatchMyProfile

1

मैं आसान तरीका लेता हूं और आपके पास गोल छवि के समान आकार के साथ एक काला सर्कल खींचता हूं। शायद आप जो मांग रहे हैं वह नहीं।

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

  • कोई संबंधित समस्या नहीं^_^