2015-09-02 11 views
5

Sto cercando libreria iOS e Android per (preferibilmente) o algoritmo che mi aiuterebbe a sfumare l'immagine in modo simile a come viene gestita Photoshop. L'illustrazione seguente mostra l'effetto desiderato dell'algoritmo. Non mi interessano i limiti di sfumatura dell'immagine, solo i bordi alfa. Ho cercato un algoritmo in grado di farlo per pochi giorni senza fortuna. Qualsiasi aiuto sarà apprezzato.Algoritmo e libreria iOS e Android per bordi sfumati delle immagini simili a quelli di Photoshop

Feathering Image

+2

http://stackoverflow.com/a/31142908/2194046 controlla il mio codice, Piegherà qualsiasi UIImmagine sagomata. :)) – zurakach

risposta

6

Supponendo di avere canale alfa (come su foto con sfondo trasparente) sembra che matrice sfocatura regolare convultion dovrebbe soddisfare voi.

Tuttavia, anziché passare attraverso i canali RGB, è necessario passare solo attraverso il canale ALPHA.

Controllare il filtro di sfocatura qui: https://en.wikipedia.org/wiki/Kernel_%28image_processing%29

Siete interessati in scatola di sfocatura/sfocatura gaussiana. Tuttavia, per rendere questo effetto più fluido, è necessario utilizzare una matrice di dimensioni maggiori.

La ragione per cui l'algoritmo soddisferà le tue esigenze è che se tutti i pixel circostanti hanno l'alfa 0 - sarà ancora 0. Se 255 - rimarrà 255. Solo i pixel nell'area del bordo tra l'alfa 0/255 saranno interessati .

Edit:

prega di consultare questo violino con bicromato di potassio (in FF che è molto lento): http://jsfiddle.net/5L40ms65/

È possibile dare uno sguardo nella algoritmo alla fine del codice. Poiché attuazione Ho notato che: - nessuna necessità di sfocatura se tutti i pixel neigbour sono 255 o 0 (canale alfa) - è richiesto di sfocatura anche RGB in altri casi

In generale:

RADIUS = 2 (makes total width of matrix = 5) 
For x = 0..width 
    for y = 0..width 
    if all pixels in square of radius 2 are alpha = 0 
     do nothing 
    elsif all pixels in square have alpha = 255 
     do nothing 
    else 
     pixel[x][y].RGB = average RGB of adjacent pixels where alpha != 0 
     pixel[x][y].ALPHA = average ALPHA in square 

esempio risultato con raggio = 2

Naturalmente questo è piuttosto programma di concetto, c'è un sacco di posto per Memoizzazione e messa a punto di questo script però dovrebbe fare una grande quadro chiaro

enter image description here

+0

Sarò felice di concederti una taglia se elabori maggiormente la tua risposta e magari fornisci un breve esempio di come dovrei farlo. –

0

È possibile modificare l'alfa del bordo in base al colore di sfondo della vista.

var r:Float! 
var g:Float! 
var b:Float! 
var a:Float! 

if self.view.backgroundColor.getRed(red:r, green:g, blue:b, alpha:a) { 
    var imgv = UIImageView(frame: CGRect(x:100, y:100, width:100, height:100)) 
    imgv.image = UIImage(named:"name") 
    imgv.layer.borderWidth = 2.0 
    imgv.layer.borderColor = UIColor(red:r, green:g, blue:b, alpha:0.5).CGColor 
    imgv.layer.cornerRadius = imgv.frame.size.width/2 
    imgv.clipsToBounds = true 
}else{ 
    //Could not get the RGB of background color 
} 

È possibile che si verifichino errori in questo codice perché non l'ho ancora testato.

+0

Non applica il bordo ai bordi dell'immagine, solo per la cornice della vista dell'immagine. –

+0

Vuoi cambiare l'immagine stessa non il contenitore che la mostra? –

+0

"Non mi interessano i limiti di sfumatura dell'immagine, solo i bordi alfa." –

Problemi correlati