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

PHP-创建缩略图&;保持纵横比,php,image,gd,image-resizing,Php,Image,Gd,Image Resizing,编辑:这可以很容易地用CSS完成,我在写这篇文章的时候对CSS不太了解 我已经用PHP创建了一个缩略图生成器。生成的缩略图大小应相同。但问题是使用具有不同纵横比(如横向或纵向)的上传图像,缩略图会变得难看。所以我创建了上面的图片来澄清。无论上传的图像是什么,它都将被放入一个矩形图像中。因此,纵横比不会改变,缩略图的大小将相同。谁能帮我一下或告诉我一些想法吗?看看我的的源代码:) 这里有一个函数可能对您有所帮助。你告诉它你想要保持的宽度,它会在生成缩略图的同时保持纵横比 public stati

编辑:这可以很容易地用CSS完成,我在写这篇文章的时候对CSS不太了解


我已经用PHP创建了一个缩略图生成器。生成的缩略图大小应相同。但问题是使用具有不同纵横比(如横向或纵向)的上传图像,缩略图会变得难看。所以我创建了上面的图片来澄清。无论上传的图像是什么,它都将被放入一个矩形图像中。因此,纵横比不会改变,缩略图的大小将相同。谁能帮我一下或告诉我一些想法吗?

看看我的的源代码:)


这里有一个函数可能对您有所帮助。你告诉它你想要保持的宽度,它会在生成缩略图的同时保持纵横比

public static function makeThumb($src, $dest, $desired_width, $format = 'image/jpeg')
{
    /* read the source image */
    $source_image = null;
    if($format == 'image/jpeg')
    {
        $source_image = imagecreatefromjpeg($src);
    }
    else if($format == 'image/png')
    {
        $source_image = imagecreatefrompng($src);
    }

    $width = imagesx($source_image);
    $height = imagesy($source_image);

    /* find the "desired height" of this thumbnail, relative to the desired width  */
    $desired_height = floor($height * ($desired_width / $width));

    /* create a new, "virtual" image */
    $virtual_image = imagecreatetruecolor($desired_width, $desired_height);

    imageAlphaBlending($virtual_image, false);
    imageSaveAlpha($virtual_image, true);

    /* copy source image at a resized size */
    imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height);

    /* create the physical thumbnail image to its destination */
    if($format == 'image/jpeg')
    {
        imagejpeg($virtual_image, $dest);
    }
    else if($format == 'image/png')
    {
        imagepng($virtual_image, $dest);
    }
}

使用ImageMagick API。查看此

define('THUMB_WIDTH', 60);
define('THUMB_HEIGHT', 80);
define('MAGICK_PATH','/usr/local/bin/');

function makeThumbnail($in, $out) {
    $width = THUMB_WIDTH;
    $height = THUMB_HEIGHT;
    list($w,$h) = getimagesize($in);

    $thumbRatio = $width/$height;
    $inRatio = $w/$h;
    $isLandscape = $inRatio > $thumbRatio;

    $size = ($isLandscape ? '1000x'.$height : $width.'x1000');
    $xoff = ($isLandscape ? floor((($inRatio*$height)-$width)/2) : 0);
    $command = MAGICK_PATH."convert $in -resize $size -crop {$width}x{$height}+{$xoff}+0 ".
        "-colorspace RGB -strip -quality 90 $out";

    exec($command);
}
请参阅此链接-或

define('THUMBNAIL\u IMAGE\u MAX\u WIDTH',150);
定义(“缩略图图像最大高度”,150);
函数生成缩略图($source\u image\u path,$thumbnail\u image\u path)
{
列表($source\u image\u width、$source\u image\u height、$source\u image\u type)=getimagesize($source\u image\u path);
开关($source\u image\u type){
案例图像类型\u GIF:
$source\u gd\u image=imagecreatefromformgif($source\u image\u path);
打破
case IMAGETYPE_JPEG:
$source\u gd\u image=imagecreatefromjpeg($source\u image\u path);
打破
案例IMAGETYPE_PNG:
$source\u gd\u image=imagecreatefrompng($source\u image\u path);
打破
}
如果($source\u gd\u image===false){
返回false;
}
$source\u aspect\u ratio=$source\u image\u width/$source\u image\u height;
$thumbnail\u aspect\u ratio=缩略图图像最大宽度/缩略图图像最大高度;

如果($source\u image\u width我想这个资源会有帮助:@LeaveAirykson好的。让我试试…@LeaveAirykson谢谢。它起了一点作用。完成了一半。现在我需要的是把获得的图像放在一个白色的矩形中。你能帮我吗?看看这个答案,可能会有帮助的。看看这个帖子,这可能会对你有所帮助。@lewisd我试过这个。它只是调整图像的大小,而不是根据我在图片中显示的图像。我对PHP不熟悉。你能告诉我如何调用此函数,文件名放在哪里,目的地是这样的吗???@user3392772单击链接。查看
示例下的使用示例。PHP
$image
变量更改为
$image=$\u获取['i']
将允许您在基本HTML标记中链接图像,如
您还可以将最大宽度和高度变量更改为查询,以便动态定义宽度/高度
我使用函数make缩略图('test.jpg','new.jpg')调用它;但没有发生任何事情。您必须安装ImageMagick。检查此项-在服务器中安装它如何?可能吗?是的,在第37行中肯定有可能,它必须是$img\u disp=ImageCreateTureColor(缩略图\u IMAGE\u MAX\u WIDTH,缩略图\u IMAGE\u MAX\u HEIGHT);(用缩略图\u IMAGE\u MAX\u HEIGHT替换第二个参数)。这不适用于带有黑色文本的PNG透明图像,会创建黑色图像。
define('THUMB_WIDTH', 60);
define('THUMB_HEIGHT', 80);
define('MAGICK_PATH','/usr/local/bin/');

function makeThumbnail($in, $out) {
    $width = THUMB_WIDTH;
    $height = THUMB_HEIGHT;
    list($w,$h) = getimagesize($in);

    $thumbRatio = $width/$height;
    $inRatio = $w/$h;
    $isLandscape = $inRatio > $thumbRatio;

    $size = ($isLandscape ? '1000x'.$height : $width.'x1000');
    $xoff = ($isLandscape ? floor((($inRatio*$height)-$width)/2) : 0);
    $command = MAGICK_PATH."convert $in -resize $size -crop {$width}x{$height}+{$xoff}+0 ".
        "-colorspace RGB -strip -quality 90 $out";

    exec($command);
}
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