我如何才能使透明gif和png工作?
function resizeImage($image,$newImage,$target_width,$target_height, $type="") {
if (is_file($image)) {
if($type == ".gif"){
$image_org=@imagecreatefromgif($image);
}else{
$image_org=@imagecreatefromjpeg($image);
}
if ($image_org) {
list($w,$h,$type,$attr) = getimagesize($image);
$factor=C_Image_Custom::calcRescaleFactor($w,$h,$target_width,$target_height);
if ($factor>1) {
$image_w = $w / $factor;
$image_h = $h / $factor;
} else {
$image_w = $w;
$image_h = $h;
}
//Note: PHP with GD2.0 required for imagecreatetruecolor
$img_copy = imagecreatetruecolor($image_w, $image_h);
imagecopyresampled($img_copy, $image_org, 0, 0, 0, 0, $image_w, $image_h, $w, $h);
if (@imagejpeg($img_copy, $newImage, 80)) {
chmod($newImage,0777);
} else {
echo("<b>Error: </b>Unable to create image $newImage. Check directory permissions.");
}
imagedestroy($image_org);
imagedestroy($img_copy);
}
}
答案 0 :(得分:4)
这个功能非常适合我调整jpg和透明(或不透明)gif的大小:
function resizeImage($originalImage, $toWidth, $toHeight, $isJPG)
{
// Get the original geometry and calculate scales
list($width, $height) = getimagesize($originalImage);
$xscale = $width / $toWidth;
$yscale = $height / $toHeight;
// Recalculate new size with default ratio
if ($yscale > $xscale) {
$new_width = round($width * (1 / $yscale));
$new_height = round($height * (1 / $yscale));
} else {
$new_width = round($width * (1 / $xscale));
$new_height = round($height * (1 / $xscale));
}
// Resize the original image
if ($isJPG) {
$imageResized = imagecreatetruecolor($new_width, $new_height);
$imageTmp = imagecreatefromjpeg($originalImage);
imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
} else {
//$imageResized = imagecreatetruecolor($new_width, $new_height);
//$imageTmp = imagecreatefromgif ($originalImage);
//imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
# what follows is for resizing a gif, transparent or not
# http://ru2.php.net/imagecopyresampled
# load/create images
$imageTmp = imagecreatefromgif($originalImage);
$imageResized = imagecreatetruecolor($new_width, $new_height);
imagealphablending($imageResized, false);
# get and reallocate transparency-color
$transindex = imagecolortransparent($imageTmp);
if ($transindex >= 0) {
$transcol = imagecolorsforindex($imageTmp, $transindex);
$transindex = imagecolorallocatealpha(
$imageResized,
$transcol['red'],
$transcol['green'],
$transcol['blue'],
127
);
imagefill($imageResized, 0, 0, $transindex);
}
# resample
imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
# restore transparency
if ($transindex >= 0) {
imagecolortransparent($imageResized, $transindex);
for ($y = 0; $y < $new_height; ++$y) {
for ($x = 0; $x < $new_width; ++$x) {
if (((imagecolorat($imageResized, $x, $y) >> 24) & 0x7F) >= 100) {
imagesetpixel(
$imageResized,
$x,
$y,
$transindex
);
}
}
}
}
# save GIF
imagetruecolortopalette($imageResized, true, 255);
imagesavealpha($imageResized, false);
}
return $imageResized;
}
原始函数来自PhpToys 1.0,使用透明.gifs的部分来自this PHP docs comment。
答案 1 :(得分:2)
看起来你只输出到jpeg - 它没有透明度。如果要输出透明度,则需要输出gif或png。
如果你想用颜色替换透明度,我想你想要php函数imagecolorallocatealpha
答案 2 :(得分:2)
我有同样的问题,透明度只是不适用于PNG,当它与PNG一起工作时它只是没有GIF,我一直在寻找解决方案,直到我发现这个功能“{{3 }}“
$info = getimagesize($file);
switch ( $info[2] ) {
case IMAGETYPE_GIF: $image = imagecreatefromgif($file); break;
case IMAGETYPE_JPEG: $image = imagecreatefromjpeg($file); break;
case IMAGETYPE_PNG: $image = imagecreatefrompng($file); break;
default: return false;
}
# This is the resizing/resampling/transparency-preserving magic
$image_resized = imagecreatetruecolor( $final_width, $final_height );
if ( ($info[2] == IMAGETYPE_GIF) || ($info[2] == IMAGETYPE_PNG) ) {
$transparency = imagecolortransparent($image);
if ($transparency >= 0) {
$transparent_color = imagecolorsforindex($image, $trnprt_indx);
$transparency = imagecolorallocate($image_resized, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
imagefill($image_resized, 0, 0, $transparency);
imagecolortransparent($image_resized, $transparency);
}
elseif ($info[2] == IMAGETYPE_PNG) {
imagealphablending($image_resized, false);
$color = imagecolorallocatealpha($image_resized, 0, 0, 0, 127);
imagefill($image_resized, 0, 0, $color);
imagesavealpha($image_resized, true);
}
}
imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $final_width, $final_height, $width_old, $height_old);
某些变量只有很小的错误,所以你必须按如下方式分配它们以删除$ trnprt_indx和$ trnprt_color的错误
$trnprt_color['red'] = 255;
$trnprt_color['green'] = 255;
$trnprt_color['blue'] = 255;
$trnprt_indx = 127;
希望这会对你有所帮助
答案 3 :(得分:0)
为什么只有一个jpeg?
这也适用于gif:
if($type == ".gif"){
$image_org=@imagecreatefromgif($image);
}else{
$image_org=@imagecreatefromjpeg($image);
}
答案 4 :(得分:0)
这真的很旧,但如果其他人像我一样难以理解,这里有对我有用的解释:
<?php
$sourceImage = imagecreatefromgif('./enjoy.gif');
$newWidth = 220;
$newHeight = 120;
//Blank canvas
$destImage = imagecreatetruecolor($newWidth, $newHeight);
$transColorIndex = imagecolortransparent($sourceImage);
// Returns the index of the transparent color: 119
$transRGBColor = imagecolorsforindex($sourceImage, $transColorIndex);
//Returns the RGB of the index color: [red] => 255 [green] => 255 [blue] => 255 [alpha] => 127
//In this case it's white but can be anaything
$transGdColor = imagecolorallocate($destImage, $transRGBColor['red'], $transRGBColor['green'], $transRGBColor['blue']);
// Returns: 16777215 //A GD color identifier created with imagecolorallocate().
imagefill($destImage, 0, 0, $transGdColor);
//Fills the blank image with that color
imagecolortransparent($destImage, $transGdColor);
//Sets that color as transparent
//Resample
imagecopyresampled($destImage, $sourceImage, 0, 0, 0, 0, $newWidth, $newHeight, imagesx($sourceImage), imagesy($sourceImage));
header ( 'Content-type:image/gif' );
imagegif($destImage);