Проблема преобразования PHP PNG в JPG, изображение искажено - PullRequest
0 голосов
/ 09 марта 2012

У меня есть скрипт, который загружает и изменяет размеры изображений, используя библиотеку GD и PHP.Теперь я хочу загрузить изображение в формате PNG и сохранить его в формате PNG и JPEG, затем я изменю его размер, но это нормально.

Проблема, с которой я сталкиваюсь, заключается в том, что иногда преобразованная версияизображение (jpg) искажено.В других случаях это нормально.

Мой код взят из другого ответа здесь, на StackOverflow:

function png2jpg($originalFile, $outputFile, $quality){
    $image = imagecreatefrompng($originalFile);
    imagejpeg($image, $outputFile, $quality);
    imagedestroy($image);
}

Пример искаженного результата показан ниже, я полностью осознаю, что выиграл 'чтобы получить прозрачность в JPG, я просто хочу белый фон.Любые идеи?

Я не могу публиковать изображения, поэтому ссылка на оригинал: http://private.granvilleoil.com/prodImages/large/Petro-Patch.png) и JPG: http://private.granvilleoil.com/prodImages/large/Petro-Patch.jpg)

Ответы [ 5 ]

2 голосов
/ 09 марта 2012

Вам необходимо создать новое изображение с белым (или любым другим) фоном и скопировать непрозрачные пиксели из png в это изображение:

function png2jpg($originalFile, $outputFile, $quality) {
    $source = imagecreatefrompng($originalFile);
    $image = imagecreatetruecolor(imagesx($source), imagesy($source));

    $white = imagecolorallocate($image, 255, 255, 255);
    imagefill($image, 0, 0, $white);

    imagecopy($image, $source, 0, 0, 0, 0, imagesx($image), imagesy($image));

    imagejpeg($image, $outputFile, $quality);
    imagedestroy($image);
    imagedestroy($source);
}
0 голосов
/ 24 марта 2012

Была библиотека, с которой я сталкивался в http://www.phpclasses.org/, которая в основном является оболочкой над библиотекой GD PHP.Это называлось GDImageManipulation или что-то.Это простой файловый класс, и он обрабатывает большинство предварительных операций с изображениями, о которых вы говорите.

Взгляните на это.Это может помочь.

0 голосов
/ 09 марта 2012

Формат JPG не поддерживает прозрачные пиксели.

Вместо этого вы можете заменить прозрачные пиксели на белый / черный, а затем выполнить преобразование:

function png2jpg($originalFile, $outputFile, $quality){
    $size = getimagesize($originalFile);
    $blank = imagecreate($size[0], $size[1]);
    $newImage = imagecopymerge($blank, $originalFile, 0, 0, 0, 0, $size[0], $size[1], $quality);
    png2jpg($newImage, $outputFile, );
    $image = imagecreatefrompng($newImage);
    imagejpeg($image, $outputFile, $quality);
}
0 голосов
/ 09 марта 2012

Возможно, если вы попытаетесь сделать изображение из png поверх белого изображения, вы можете исправить эту проблему.

0 голосов
/ 09 марта 2012

PHP будет копировать только пиксели из файлов PNG, и если ваш png имеет прозрачность, это не будет обрабатываться PHP, что приведет к тому, что вы увидите после преобразования.

...