【问题标题】:PHP - create thumbnail image from urlPHP - 从 url 创建缩略图
【发布时间】:2015-05-04 22:37:18
【问题描述】:

我需要一种方法(使用内置 PHP 库)从 URL 下拉图像并将其保存到本地磁盘,并将其调整大小/缩放 WIDTH 为 150 像素。我一直在尝试这个:

Creating a thumbnail from an uploaded image

function makeThumbnails($updir, $img, $id)
{
    $thumbnail_width = 134;
    $thumbnail_height = 189;
    $thumb_beforeword = "thumb";
    $arr_image_details = getimagesize("$updir" . $id . '_' . "$img"); // pass id to thumb name
    $original_width = $arr_image_details[0];
    $original_height = $arr_image_details[1];
    if ($original_width > $original_height) {
        $new_width = $thumbnail_width;
        $new_height = intval($original_height * $new_width / $original_width);
    } else {
        $new_height = $thumbnail_height;
        $new_width = intval($original_width * $new_height / $original_height);
    }
    $dest_x = intval(($thumbnail_width - $new_width) / 2);
    $dest_y = intval(($thumbnail_height - $new_height) / 2);
    if ($arr_image_details[2] == 1) {
        $imgt = "ImageGIF";
        $imgcreatefrom = "ImageCreateFromGIF";
    }
    if ($arr_image_details[2] == 2) {
        $imgt = "ImageJPEG";
        $imgcreatefrom = "ImageCreateFromJPEG";
    }
    if ($arr_image_details[2] == 3) {
        $imgt = "ImagePNG";
        $imgcreatefrom = "ImageCreateFromPNG";
    }
    if ($imgt) {
        $old_image = $imgcreatefrom("$updir" . $id . '_' . "$img");
        $new_image = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
        imagecopyresized($new_image, $old_image, $dest_x, $dest_y, 0, 0, $new_width, $new_height, $original_width, $original_height);
        $imgt($new_image, "$updir" . $id . '_' . "$thumb_beforeword" . "$img");
    }
}

这看起来很有希望,但我不知道如何使用它,以及它是否会做我想要的。关注/需求:

  1. 这些参数是什么意思:($updir, $img, $id) -- $updir 是文件的位置吗?或者我想要保存的位置? $img 是文件句柄还是文件名?还是文件的新名称? $id 是干什么用的?作者没有给出任何示例用法。
  2. 该功能似乎需要我指定宽度和高度。我只想指定 WIDTH 并让高度成比例。
  3. 我需要通过 2 种不同类型的 URL 拉取图像:(1) 基本 http://foo...,以及 (2) 数据语法:data:image/jpeg;base64,/9j/4AAQ....
  4. 理想情况下,我希望在所有情况下都将这些图像转换为压缩的 jpeg 缩略图(150 像素宽度,任意高度),即使原始图像不是 jpg 格式。

最好的方法是什么?

【问题讨论】:

  • 好吧,您发布的脚本看起来像是基于图像上传到服务器上运行的,$updir 将是包含它们的目录的路径,$id$img 是其中的一部分某种命名约定的文件名。所以简而言之,这只有在您下载/复制文件后才有效。
  • 看看stackoverflow.com/a/27362839/3641016,我提供了一个小助手函数来调整不同模式的图像大小。
  • 拉斐尔,你成功了。想发布你的答案,以便我可以给你赏金吗?
  • 在下面检查我的答案。我使用 ImageCreateFromString 删除所有手动文件检测,因为它已经由 PHP 内部处理。

标签: php image-processing


【解决方案1】:

这样做:

function Thumbnail($url, $filename, $width = 150, $height = true) {

 // download and create gd image
 $image = ImageCreateFromString(file_get_contents($url));

 // calculate resized ratio
 // Note: if $height is set to TRUE then we automatically calculate the height based on the ratio
 $height = $height === true ? (ImageSY($image) * $width / ImageSX($image)) : $height;

 // create image 
 $output = ImageCreateTrueColor($width, $height);
 ImageCopyResampled($output, $image, 0, 0, 0, 0, $width, $height, ImageSX($image), ImageSY($image));

 // save image
 ImageJPEG($output, $filename, 95); 

 // return resized image
 return $output; // if you need to use it
}

像这样使用它:

Thumbnail("http://cdn.cutestpaw.com/wp-content/uploads/2013/01/l-Cute-Kitten.jpg", "kitten.jpg");

这里的技巧是使用 PHP 的内部自动文件检测来检测传入流,ImageCreateFromString 处理得非常好

【讨论】:

  • 安迪,我把这个授予你是因为:(1)它有效; (2) 你没有把我送到 3rd-party 库; (3) 极简主义; (4) 你给出了一个如何使用它的工作示例。感谢您的完美回答。
  • 是的,效果很好。你现在如何按大小裁剪图像以制作缩略图。
  • 即使网址是 https 并且证书无效(通常是自签名),我也想缩略图图像,因此必须在此答案中将 stackoverflow.com/a/26151993/1238884 合并到 file_get_contents 中 - 否则,非常适合我的需要。干杯!
  • 顺便说一句,php 手册中的 imagecreatefromstring、imagecreatetruecolor、imagecopyresampled、imagejpeg、imagesx、imagesy 都是小写的?
  • 我试过 echo Thumbnail( .... ) 但我在浏览器中没有得到任何图片?我错过了什么?
【解决方案2】:

您可以使用这个SimpleImage 类。您可以直接从 url 调整图像大小并将其保存在本地。

$image = new SimpleImage(); 
$image->load('http://website.com/yourimage.jpg'); 
$image->resize(250,400);
$image->save('filename.jpg');

更多示例可以在here找到。

【讨论】:

    【解决方案3】:

    这些参数是什么意思: ($updir, $img, $id) -- $updir 是文件的位置吗?或者我想要保存的位置? $img 是文件句柄还是文件名?还是文件的新名称? $id 有什么用?作者没有给出任何示例用法。

    • $updir 似乎是服务器上文件的路径
    • $img 是图像文件名(带有扩展名)
    • $id 似乎是文件名的一些数字前缀(纯粹是为了这个功能的创建者)。我会在函数头中将其更改为$id = ''
      .

    该功能似乎需要我指定宽度和高度。我只想指定 WIDTH 并让高度成比例。

    嗯,你可以使用一些数学。如果你想要 4:3 比例的图像,你可以做一些“比例方程”(不知道它是否有英文名称):

    $thumbnail_width = 1234;
    $thumbnail_height = $thumbnail_width * 3 / 4;
    

    但是如果你不知道比例并且只想保持比例,那么我认为这个功能对你没有帮助。您可以尝试SimpleImage 类,正如其他答案中已经说过的那样(它有resizeToWidth() 方法)
    .

    我需要通过 2 种不同类型的 URL 提取图像:(1) 基本 http://foo...,以及 (2) 数据语法:data:image/jpeg;base64,/9j/4AAQ... .

    好吧,这取决于你。您在这里发布了一个函数,您将作为参数传递的内容完全是独立的。至于base64 编码的图像,请查看this topic 以了解如何将其转换为图像(您可以使用file_put_content() 保存图像而不是回显它)。
    ,

    理想情况下,即使原始图像不是 jpg 格式,我也希望在所有情况下都将这些图像转换为压缩的 jpeg 缩略图(宽度为 150 像素,高度任意)。

    同样,您发布的功能完全适用于输入图像,并且无法转换不同的类型。同样,我建议使用SimpleImage 类。

    【讨论】:

      【解决方案4】:

      这是一个将 url 转换为图像的好例子。它似乎有点解决,但效果很好;) 对于 imagemagick ,如果你使用 windows,你需要设置 imagemagick & show imagemagick dll to php。 Click here

      【讨论】:

        【解决方案5】:

        我试图用几个步骤来解释它。

        1.getImageSize($name)- 它需要图像名称来获取图像。因此,您需要提供绝对 url 以及带有扩展名的确切图像名。

        例如:"abc.com/edit/9/xyz.png"

        在上述情况下,根据您的函数参数。

        1. abc.com/edit/ 是您的默认网址。
        2. $id 是你的 id
        3. 特定记录。 '_' 将在您的网址中附加 '/'。
        4. $img 是特定记录的图像名称。

        2、上面的函数会给你一个数组,其中前两个参数是函数传入的图像的高度和宽度。所以你需要将它存储在变量中。 $height$width

        3,接下来会检查高度和宽度,如果高度或宽度不符合要求,则需要进行相应设置。

        4,然后在代码中,接下来是dest_x和dest_y,这将帮助您指向图像的位置。

        对于两个不同的 url,您可以将这些 url 存储在常量变量中,并将此常量变量放入您的 getImageSize() 函数中。

        【讨论】:

          猜你喜欢
          • 2011-06-18
          • 2015-09-16
          • 1970-01-01
          • 2023-03-25
          • 2013-10-22
          • 2011-02-25
          • 2015-03-30
          • 2014-09-24
          • 2011-02-09
          相关资源
          最近更新 更多