【问题标题】:getimagesize unable to get size of remote webp files with PHP version 5.3.29getimagesize 无法使用 PHP 5.3.29 版获取远程 webp 文件的大小
【发布时间】:2016-03-07 11:41:41
【问题描述】:

下面是代码sn -p -

list($campaign_image_width, $campaign_image_height, $campaign_image_type, $campaign_image_attr)=getimagesize($campaign_image);

其中$campaign_image包含第三方图片的url。

问题

$campaign_image_width 对于这个 url 是空的 -

https://lh3.googleusercontent.com/VRY0O_3L8VH2wxJSTiKPr72PeM5uhPPFEsHzzYdxenddpTI150M0TYpljnZisQaROR0=h256-rw

我不确定是否是 getimagesize() 的限制,因为不支持的格式导致了这种情况,或者是因为图像的可访问性问题。

注意 -

- 最后附加的 =h256-rw 似乎告诉服务器返回不同大小的图像版本。

- 我发现如果我尝试使用 firefox 浏览器打开文件,它不会显示图像,而是要求下载 webp 文件(似乎是谷歌的图像格式)。 谷歌浏览器正常打开文件并显示图像。

【问题讨论】:

  • 下载的文件有有效的图片扩展名吗?
  • 在此处评论以获得在 PHP bugs.php.net/bug.php?id=65038 中修复的 getimagesize 中缺少的 WEBP 支持。
  • 顺便说一句,从 url 中删除 -rw,Google 将返回 jpg/png/whatever 标准图像而不是 webp。

标签: php image-size


【解决方案1】:

由于您的服务器已经在下载文件,您最好自己下载文件(如果问题是它无法为 webp 正确下载)。您可以使用 GD 方法 imagecreatefromwebpimagesximagesy 轻松做到这一点:

<?php

$url = 'https://lh3.googleusercontent.com/VRY0O_3L8VH2wxJSTiKPr72PeM5uhPPFEsHzzYdxenddpTI150M0TYpljnZisQaROR0=h256-rw';

$img = imagecreatefromwebp($url);

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

var_dump($width, $height);

注意: imagecreatefromwebp() 最初是在 PHP 5.5 中引入的,因此请确保您的最低版本是 5.5 并安装了 GD 扩展。

如果可能,您可以将 Google 自己的 webp 转换器作为二进制文件安装在您的服务器上:

https://developers.google.com/speed/webp/docs/compiling#building

在本例中,您运行的是基于 Fedora 的 Amazon linux,因此使用 yum 作为包管理器,因此您应该能够运行以下命令:

sudo yum install libwebp;

安装后,您可以使用safe_mode_exec_dir 和以下执行方法之一确保您的safemode 支持二进制文件:

一旦您运行转换为例如。 JPG,您可以运行常用的 PHP 工具来获取图像尺寸:

$hnd = imagecreatefromjpeg('convertedImage.jpg');

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

【讨论】:

  • @SandeepanNath 那么我担心你不走运 GD 明智的,因为它是第一次添加的。如果您可以访问 CLI 工具,请 can use Google's own converter.
  • @SandeepanNath 您很可能需要这些其他软件包,但您不能像 Google 那样使用 aptitude,因为 Amazon linux 基于 Feroda 并使用 yum 作为软件包管理器。也就是说,似乎有一个预制的 Feroda 包,其中包含您想要的 here。您应该可以使用命令yum install libwebp 安装它。根据this,那么libwebp-0.3.0 应该可用。
  • @SandeepanNath 如果你问是否有人做了一个调用直接 API 的webp php 扩展,那么我不知道——谷歌可以告诉你。如果您要询问如何围绕二进制构建包装器,这取决于您想要制作它的高级程度。 Here's an example someone did for wkhtmltopdf。我建议您首先使用shell_exec,但请确保使用escapeshellarg 转义所有参数,因为您不希望人们在您的服务器上运行命令。
  • @SandeepanNath 不完全正确。如果您使用 safe_mode_exec_dir,则可以启用 safe_mode 并将二进制文件放在该路径中。请记住,according to the documentation 您不能在启用safe_mode 的情况下使用shell_exec,但您可以使用execpassthrusystempopen(无论您喜欢哪个) .包装器完全没有区别,只对开发人员有用。想象一下你想使用(new WEBP())-&gt;convert('foo.webp')
  • @SandeepanNath 在没有 PHP 5.5 的情况下转换之前你将无法获得它,除非你能找到一个可以为你做这件事的二进制文件。您需要对其进行转换并然后 获取尺寸。步骤 1. 下载图像。步骤 2. 转换图像。步骤 3. 获取尺寸。第 4 步。(把图片扔出去???)
【解决方案2】:

我认为这是因为格式不受支持。试试imagetypes 了解支持的内容。

$bits = imagetypes();

查看this post,它可能会有所帮助。安装后就可以了

$image = new Imagick($originalFilepath);
$origImageDimens = $image->getImageGeometry(); 
$origImgWidth = $origImageDimens['width']; 
$origImgHeight = $origImageDimens['height'];   

【讨论】:

  • 这是检查的方式 - if (imagetypes() & IMG_PNG) echo "PNG Support is enabled";
  • 是的。但是正如您所看到的,在当前文档中没有 const 有点 IMG_WEBP。所以我认为它只是不被设计支持。
  • 对。我也注意到了这一点。那么,这是否意味着没有 PHP 方法可以本地查找维度?使用一些库,比如 GD 库会提供一些选择吗?有什么想法吗?
  • 添加了有用的回答链接,查看。
  • 我在服务器上安装了 imagick(虽然不是 PHP Imagemagick)。我检查了即使命令行转换也不支持 webp 格式。由于 Imagemagick PHP 类只是 imagick 实用程序的包装器,我怀疑当 imagick 本身不适用于这种格式时,它也不起作用。如果我运行这个命令 - convert -resize 50x50! &lt;remote path to webp file&gt; &lt;output path&gt;,我会收到这个错误 convert: no decode delegate for this image format WEBP' @error/constitute.c/ReadImage/535。`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 2015-03-05
  • 2013-08-07
  • 2023-03-28
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多