上传调整大小和中心图像

时间:2015-01-23 18:32:26

标签: php image image-uploading

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)黑色背景位于图像右侧

由于

1 个答案:

答案 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。就像我说的这只是一个例子,我相信很多人会有不同的方式来做这件事。只要它提供您想要的输出。

注意缩放/调整图像大小非常昂贵,尤其是对于大型图像。尝试并且只执行一次,保存文件,而不是检查保存的文件是否存在,然后动态地从大图像调整大小。