2014-11-07 16 views
6

Qual è il modo migliore per correggere lo sfondo nero quando si converte PDF multipagina in JPG con l'estensione php Imagick?Sfondo nero durante la conversione di PDF multipagina in JPG con estensione php Imagick

seguito è il codice utilizzato relativa alla mia domanda:

$imagick = new Imagick($file); 
    $imagick->setResolution(150,150); 
    $imagick->setImageFormat("jpg"); 
    $imagick->setImageCompression(imagick::COMPRESSION_JPEG); 
    $imagick->setImageCompressionQuality(70); 
    foreach ($imagick as $c => $_page) { 
     $_page->setImageBackgroundColor('white'); 
     $_page->adaptiveResizeImage($maxsize,$maxsize,true); 
     $_page->writeImage("$file-$c.jpg"); 
    } 

I'am consapevole del fatto che il metodo flattenImage può essere usato per rimuovere lo sfondo nero, come ad esempio in:

$imagick = $imagick->flattenImages(); 

Ma quando il il file ha più pagine, il metodo flattenImages colloca tutte le pagine sulla stessa immagine e quindi il risultato è una copia dell'ultima pagina in tutti i JPG generati.

Apprezzo se qualcuno può aiutarmi.

+0

Sei in grado di pubblicare un PDF di esempio? – Danack

+0

Certo, ecco un esempio: http://www.faceo.com.br/temp/Manual%20Split%20hiwall%20YORK-1.pdf e uno dei jpg generati: http: //www.faceo .com.br/temp/Manual% 20Split% 20hiwall% 20YORK-1.pdf-10.jpg – fcaserio

+1

Er, nessuna pressione ... ma se è stato risolto il problema, come si fa a fare clic su quel pulsante di accettazione? ;-) – Danack

risposta

6

codice di lavoro prima - spiegazione a seguire:

Questo codice funziona, ma è incredibilmente lento:

$file = "./YORK.pdf"; 

$maxsize = 500; 

$imagick = new Imagick($file); 
$imagick->setResolution(150,150); 
$imagick->setImageFormat("jpg"); 
$imagick->setImageCompression(imagick::COMPRESSION_JPEG); 
$imagick->setImageCompressionQuality(70); 

foreach ($imagick as $c => $_page) { 
    $_page->setImageBackgroundColor('white'); 
    $_page->adaptiveResizeImage($maxsize,$maxsize,true); 
    $_page->setImageCompose(\Imagick::COMPOSITE_ATOP); 
    $_page->flattenImages(); 
    $_page->writeImage("$file-$c-compose.jpg"); 
} 

questo codice funziona ed è veloce:

foreach ($imagick as $c => $_page) { 
    $_page->setImageBackgroundColor('white'); 
    $_page->adaptiveResizeImage($maxsize,$maxsize,true); 
    $blankPage = new \Imagick(); 
    $blankPage->newPseudoImage($_page->getImageWidth(), $_page->getImageHeight(), "canvas:white"); 
    $blankPage->compositeImage($_page, \Imagick::COMPOSITE_ATOP, 0, 0); 
    $blankPage->writeImage("$file-$c.jpg"); 
} 

Quello che penso è Succede che quando si tratta di scrivere l'immagine che ImageMagick sta facendo:

  • Converti i singoli livelli in JPG
  • Uniscili uno sopra l'altro.

Per ciascuno dei livelli con trasparenza perché JPG non supporta la trasparenza, rende la trasparenza come nera e quindi la unisce. Il codice sopra rende il compositing fatto nell'ordine corretto.

Un modo alternativo per risolvere il problema consiste nel mettere l'output in formato PNG. Poiché supporta la trasparenza, i singoli livelli con trasparenza vengono uniti correttamente e quindi potresti convertire l'immagine finale in JPG se lo desideri.

L'utilizzo di PNG come formato intermedio può anche produrre un output di qualità leggermente superiore, poiché potrebbe saltare un passaggio "salva in JPG e decodifica". Consiglio di utilizzare PNG nel flusso di lavoro, laddove possibile, e quindi di convertirli in JPG solo quando servi un file a un utente finale se hai davvero bisogno di un ulteriore bit di compressione.

+0

Tks man, buona soluzione per mettere l'immagine su una nuova tela bianca! – fcaserio

+0

Ho ancora avuto problemi con uno sfondo nero che appare in una pagina (per me era l'ultima pagina con testo + immagine). Sostituire 'Imagick :: COMPOSITE_ATOP' con' Imagick :: COMPOSITE_OVER' sembra risolverlo – MarcinWolny

Problemi correlati