iPhone'da şeffaf inme (veya bir görüntünün zaten açık parçası) çizmek için nasıl

oy
18

Ben kullanıcı parmağı ile ekranda çizmek sağlayan küçük bir uygulama var. Bir var UIImageViewkullanıcı oluşturarak, çizer nerede CGContextRefve çeşitli CG drawfonksiyonları. Öncelikle fonksiyonu ile vuruş / çizgi çizinCGContextAddLineToPoint

Şimdi benim mesele şudur: kullanıcı çeşitli renklerde çizgiler çizebilirsiniz. Ona kullanma olanağı vermek istediğiniz rubberparmağı ile, bugüne kadar çekilmiş görüntünün bir kısmını silmek için aracı. Başlangıçta (ayarlanan inme için beyaz renk kullanarak bunu CGContextSetRGBStrokeColorfonksiyonu) ama bu sonradan keşfetti çünkü ... iş vermedi UIImageüzerinde UIImageViewöylesine ben ... aslında şeffaf bir arka plan, beyaz yoktu üzerinde beyaz çizgilerle şeffaf görüntü ile sona!

Bir ayarlamak için yine de var mı transparentinme renk veya içeriğini temizlemek için başka bir yolu yoktur CGContextRefo hareket ettiğinde, kullanıcının parmağının altında? Teşekkürler

Oluştur 10/03/2009 saat 10:18
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
57

Bu hile olacaktır:

CGContextSetBlendMode(context, kCGBlendModeClear)
Cevap 27/04/2010 saat 19:29
kaynak kullanıcı

oy
6

Ben (Ben kendi grafik rutinleri yazmak zorunda eskiden gün geri harkening) bresenham'ın çizgi algoritması kullanarak sona erdi ...

- (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);
        }
    }
}

Uf! Bu bir (biraz) aksak silgi hattını oluşturmak için gitmek için uzun bir yol.

Kullanmak için, bir şeyler gibi yapın:

- (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];
}

Bu zaten bir drawingView (UIImageView) ve DrawingBoard (UIImage) oluşturduk varsayar.

Sonra, bir çizgi silmek için, basitçe böyle bir şey yapın:

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

(Uygun değerlerle x1, y1, x2 ve y2 değiştirin) ...

Cevap 04/04/2009 saat 06:33
kaynak kullanıcı

oy
1

Ben kullanarak denedim:

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

(o çizim ve görünmeyen renk + ne olursa olsun color = o üzerinde çiziyor renk) görünmez bir renk ile bağlam üstünde "çizim" gibi görünüyor, çünkü ancak bu, çalışmıyor.

(Optimum değildir) buldum tek çözüm:

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

Ne yazık ki bu kendini rects bir dizi iz ve çizgi oluşturmak zorunda kalıyoruz ...

Cevap 30/03/2009 saat 21:59
kaynak kullanıcı

oy
0

Eğer dokunuşla Resmi silmek istiyorsanız bu benim kod UnErase kısmı çalışmıyor ama biraz yavaş olduğunu tavsiye edilmez .... olduğunu.

func addNewPathToImage(){
    print("Start erasing or not erasing")

    UIGraphicsBeginImageContextWithOptions(TopImageUIImageView.bounds.size, false, UIScreen.main.scale) // or 0 for the scale

//My image is aspect fit so I need to get rect

    let aspect = TopImageUIImageView.image!.size.width / TopImageUIImageView.image!.size.height
    let viewRatio = TopImageUIImageView.bounds.size.width / TopImageUIImageView.bounds.size.height


    if aspect < viewRatio {
        let scale = TopImageUIImageView.bounds.size.height / TopImageUIImageView.image!.size.height
        let width = scale * TopImageUIImageView.image!.size.width
        let topLeftX = (TopImageUIImageView.bounds.size.width - width) * 0.5
        rect = CGRect(x: topLeftX, y: 0, width: width, height: TopImageUIImageView.bounds.size.height)
    }
    else {
        let scale = TopImageUIImageView.bounds.size.width / TopImageUIImageView.image!.size.width
        let height = scale * TopImageUIImageView.image!.size.height
        let topLeftY = (TopImageUIImageView.bounds.size.height - height) * 0.5
        rect = CGRect(x: 0.0, y: topLeftY, width: TopImageUIImageView.bounds.size.width, height: height)
    }
    ////
    context = UIGraphicsGetCurrentContext()
    TopImageUIImageView.image?.draw(in: rect)
    context?.setLineCap(.round)
    context?.setLineWidth(brushSize)



    if isErasing == true {

        context?.setShadow(offset: CGSize(width: 0, height: 0), blur: blurNumber)
        context?.setStrokeColor(UIColor.white.cgColor)
        context?.setBlendMode(.clear)


    }else{

        print("test the unerase image .... ?")
        context?.setStrokeColor(UIColor.init(patternImage: topImage.af_imageAspectScaled(toFit: CGSize(width: TopImageUIImageView.bounds.size.width, height: TopImageUIImageView.bounds.size.height))).cgColor)

    }


   // I am using these because I am using touch to define what to erase 
        context?.move(to: CGPoint(x: lastTouch.x, y: lastTouch.y))
        context?.addLine(to: CGPoint(x: currentTouch.x, y: currentTouch.y))
        context?.strokePath()
        context?.closePath() // when add this line or the "context?.beginPath" get ERROR CGContextClosePath: no current point.
        print("close the path")




        //get your image 
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        TopImageUIImageView.image = image

}
Cevap 28/03/2019 saat 14:01
kaynak kullanıcı

oy
-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;
}
}
Cevap 24/08/2011 saat 16:25
kaynak kullanıcı

oy
-13
UIColor *clearColor = [UIColor clearColor];
Cevap 10/03/2009 saat 15:07
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more