2012-07-09 52 views
0

我們有一些相當老的代碼,它們可以上傳,調整大小然後保存圖像,以便在我們的CMS中使用它。PHP Image上傳器將PNG轉換爲8位

這一切工作正常,除非我們上傳一個24位PNG,由於某種原因將其轉換爲8位PNG,無論如何修復這個?

附件中是有問題的功能:

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 ; 

}

謝謝你們,現在我已經用get_png_imageinfo & imagecreatetruecolor定了!

回答

2

imagecreate使用最大尺寸爲256色的顏色表創建基於調色板的圖像。

imagecreatetruecolor沒有這樣的限制,但當然存在文件大小倍增的缺點。