При изменении размера градаций серого PNG появляются белые линии - PullRequest
2 голосов
/ 13 января 2011

При изменении размеров некоторых изображений в формате png они выглядят растянутыми и имеют вид вертикального чередования.Я не уверен, где может быть проблема, однако я начинаю думать, что это потому, что изображение начинается в оттенках серого и должно иметь другой цветовой профиль.

Любая помощь или предложения будут очень признательны.

function createImageSize($sourcefile, $setNewName, $maxwidth, $maxheight, $quality){

    $fileInfoArray = @getimagesize($sourcefile);
    $imagetype = $fileInfoArray['mime'];

    list($width, $height, $attr) = getimagesize($sourcefile);

    switch($imagetype){
        case 'image/jpeg':
            $img = imagecreatefromjpeg($sourcefile);
            break;

        case 'image/gif':
            $img = imagecreatefromgif($sourcefile);
            break;

        case 'image/png':
            $img = imagecreatefrompng($sourcefile);
            break;

        case 'image/x-png':
            $img = imagecreatefrompng($sourcefile);
            break;
    }

    if ($width > $maxwidth || $height > $maxheight){   
        if ( $width > $height ){
            $newwidth = $maxwidth;
            $ratio = $maxwidth / $width;
            $newheight = floor($height * $ratio);

            if ($newheight > $maxheight){
                $newheight = $maxheight;
                $ratio = $maxheight / $height;
                $newwidth = floor($width * $ratio);
            }
        }else{
            $newheight = $maxheight;
            $ratio = $maxheight / $height;
            $newwidth = floor($width * $ratio);

            if ($newwidth > $maxwidth){
                $newwidth = $maxwidth;
                $ratio = $maxwidth / $width;
                $newheight = floor($height * $ratio);
            }
        }
    }else{
        $newwidth = $width;
        $newheight = $height;
    }   

    $tmpimg = imagecreatetruecolor( $newwidth, $newheight );

    if($imagetype == 'image/png'||$imagetype == 'image/x-png'){
        imagealphablending($tmpimg, false);
        imagesavealpha($tmpimg, true);

        if($imagetype == 'image/gif'){
            $transparent = imagecolorallocatealpha($tmpimg, 0, 0, 0, 127);
            imagecolortransparent($tmpimg, $transparent);
        }

        imagefilledrectangle($tmpimg, 0, 0, $newwidth, $newheight, $transparent);
    }

    imagecopyresampled( $tmpimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height );

    switch($imagetype){
        case 'image/jpeg':
            imagejpeg($tmpimg, $setNewName, $quality);
            break;

        case 'image/gif':
            imagegif($tmpimg, $setNewName);
            break;

        case 'image/png':
            imagepng($tmpimg, $setNewName, 3);
            break;

        case 'image/x-png':
            imagepng($tmpimg, $setNewName, 3);
            break;
    }
    imagedestroy($tmpimg);
    imagedestroy($img);
}

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

У меня была такая же проблема.При создании файлов EPS в прозрачных файлах PNG (для использования в качестве маскирующих изображений позже) iMagick создал файлы PNG в градациях серого.Когда GD читает PNG в градациях серого, он удваивает их по горизонтали с вертикальными линиями внутри них.

Мое решение было обработано на стороне iMagic, заставив его записывать PNG как RGBA:

перед:

$image->setImageFileName("image.png");

После:

$image->setImageFileName("png32:image.png");

Я не знаю, откуда берутся ваши PNG в градациях серого, но если вы их генерируете, убедитесь, что они созданы RGBA.В противном случае, возможно, есть способ правильно прочитать их с помощью GD, указав источник в градациях серого.

0 голосов
/ 26 января 2011

У меня та же проблема, и я до сих пор не нашел решений. Казалось бы, GD не любит изображения в оттенках серого PNG8 и интерпретирует их как цветные.

Возможно, мне придется преобразовать изображение обратно в 24 бита, используя «convert» с помощью exec (), а затем удалить изображение, но оно далеко от оптимального.

...