douchun2158 2012-07-09 10:56
浏览 44
已采纳

PHP图像上传器将PNG转换为8位

We have some fairly old code which uploads, resizes and then saves an image so it can be used in our CMS.

It all works fine unless we upload a 24bit PNG, as for some reason its converting it to an 8bit PNG, anyway of fixing this?

Attached is the function in question:

function resize_png( $origfile,$newfile,$endh,$endw,$imagequal,$crop,$watermrkimg=false) {

    $imagequal = floor($imagequal/10);          //needed to give a quality of between 0-9 as required by php5 (php4 allowed 0-99)

$return_val = 1;
if (!$return_val = ( ($img = ImageCreateFromPNG ( $origfile )) && $return_val == 1 ) ? "1" : "0" ) {
    quit_on_error ("Your picture is corrupt, please try resaving it or uploading another picture","Image Error",'1');
}

// 1. get transparent colour
$colorTransparent = imagecolortransparent($img);

$origw = imagesx ($img);                                                            // Original image width
$origh = imagesy ($img);                                                            // Original image height

$ratiow = $origw / $endw;                                                   //get ratios of current dimension against min dimension
$ratioh = $origh / $endh;

if ($ratiow == $ratioh) {                                                       //if image is already correctly proportioned
    $neww = round($origw / $ratiow);
    $newh = round($origh / $ratioh);
    $offsetw = '0';
    $offseth = '0';
}
elseif ($ratioh < $ratiow) {                                                    // if image is wide

    if ($crop == '1')
    {
        $neww = round($origw / $ratioh);                                        // this will be too wide
        $newh = round($origh / $ratioh);                                        // this will be perfect
    }
    else {
        $neww = round($origw / $ratiow);                                        // this will be perfect
        $newh = round($origh / $ratiow);                                        // this will be to short
    }

    $offseth = '0';                                                             // as height perfect
    $offsetw = round(($neww - $endw) / 2);                                      // horizontally centred
}
else  {                                                                         // if image is tall
    if ($crop == '1')
    {
        $neww = round($origw / $ratiow);                                            // this will be perfect
        $newh = round($origh / $ratiow);                                            // this will be too tall
    }
    else
    {
        $neww = round($origw / $ratioh);                                            // this will be too thin
        $newh = round($origh / $ratioh);                                            // this will be perfect

    }
    $offsetw = '0';                                                             // as width perfect
    $offseth = round(($newh - $endh) / 2);                                      // vertically centred
}

if($crop != '1')            // If original is smaller then don't resize at all, then quality will be better
{                           // ... unless of course we are cropping for a thumbnail, then we want to be resized up ...
    if (($origw < $neww) && ($origh < $newh))
    {
         $neww = $origw;
        $newh = $origh;
    }
}

$resized_id = ImageCreate( $neww , $newh );                                     // create an image to resize the image proportionally

// 2. Set transparent colour
imagepalettecopy($resized_id, $img);
imagefill($resized_id,0,0,$colorTransparent);
imagecolortransparent($resized_id,$colorTransparent);

ImageCopyResampled( $resized_id, $img,                                          // resize image - no cropping, so may be too big in one dimension
                0,0,                                                            // dst x,y
                0,0,                                                            // src LR,UD
                $neww, $newh,
                $origw, $origh );

if ($crop == '1')
{
    $resized_cropped_id = ImageCreate( $endw , $endh );                             // create an image to crop the oversized dimension

    // 2. Set transparent colour for cropped image
    imagepalettecopy($resized_cropped_id, $img);
    imagefill($resized_cropped_id,0,0,$colorTransparent);
    imagecolortransparent($resized_cropped_id,$colorTransparent);

    ImageCopyResampled( $resized_cropped_id, $resized_id,                               // crop image - so right size
                    0,0,                                                            // dst x,y
                    $offsetw,$offseth,                                              // src LR,UD
                    $endw, $endh,
                    $endw, $endh);


    $return_val = ( $full = ImagePNG( $resized_cropped_id, $newfile, $imagequal )   // save jpeg to destination
                 && $return_val == 1 ) ? "1" : "0";
     ImageDestroy( $resized_cropped_id );
}
else
{
    $return_val = ( $full = ImagePNG( $resized_id, $newfile, $imagequal )   // save jpeg to destination
                 && $return_val == 1 ) ? "1" : "0";

}

ImageDestroy( $resized_id );                                                    // wipe memory for temp images
ImageDestroy( $img );

return ($return_val) ? TRUE : FALSE ;

}

Thanks guys I have now fixed it by using get_png_imageinfo & imagecreatetruecolor!

  • 写回答

1条回答 默认 最新

  • douduiwei2831 2012-07-09 10:59
    关注

    imagecreate creates a pallette-based image, using a colour table with a maximum size of 256 colours.

    imagecreatetruecolor has no such limit, but of course comes with the downside of being many times bigger in filesize.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值