2016-11-23 32 views
16

Görüntülemenin bir bölümünü bulanıklaştırmak kolaydır; arkadan görünümlerin içeriği değiştiğinde bulanıklık gerçek zamanlı olarak değişir. Bir invert etkisi yapmak için ve bir görünümü üzerinde koyabilirsiniz ve içerikler arkasında renkleri UIView'nin belirli bir alanının renkleri nasıl çevrilir?

  • bir ekleme ters olurdu nasıl

    Sorularım

    1. arkasındaki piksellerin ortalama rengini bilen etkisi?

    Genel olarak, Piksellere nasıl erişilir ve bunları nasıl değiştirilir? Soruma UIImageView, UIView hakkında genel olarak soruyorum ..

    Benzer bir şey yapan kütüphaneler var, ama çok yavaşlar ve bulanıklık kadar pürüzsüz koşma!

    Teşekkürler.

  • +1

    bu projeyi kontrol edin https://github.com/freshking/BKFilterView – Joe

    +0

    bu kütüphane çok yavaş :( – DeyaEldeen

    +0

    Zaten bunu gerçekleştiren kütüphanelerde kodu okuyun ve kendi kodunuzu nasıl oluşturacağınız hakkında fikir edinmek için bu kodu kullanın filtre. – user3353890

    cevap

    5

    olduğunu .

    • Çekirdek Görüntü size ihtiyacınız performans verecektir GPU kullanmak hepsi birkaç bulanıklık filtreleri vardır.

    • CIAreaAverage size belirtilen dikdörtgen alan için ortalama renk verecektir. İşte

      Core Image Filters

    yazabilirsiniz basit CIColorKernel ilgili.

    :

    kernel vec4 swapRedAndGreenAmount(__sample s) { 
        return s.grba; 
    } 
    

    sadece bu kod satırını kullanın, bir CIColorKernel içine koymak için: Bir görüntüdeki her piksel için kırmızı ve yeşil değeri (yerine "RGBA" nin "Grba" note) swapları

    let swapKernel = CIKernel(string: 
        "kernel vec4 swapRedAndGreenAmount(__sample s) {" + 
        "return s.grba;" + 
        "}" 
    

    @ tww003, bir görünüm katmanını bir UIImage'a dönüştürmek için iyi bir koda sahiptir. Eğer, bu swapKernel yürütmek, resim myUiImage çağırabilir varsayarsak: bu konuda

    let myInputCi = CIImage(image: myUiImage) 
    let myOutputCi = swapKernel.apply(withExtent: myInputCi, arguments: myInputCi) 
    Let myNewImage = UIImage(ciImage: myOutputCi) 
    

    . Çok daha fazlasını yapabilirsiniz (CoreGraphics kullanarak, vb.) Ama bu iyi bir başlangıç.

    Son bir not, bireysel filtreleri (elle yazılmış renk, çözgü ve genel çekirdekler dahil) zincirleyebilirsiniz. İsterseniz, renk ortalamanızı altta yatan görünümün üzerine bir bulanıklaştırma ile zincirleyebilir ve tek bir filtre/efekt olarak istediğiniz her türlü ters çevirme işlemini yapabilirsiniz.

    1

    Sorunuzu tam olarak cevaplayabileceğimi düşünmüyorum, ama belki de size doğru yönde işaret edebilirim.

    Apple has some documentation on accessing the pixels data from CGImages, ancak elbette ki, ilk etapta çalışacak bir görüntüye sahip olmanızı gerektirir. Neyse ki, böyle bir UIView bir görüntü oluşturabilir:

    UIGraphicsBeginImageContext(view.frame.size) 
        view.layer.render(in: UIGraphicsGetCurrentContext()!) 
        let image = UIGraphicsGetImageFromCurrentImageContext() 
        UIGraphicsEndImageContext() 
    

    Oluşturduğunuz bu imgesinden, sen istiyorum nasıl piksel verilerini işlemek mümkün olacak. Sorunu çözmenin en temiz yolu olmayabilir, ama belki de araştırmaya değer bir şey.

    Ne yazık ki, sağladığım bağlantı Objective-C'de yazılmıştır ve birkaç yaşındadır, ancak belki de nasıl kullanılacağını anlayabilirsiniz.

    0

    Bu amaçla UIImageView öğesini genişletmenizi tavsiye edeceğim. Joe

    tarafından ref

    İyi ref

    Sen drawRect yöntemini geçersiz kılmak zorunda

    import UIKit 
    
    @IBDesignable class PortholeView: UIView { 
        @IBInspectable var innerCornerRadius: CGFloat = 10.0 
        @IBInspectable var inset: CGFloat = 20.0 
        @IBInspectable var fillColor: UIColor = UIColor.grayColor() 
        @IBInspectable var strokeWidth: CGFloat = 5.0 
        @IBInspectable var strokeColor: UIColor = UIColor.blackColor() 
    
        override func drawRect(rect: CGRect) { 
        super.drawRect(rect:rect) 
        // Prep constants 
        let roundRectWidth = rect.width - (2 * inset) 
        let roundRectHeight = rect.height - (2 * inset) 
    
        // Use EvenOdd rule to subtract portalRect from outerFill 
        // (See https://stackoverflow.com/questions/14141081/uiview-drawrect-draw-the-inverted-pixels-make-a-hole-a-window-negative-space) 
        let outterFill = UIBezierPath(rect: rect) 
        let portalRect = CGRectMake(
         rect.origin.x + inset, 
         rect.origin.y + inset, 
         roundRectWidth, 
         roundRectHeight) 
        fillColor.setFill() 
        let portal = UIBezierPath(roundedRect: portalRect, cornerRadius: innerCornerRadius) 
        outterFill.appendPath(portal) 
        outterFill.usesEvenOddFillRule = true 
        outterFill.fill() 
        strokeColor.setStroke() 
        portal.lineWidth = strokeWidth 
        portal.stroke() 
        } 
    } 
    

    Cevabınız bir CIColorKernel kodu nasıl biliyorsanız, neye ihtiyacınız olacak here