if (is_uploaded_file($_FILES['image_field']['tmp_name'])) {
switch(strtolower($_FILES['image_field']['type']))
{
case 'image/jpeg':
$image = imagecreatefromjpeg($_FILES['image_field']['tmp_name']);
break;
case 'image/png':
$image = imagecreatefrompng($_FILES['image_field']['tmp_name']);
break;
case 'image/gif':
$image = imagecreatefromgif($_FILES['image_field']['tmp_name']);
break;
default:
exit('Unsupported type: '.$_FILES['image_field']['type']);
}
$max_width = 335;
$max_height = 225;
$old_width = imagesx($image);
$old_height = imagesy($image);
$scale = min($max_width/$old_width, $max_height/$old_height);
$new_width = ceil($scale*$old_width);
$new_height = ceil($scale*$old_height);
$render = imagecreatetruecolor($new_width, $new_height);
imagealphablending($render, false);
imagesavealpha($render,true);
$transparent = imagecolorallocatealpha($render, 255, 255, 255, 127);
imagefilledrectangle($render, 0, 0, $new_width, $new_height, $transparent);
imagecopyresampled($render, $image, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height);
}
因为我想要上传图片,使用最大高度或最大宽度调整大小,然后以使用新尺码创建的新黑色图片为中心。
图片已调整大小,但我有两个问题
1)图像与调整大小的图像左侧对齐(335x225) 2)黑色背景位于图像右侧
由于
答案 0 :(得分:-1)
如果您使用PHP的默认函数而不使用包装器,那么看起来图像操作会让您感到沮丧并让您想要拔掉头发。
我知道这不是很多,但在使用PHP图像和GD / GD2时,我更喜欢使用一个小的包装类。
我多年来一直在使用Tyler的简单PHP框架,这正是原因所在。看看下面的GD类: https://github.com/tylerhall/simple-php-framework/blob/master/includes/class.gd.php
它的用法示例如下:
// Fire up GD and resample the image
require("path/class.gd.php");
// This would be the file system path of the image /var/www/img/myimg.jpg
$GD = new GD($_FILES['image_field']['tmp_name']);
$width = 335;
$heigh = 225;
$quality = 80; // % based as you know
// Scale it
$GD->cropCentered($width, $height);
// TO SAVE TO FILESYSTEM
$GD->saveAs($localFile, 'jpg', $quality);
// TO PRINT OUT DIRECTLY
$GD->output('jpg', $quality);
多年来我一直没有黑条问题:-D。就像我说的这只是一个例子,我相信很多人会有不同的方式来做这件事。只要它提供您想要的输出。
注意缩放/调整图像大小非常昂贵,尤其是对于大型图像。尝试并且只执行一次,保存文件,而不是检查保存的文件是否存在,然后动态地从大图像调整大小。