2010-01-22 10 views
5

Voglio ritagliare un'immagine rettangolare in una forma non rettangolare. Mi rendo conto che se lo prendi completamente alla lettera, non è possibile. Quello che voglio finire è l'immagine X, ritagliata per formare Y, su uno sfondo trasparente.Come potrei ritagliare programmaticamente un'immagine su una forma non rettangolare?

Diciamo per esempio che voglio fare una foto della bandiera dell'Idaho e ritagliarla nella forma dello stato dell'Idaho. Immagino che avrei fatto qualcosa di simile:

  1. creare un'immagine che ha pixel opachi per la forma di Idaho, pixel trasparenti in qualsiasi altro luogo
  2. leggere e memorizzare qualche tipo di bitmap per questa immagine dello stato dell'Idaho
  3. per ciascuna posizione di pixel opaca l'immagine stato Idaho negli, copiare il pixel corrispondente dall'immagine bandiera di stato Idaho e posizionarlo su una tela bianca, trasparente

Fase 1 sarebbe ovviamente essere fatto manualmente, ma il resto sarebbe fatto programatically. Penso di avere l'idea giusta in generale, ma non so come mi avvicinerei allo specifico. Qualcuno può indicarmi la giusta direzione?

Per quanto riguarda la tecnologia di implementazione, sono un ragazzo PHP, quindi usare gdLibrary o qualcosa che funziona con PHP sarebbe probabilmente il modo migliore per me di andare.

+0

È necessario aggiungere il tag php alla domanda – wich

risposta

2

Penso che sarebbe molto più semplice fare semplicemente aggiungendo una maschera di bit o un canale alfa. In tal caso, si utilizzerà un'immagine maschera negativa della forma e quindi si applica semplicemente all'immagine normale come maschera e quindi si salva in un formato trasparente. Non l'ho mai fatto con GD o ImageMagick, ma penso che sia disponibile come suggerisce Jerry.

Acutally ecco un post sul blog formano una domanda simile in modo che potrebbe aiutare: http://about.phalacee.com/geek/creating-mask-layers-using-php-gd

2

Il solito modo di fare qualcosa di simile sarebbe usare il bianco (tutti 1) e il nero (tutti gli 0) per il contorno invece che trasparente e opaco. Quindi tu E quell'immagine con l'immagine che stai cercando di ritagliare. Il risultato sono 0 in cui l'immagine del profilo aveva 0 e l'altra in cui il profilo aveva 1.

Potrebbe anche essere necessario invertire l'immagine del profilo e AND la versione invertita con l'immagine di sfondo. Quindi, OPPURE l'immagine di sfondo con l'immagine in primo piano per produrre un composito dell'immagine in primo piano a forma di Idaho (per usare il tuo esempio) e l'immagine di sfondo ovunque.

A seconda delle funzionalità della libreria che si sta utilizzando, ci sono buone probabilità che il tipo di capacità sia direttamente disponibile. Ad esempio, Windows ha questa funzionalità nella funzione MaskBlt.

1

in PHP usando ImageMagick è probabilmente la soluzione migliore:

$source = IMagick("sourcefile"); 
$mask = IMagick("maskfile"); 
$mask->adaptiveResizeImage($source->getImageWidth(), $source->getImageHeight(), true); 
$source->compositeImage($mask, imagick::COMPOSITE_MULTIPLY, 0, 0); 
$source->writeImage("newfile"); 
$source->clear(); 
$source->destroy(); 

sourcefile deve essere l'immagine di origine come ti piace , maskfile deve essere un file maschera che ha il canale alfa impostato correttamente per la forma desiderata.