当出现调整灰度级PNG白线时

时间:2011-01-13 07:26:18

标签: php image png gd resize

当调整某些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 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。在将EPS文件生成透明PNG文件(以后用作遮罩图像)时,iMagick将PNG文件创建为灰度。当GD读取灰度PNG时,它会在水平方向上加倍,并在其中加上垂直线。

我的解决方案是在iMagic方面处理的,强迫它将PNG写为RGBA:

之前:

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

后:

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

我不知道您的灰度PNG来自哪里,但如果您要生成它们,请确保它们是RGBA。否则,可能有一种方法可以正确地使用GD读取它们,指定灰度源。

答案 1 :(得分:0)

我有同样的问题,但仍未找到任何解决方案。 GD似乎不喜欢灰度PNG8图像并且正在解释为彩色。

我可能必须使用exec()使用“convert”将图像转换回24位,然后删除图像,但它远非最佳。