PHP - 创建缩略图并保持纵横比

标签 php image gd image-resizing

编辑:这可以在 CSS 中轻松完成,在撰写本文时我对 CSS 了解不多

enter image description here

我使用 PHP 创建了一个缩略图创建器。生成的缩略图应具有相同的大小。但问题是使用具有不同宽高比的上传图像,如横向或纵向,缩略图变得难看。所以我创建了上面的图片以进行澄清。无论上传的图片是什么,它都会被放入一个矩形图片中。因此纵横比不会改变,缩略图的大小也相同。任何人都可以帮助我或告诉我一些想法吗?

最佳答案

define('THUMBNAIL_IMAGE_MAX_WIDTH', 150);
define('THUMBNAIL_IMAGE_MAX_HEIGHT', 150);

function generate_image_thumbnail($source_image_path, $thumbnail_image_path)
{
    list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path);
    switch ($source_image_type) {
        case IMAGETYPE_GIF:
            $source_gd_image = imagecreatefromgif($source_image_path);
            break;
        case IMAGETYPE_JPEG:
            $source_gd_image = imagecreatefromjpeg($source_image_path);
            break;
        case IMAGETYPE_PNG:
            $source_gd_image = imagecreatefrompng($source_image_path);
            break;
    }
    if ($source_gd_image === false) {
        return false;
    }
    $source_aspect_ratio = $source_image_width / $source_image_height;
    $thumbnail_aspect_ratio = THUMBNAIL_IMAGE_MAX_WIDTH / THUMBNAIL_IMAGE_MAX_HEIGHT;
    if ($source_image_width <= THUMBNAIL_IMAGE_MAX_WIDTH && $source_image_height <= THUMBNAIL_IMAGE_MAX_HEIGHT) {
        $thumbnail_image_width = $source_image_width;
        $thumbnail_image_height = $source_image_height;
    } elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) {
        $thumbnail_image_width = (int) (THUMBNAIL_IMAGE_MAX_HEIGHT * $source_aspect_ratio);
        $thumbnail_image_height = THUMBNAIL_IMAGE_MAX_HEIGHT;
    } else {
        $thumbnail_image_width = THUMBNAIL_IMAGE_MAX_WIDTH;
        $thumbnail_image_height = (int) (THUMBNAIL_IMAGE_MAX_WIDTH / $source_aspect_ratio);
    }
    $thumbnail_gd_image = imagecreatetruecolor($thumbnail_image_width, $thumbnail_image_height);
    imagecopyresampled($thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height);

    $img_disp = imagecreatetruecolor(THUMBNAIL_IMAGE_MAX_WIDTH,THUMBNAIL_IMAGE_MAX_WIDTH);
    $backcolor = imagecolorallocate($img_disp,0,0,0);
    imagefill($img_disp,0,0,$backcolor);

        imagecopy($img_disp, $thumbnail_gd_image, (imagesx($img_disp)/2)-(imagesx($thumbnail_gd_image)/2), (imagesy($img_disp)/2)-(imagesy($thumbnail_gd_image)/2), 0, 0, imagesx($thumbnail_gd_image), imagesy($thumbnail_gd_image));

    imagejpeg($img_disp, $thumbnail_image_path, 90);
    imagedestroy($source_gd_image);
    imagedestroy($thumbnail_gd_image);
    imagedestroy($img_disp);
    return true;
}

generate_image_thumbnail('original_image.jpg', 'thumb_image.jpg'); //call the function

使用该代码,您将得到类似的东西

enter image description here

关于PHP - 创建缩略图并保持纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23148795/

相关文章:

python - 使用 PIL 保存图像但图像无法打开

PHP GD文字不流畅

php - 性能改进 PHP GD 调整大小和修剪图像背景以保持正确的比例

php - 无法使用 mysqli_query 插入数据库

javascript - 如何获得完整的图像图,包括平移、放大、缩小?

php - 在 jquery 中向表中添加项目

带有彩色框轮廓的图像上的CSS透明文本

php - 创建图像而不将其存储为本地文件

javascript - 使用 graph api 在个人网络应用程序中获取 Facebook feed

php - 如何使用 php 从 mysql 中的表中获取多行...