2009-03-10 6 views
17

पर एक पारदर्शी स्ट्रोक (या किसी छवि का स्पष्ट भाग) कैसे आकर्षित करें मेरे पास एक छोटा ऐप है जो उपयोगकर्ता को उंगली से स्क्रीन पर आकर्षित करने की अनुमति देता है। मेरे पास UIImageView है जहां उपयोगकर्ता CGContextRef और विभिन्न CG draw फ़ंक्शंस बनाकर खींचता है। मैं मुख्य रूप से फंक्शन CGContextAddLineToPointआईफोन

के साथ स्ट्रोक/रेखाएं खींचता हूं अब मेरा मुद्दा यह है: उपयोगकर्ता विभिन्न रंगों की रेखाएं खींच सकता है। मैं उसे उंगली के साथ अब तक खींची गई छवि के कुछ हिस्से को हटाने के लिए "rubber" उपकरण का उपयोग करने की क्षमता देना चाहता हूं। मैंने शुरुआत में स्ट्रोक के लिए एक सफेद रंग (CGContextSetRGBStrokeColor फ़ंक्शन के साथ सेट) का उपयोग करके ऐसा किया था, लेकिन यह काम नहीं कर सका ... क्योंकि मैंने बाद में पाया कि UIImageView पर वास्तव में एक पारदर्शी पृष्ठभूमि थी, सफेद नहीं ... तो मैं उस पर सफेद रेखाओं के साथ एक पारदर्शी छवि के साथ खत्म हो जाएगा!

क्या "transparent" स्ट्रोक रंग सेट करने के लिए वैसे भी है या क्या उपयोगकर्ता की उंगली के नीचे CGContextRef की सामग्री को साफ़ करने का कोई अन्य तरीका है, जब वह इसे स्थानांतरित करता है? धन्यवाद

उत्तर

57

इस चाल करना होगा:

CGContextSetBlendMode(context, kCGBlendModeClear) 
+1

इस खींची गई रेखाओं के साथ छवि को मिटा नहीं सकते हैं? अगर मैं छवि को मिटाने से रोकना चाहता हूं तो क्या होगा? और केवल पेंट मिटा दें? – Shailesh

1

मैं का उपयोग कर की कोशिश की है:

CGContextSetStrokeColorWithColor (myContext, [[UIColor clearColor] CGColor]); 

लेकिन वह काम नहीं करता है, क्योंकि यह करने के लिए एक अदृश्य रंग (और अदृश्य रंग के साथ संदर्भ के शीर्ष पर "ड्राइंग" किया जा रहा है + जो भी रंग यह चित्रित कर रहा है = जिस रंग पर यह चित्रित हो रहा है)।

एकमात्र समाधान मैंने पाया है (जो इष्टतम नहीं है) है:

CGContextClearRect (myContext, CGRectMake(x, y, width, height)); 

दुर्भाग्य से, इसका मतलब है कि आप rects की एक श्रृंखला का पता लगाने और रेखा अपने आप को उत्पन्न करने के लिए है ...

6

मैं Bresenham की लाइन एल्गोरिथ्म (प्राचीन काल के दिनों की है जब मैं अपने खुद के ग्राफिक्स दिनचर्या लिखना पड़ा करने के लिए वापस harkening) का उपयोग कर समाप्त हो गया ...

- (void) contextEraseLine:(CGContextRef) ctx from:(CGPoint)startPoint to:(CGPoint) endPoint withThickness:(int)thickness { 
    int x, cx, deltax, xstep, 
    y, cy, deltay, ystep, 
    error, st, dupe; 

    int x0, y0, x1, y1; 

    x0 = startPoint.x; 
    y0 = startPoint.y; 
    x1 = endPoint.x; 
    y1 = endPoint.y; 

    // find largest delta for pixel steps 
    st = (abs(y1 - y0) > abs(x1 - x0)); 

    // if deltay > deltax then swap x,y 
    if (st) { 
     (x0 ^= y0); (y0 ^= x0); (x0 ^= y0); // swap(x0, y0); 
     (x1 ^= y1); (y1 ^= x1); (x1 ^= y1); // swap(x1, y1); 
    } 

    deltax = abs(x1 - x0); 
    deltay = abs(y1 - y0); 
    error = (deltax/2); 
    y = y0; 

    if (x0 > x1) { xstep = -1; } 
    else   { xstep = 1; } 

    if (y0 > y1) { ystep = -1; } 
    else   { ystep = 1; } 

    for ((x = x0); (x != (x1 + xstep)); (x += xstep)) 
    { 
     (cx = x); (cy = y); // copy of x, copy of y 

     // if x,y swapped above, swap them back now 
     if (st) { (cx ^= cy); (cy ^= cx); (cx ^= cy); } 

     (dupe = 0); // initialize no dupe 

     if(!dupe) { // if not a dupe, write it out 
      //NSLog(@"(%2d, %2d)", cx, cy); 

      CGContextClearRect(ctx, CGRectMake(cx, cy, thickness, thickness)); 

    } 

     (error -= deltay); // converge toward end of line 

     if (error < 0) { // not done yet 
      (y += ystep); 
      (error += deltax); 
     } 
    } 
} 

ओह! एक (कुछ हद तक) क्लंकी इरेज़र लाइन बनाने के लिए यह एक लंबा रास्ता है।

- (void)eraseStart { 
    // erase lines 
    UIGraphicsBeginImageContext(drawingBoard.size); 
    ctx = UIGraphicsGetCurrentContext(); 
    CGContextDrawImage(ctx,CGRectMake(0,0,drawingBoard.size.width, drawingBoard.size.height),[drawingBoard CGImage]); 
} 

- (void)eraseEnd { 
    drawingBoard = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    [drawingView removeFromSuperview]; 
    [drawingView release]; 

    drawingView = [[UIImageView alloc] initWithImage:drawingBoard]; 
    drawingView.frame = CGRectMake(intEtchX, intEtchY, intEtchWidth, intEtchHeight); 

    [self.view addSubview:drawingView]; 
} 

इसका मतलब यह है कि आप पहले से ही एक drawingView (UIImageView) और drawingBoard (UIImage) बनाया है:

इसके इस्तेमाल के लिये की तरह कुछ है।

फिर, एक लाइन को मिटाने के लिए, बस की तरह कुछ कार्य करें:

CGContextRef ctx = UIGraphicsGetCurrentContext(); 
[self eraseStart]; 
[self contextEraseLine:ctx from:CGPointMake (x1, y1) to:CGPointMake (x2, y2) withThickness:10]; 
[self eraseEnd]; 

(x1, y1, x2, और उचित मूल्यों के साथ y2 की जगह) ...

-2
//erase part 
if(mouseSwiped) 
{ 

//**************Working Code*************// 


UIGraphicsBeginImageContext(frontImage.frame.size); 
[frontImage.image drawInRect:CGRectMake(0, 0, frontImage.frame.size.width, frontImage.frame.size.height)]; 
CGContextSetLineCap(UIGraphicsGetCurrentContext(),kCGImageAlphaNone); //kCGImageAlphaPremultipliedLast); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 10); 
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1, 0, 0, 10); 
CGContextBeginPath(UIGraphicsGetCurrentContext()); 
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
CGContextClearRect (UIGraphicsGetCurrentContext(), CGRectMake(lastPoint.x, lastPoint.y, 10, 10)); 
CGContextStrokePath(UIGraphicsGetCurrentContext()); 
frontImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 


lastPoint = currentPoint; 

mouseMoved++; 

if (mouseMoved == 10) 
{ 
    mouseMoved = 0; 
} 
} 
+0

यह काम नहीं करता है - बदले में एक छवि दृश्य पर एक भूरे रंग की रेखा खींचता है – Shailesh