CMS で使用できるように、画像をアップロード、サイズ変更、保存するかなり古いコードがあります。
何らかの理由で8ビットPNGに変換するため、24ビット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 を使用して修正しました。