2014-11-07 17 views
6

Jaki jest najlepszy sposób poprawienia czarnego tła podczas konwersji wielostronicowego pliku PDF na JPG z rozszerzeniem php Imagick?Czarne tło podczas konwersji wielostronicowego pliku PDF na JPG z rozszerzeniem php Imagick

Po to kod używany w mojej aplikacji:

$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 świadoma, że ​​metoda flattenImage może być stosowany do usuwania czarne tło, takich jak w:

$imagick = $imagick->flattenImages(); 

Ale kiedy plik ma więcej stron, metoda flattenImages umieszcza wszystkie strony na tym samym obrazie, dlatego wynik jest kopią ostatniej strony we wszystkich wygenerowanych plikach JPG.

Doceniam, jeśli ktoś może mi pomóc.

+0

Czy możesz wysłać przykładowy plik PDF? – Danack

+0

Oto przykład: http://www.faceo.com.br/temp/Manual%20Split%20hiwall%20YORK-1.pdf oraz jeden z wygenerowanych plików jpgs: http: //www.faceo .com.br/temp/Manual% 20Split% 20hiwall% 20YORK-1.pdf-10.jpg – fcaserio

+1

Er, brak nacisku ... ale jeśli to rozwiązało twój problem, jak kliknięcie tego przycisku akceptacji? ;-) – Danack

Odpowiedz

6

kod Praca pierwsze - wyjaśnienie do naśladowania:

Ten kod działa, ale jest bardzo powolna:

$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"); 
} 

Ten kod działa i jest szybki:

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"); 
} 

Co moim zdaniem jest dzieje się tak, gdy chodzi o zapisanie obrazu ImageMagick:

  • Konwersja poszczególnych warstw do JPG
  • Scal je jedna na drugiej.

Dla każdej z warstw, która ma przezroczystość, ponieważ JPG nie obsługuje przezroczystości, renderuje przezroczystość jako czarną, a następnie ją łączy. Powyższy kod sprawia, że ​​kompozycja jest wykonywana we właściwej kolejności.

Alternatywnym sposobem rozwiązania problemu jest umieszczenie wyniku jako PNG. Ponieważ obsługuje przezroczystość, poszczególne warstwy z przezroczystością są połączone poprawnie, a następnie można przekonwertować ostateczny obraz do JPG, jeśli naprawdę tego chciałeś.

Używanie formatu PNG jako formatu pośredniego może również dawać nieco wyższą jakość, ponieważ może pominąć krok "zapisz do JPG i dekoduj". Zalecam używanie PNG w twoim obiegu pracy, gdy tylko jest to możliwe, a następnie konwersję do JPG tylko wtedy, gdy wyświetlasz plik użytkownikowi końcowemu, jeśli naprawdę potrzebujesz dodatkowej kompresji.

+0

Człowiek Tks, dobre rozwiązanie, aby umieścić obraz na górze nowego białego płótna! – fcaserio

+0

Nadal miałem problem z czarnym tłem pojawiającym się na stronie (dla mnie była to ostatnia strona z tekstem + obrazkiem). Zastąpienie 'Imagick :: COMPOSITE_ATOP' przez' Imagick :: COMPOSITE_OVER' wydaje się naprawić – MarcinWolny

Powiązane problemy