我有一个php脚本,可动态生成较大图像的缩略图,而无需将其存储在Web服务器上。问题是当图像是透明GIF图像时,生成的缩略图不是透明的。它为透明PNG格式图像正确生成透明缩略图。唯一的问题是GIF图像的透明度。 这是脚本:
<?php
//ex . <img src="thumb.php?p=pp.png&q=4&w=60"/>
if(!isset($_GET['p'])){exit;}
if(!isset($_GET['h']) && !isset($_GET['w'])){
list($w,$h,$type,$attr) = getimagesize($_GET['p']);
$_GET['w'] = $w;
$_GET['h'] = $h;
}else if(!isset($_GET['w'])){
$_GET['w'] = 0;
}else if(!isset($_GET['h'])){
$_GET['h'] = 0;
}
if(!isset($_GET['q'])){$_GET['q'] = 100;}
$info = pathinfo($_GET['p']);
switch($info['extension']){
case 'gif' : $t = 1; break;
case 'jpg' : $t = 2; break;
case 'png' : $t = 3; break;
}
if($t==1){
header("Content-Type: image/gif");
$img = imagecreatefromgif($_GET['p']);
}else if($t==2){
header("Content-Type: image/jpg");
$img = imagecreatefromjpeg($_GET['p']);
}else if($t==3){
header("Content-Type: image/png");
$img = imagecreatefrompng($_GET['p']);
}else{
exit;
}
$orSize = orSize($img);
$th = thSize($orSize,$_GET['w'],$_GET['h']);
$tmp_img = imagecreatetruecolor( $th['w'],$th['h'] );
//if image is GIF or PNG format, produce transparent images
if ($t==1 || $t==3) {
imagealphablending($tmp_img, false);
imagesavealpha($tmp_img, true);
if ($t==3)
{
$source = imagecreatefrompng($_GET['p']);
}
else {
$source = imagecreatefromgif($_GET['p']);
}
imagealphablending($source, true);
imagecopyresampled($tmp_img, $source, 0, 0, 0, 0, $th['w'], $th['h'], $orSize['w'], $orSize['h'] );
}else{
imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $th['w'], $th['h'], $orSize['w'], $orSize['h'] );
}
if(isset($_GET['s'])){
//S VAR OUTPUTS IT AS DIFFERENT FORMAT
$t = $_GET['s'];
}
if(!isset($_GET['save'])){
//SAVE VAR NEEDS TO BE THE PATH TO SAVE TO AND FILENAME
$_GET['save'] = null;
}
if($t==1){
imagegif($tmp_img,$_GET['save'],$_GET['q']);
}else if($t==2){
imagejpeg($tmp_img,$_GET['save'],$_GET['q']);
}else if($t ==3){
$_GET['q'] = 10 - ($_GET['q'] /= 10);
imagepng($tmp_img,$_GET['save'],$_GET['q']);
}
imagedestroy($tmp_img);
function orSize($img){
$orSize['w'] = imagesx($img);
$orSize['h'] = imagesy($img);
return $orSize;
}
function thSize($orSize,$w,$h){
$th = Array();
if($w!=0 && $h == 0){
$th['w'] = $w;
$th['h'] = floor( $orSize['h'] * ( $w / $orSize['w'] ) );
}else if($w==0 && $h != 0){
$th['h'] = $h;
$th['w'] = floor( $orSize['w'] * ( $h / $orSize['h'] ) );
}else{
$th['w'] = $w; $th['h'] = $h;
}
return $th;
}
?>
脚本的工作方式如下,生成缩略图只需传递图像名称,如下所示:
<img src="thumb.php?p=image.png&q=4&w=60"/>
如何让这个脚本生成GIF透明图像的透明缩略图? 生成透明图像的线条如下:
// if $t is gif or png image
if ($t==1 || $t==3) {
imagealphablending($tmp_img, false);
imagesavealpha($tmp_img, true);
if ($t==3)
{
$source = imagecreatefrompng($_GET['p']);
}
else {
$source = imagecreatefromgif($_GET['p']);
}
imagealphablending($source, true);
imagecopyresampled($tmp_img, $source, 0, 0, 0, 0, $th['w'], $th['h'], $orSize['w'], $orSize['h'] );
}else{
imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $th['w'], $th['h'], $orSize['w'], $orSize['h'] );
}
答案 0 :(得分:1)
在写入图像之前,请务必使用imagesavealpha
。