2011-07-07 16 views
9
$image = "[...]"; //binary string containing PNG image 
$file = fopen('image.tmp', 'wb'); 
fputs($file, $image); 
fclose($file); 
$image = new Imagick('PNG:image.tmp'); 
$image->thumbnailImage($width, $height); 
$image->setImageFormat('jpg'); 
$image->setCompressionQuality(97); 
$image->writeImage('image.jpg'); 

Powyższe nie działa i daje mi czarny obraz do obrazu this. Po wykonaniu tej czynności wszystko znowu działa poprawnie. Myślę, że musi coś zrobić z przezroczystym tłem, które nie jest dostępne w formacie JPG. Czy ktokolwiek może pomóc rozwiązać ten problem (wyobrażenie nie jest dobrze udokumentowane, więc nie wiem, jak sobie pomóc).php imagick przekonwertować PNG na jpg

Odpowiedz

15

znalazł rozwiązanie:

$white=new Imagick(); 
$white->newImage($width, $height, "white"); 
$white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0); 
$white->setImageFormat('jpg'); 
$white->writeImage('image.jpg'); 
+2

Jest to bardzo przydatne, gdy mamy do czynienia z plikami PDF, ponieważ metoda' flattenImages' resetuje stronę do ostatniej ... Dzięki @rabudde! – Roberto

0

spróbuj dodać $image->setBackgroundColor(0xFFFFFF); po $image = new Imagick('PNG:image.tmp');

+0

'Błąd krytyczny PHP: niezatapiany wyjątek 'ImagickException' z komunikatem ' Podany niepoprawny parametr ", zamiast tego używa" #ffffff ", nie powoduje awarii, ale nie pomaga również. 'setImageBackgroundColor' nie działa zbyt – rabudde

2

Można użyć setBackgroundColor ustawić domyślny kolor tła na coś innego niż czarny. Przejrzystość PNG zostanie zastąpiona kolorem tła podczas zapisywania do JPG.

Edit: Używaj go tak:

$img->setBackgroundColor(new ImagickPixel('#FFFFFF')); 
+0

Zobacz powyższy komentarz, to nie rozwiąże :( – rabudde

+0

Musisz przekazać obiekt ImagickPixel, a nie ciąg kolorów, jeśli masz Imagick <= 2.1. Zobacz moją zmienioną odpowiedź: –

+0

ve dodaje 'setBackgroundColor' zaraz po wywołaniu' new Imagick() '. Ale to nie wydaje się mieć żadnego skutku Używam PHP 5.3.6, ImageMagick 6.7.0, Imagick 3.1.0. – rabudde

5

Innym sposobem konwersji przezroczysty png do jpg, jak wspomniano w Imagick::flattenImages:

$im = new Imagick('image.png'); 
$im->setImageBackgroundColor('white'); 

$im->flattenImages(); // This does not do anything. 
$im = $im->flattenImages(); // Use this instead. 

$im->setImageFormat('jpg'); 
$im->writeImage('image.jpg'); 
+0

Wielkie dzięki, rozwiązał mój problem :) – kailash19

+0

Wiele Dzięki za ten wpis –