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

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.

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

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!