2012-01-02 15 views
25

Conosco molto poco l'elaborazione delle immagini e ancor meno la terminologia utilizzata, quindi per favore portami con me.Come usare Imagick per unire e mascherare le immagini?

Fondamentalmente, voglio unire due immagini insieme dove una di esse fungerà da maschera. L'immagine è simile a questa:
Example
Dove lo sfondo blu e giallo sono entrambi trasparenti nella realtà.

Questa immagine viene utilizzata come maschera per le foto normali. Parti della foto che "sporgono" dal cerchio devono essere "ritagliate" (essere rese invisibili) mentre l'interno rimane visibile.
Quindi tutto ciò che arriva nell'area blu è invisibile, tutto nell'area gialla è visibile.

Onestamente non ho idea di come procedere, quindi qualsiasi aiuto sarebbe molto apprezzato!

Edit:
io uso la versione API di Imagick, non la versione a riga di comando

Edit:
per avere un'idea di quello che voglio ottenere, ecco un esempio.

Le immagini in ingresso sono quindi:
enter image description here
Questa è l'immagine della maschera, sempre la stessa

enter image description here
Questo è un esempio di un'immagine, dinamico

enter image description here
Questo è quello il risultato finale dovrebbe apparire come

+0

Ho davvero bisogno di una risposta per questa domanda . La mia conoscenza è troppo limitata per ricercarla da solo, ecco perché sto iniziando una taglia. Se la domanda deve essere migliorata, lo farò volentieri. –

+0

sarebbe la versione della riga di comando di aiuto ..? –

+0

Se non può essere fatto con l'API, dovrei ricorrere alla CLI, ma ho un forte favore verso la versione dell'API. –

risposta

59

Così, finalmente, questo dovrebbe fare quello che ti serve:

immagine originale:

http://i.stack.imgur.com/b7seR.png

Opacità maschera:

enter image description here

Overlay:

http://i.stack.imgur.com/3ulkM.png

uscita:

enter image description here

Il codice:

<?php 
$base = new Imagick('U0R4F.png'); 
$mask = new Imagick('mask.png'); 
$over = new Imagick('3ulkM.png'); 

// Setting same size for all images 
$base->resizeImage(274, 275, Imagick::FILTER_LANCZOS, 1); 

// Copy opacity mask 
$base->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA); 

// Add overlay 
$base->compositeImage($over, Imagick::COMPOSITE_DEFAULT, 0, 0); 

$base->writeImage('output.png'); 
header("Content-Type: image/png"); 

echo $base; 
?> 

spero che sia proprio ora! Nota: nel tuo esempio sembra che abbia ridimensionato l'immagine di base, cosa che non ho fatto (il mio obiettivo è solo quello di mostrare come è fatto il mascheramento).

+0

Questo sembra promettente! Creerò un'immagine maschera e testerò questo codice. –

+0

Sì, immagino che dovrebbe verificarsi un ridimensionamento. Sto testando il nuovo codice ora. –

+1

Ottimo, questo è quasi perfetto! Un problema, qualsiasi trasparenza nell'immagine originale viene convertita in nero. C'è un modo per preservare il canale alfa? –

0

http://www.imagemagick.org/Usage/compose/#dstin dovrebbe fare il trucco, ma è necessario utilizzare le immagini con i canali alfa (che non dovrebbe essere un problema).

Modifica: in PHP è necessario passarlo (imagick::COMPOSITE_DSTIN) come parametro in compositeimage. Altri filtri in Composite Operator Constants potrebbero anche esserti utili.

+0

Questo non aiuta davvero. Ovviamente ho trovato la funzione di composizione, ma non so come combinare gli strumenti disponibili per creare il risultato che mi serve. –

1

Hai provato questa soluzione qui come descritto da: https://stackoverflow.com/a/2351173/1093649?

Eseguilo nel server (con i nomi delle immagini corretti!) E faccelo sapere, grazie.

NB: i crediti vanno a jspash

+0

L'avevo già trovato, ma in realtà non fa quello che voglio. L'effetto netto di questa risposta è che le parti blu e gialle dell'immagine rimangono trasparenti mentre il bordo nero mostra l'immagine di 'sfondo'. –

+0

Peccato, puoi attaccare le immagini originali al tuo post? In questo modo, possiamo ottenere un'idea migliore da dove stai iniziando. –

+0

Ho aggiornato la domanda con immagini di input e output di esempio. –

0

Questo tipo di mascheramento è exampled utilizzando una serie di tecniche diverse in ImageMagick esempi, Miniature, maschera e dipingere http://www.imagemagick.org/Usage/thumbnails/#mask_paint

Essere avvertito, tuttavia, che la mascheratura e i bordi dell'immagine di sovrapposizione non dovrebbe corrispondere questo è importante o potresti avere problemi con gli effetti di aliasing del bordo che è meglio evitare.

L'estrazione di una maschera alfa dell'anello può essere eseguita utilizzando gli operatori di morfologia per ridurla a una linea centrale che può essere utilizzata per generare una maschera per qualsiasi forma di 'anello' casuale. ImageMagick Esempi, scheletri da diradamento e potatura http://www.imagemagick.org/Usage/morphology/#thinning_skeleton

Anthony Thyssen Maestro Web per esempi ImageMagick, e Developer per ImageMagick

PS: bella foto da Elfling