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
risposta
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
Sarò felice di concederti una taglia se elabori maggiormente la tua risposta e magari fornisci un breve esempio di come dovrei farlo. –
È 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.
Non applica il bordo ai bordi dell'immagine, solo per la cornice della vista dell'immagine. –
Vuoi cambiare l'immagine stessa non il contenitore che la mostra? –
"Non mi interessano i limiti di sfumatura dell'immagine, solo i bordi alfa." –
http://stackoverflow.com/a/31142908/2194046 controlla il mio codice, Piegherà qualsiasi UIImmagine sagomata. :)) – zurakach