PHP Conference Japan 2024

exif_thumbnail

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

exif_thumbnail检索图像的嵌入式缩略图

描述

exif_thumbnail(
    资源|字符串 $file,
    整数 &$width = null,
    整数 &$height = null,
    整数 &$image_type = null
): 字符串|false

exif_thumbnail() 读取图像的嵌入式缩略图。

如果要通过此函数传递缩略图,则应使用 header() 函数发送 mimetype 信息。

有可能 exif_thumbnail() 无法创建图像,但可以确定其大小。在这种情况下,返回值为 false,但 widthheight 已设置。

参数

file

图像文件的路径。这可以是文件的路径或流 资源

width

返回的缩略图的宽度。

height

返回的缩略图的高度。

image_type

返回的缩略图的图像类型。这可以是 TIFFJPEG

返回值

返回嵌入式缩略图,如果图像不包含缩略图,则返回 false

变更日志

版本 描述
7.2.0 file 参数现在同时支持本地文件和流资源。

示例

示例 #1 exif_thumbnail() 示例

<?php
$image
= exif_thumbnail('/path/to/image.jpg', $width, $height, $type);

if (
$image!==false) {
header('Content-type: ' .image_type_to_mime_type($type));
echo
$image;
exit;
} else {
// 没有可用的缩略图,在此处处理错误
echo '没有可用的缩略图';
}
?>

注释

注意:

如果使用 file 将流传递给此函数,则流必须是可查找的。请注意,此函数返回后,文件指针位置不会改变。

参见

添加注释

用户贡献的注释 5 条注释

Eric
20 年前
这将允许您使用各种 gd 命令来操作缩略图图像 ($imgJpeg)

<?php
if (($imgJpeg = exif_thumbnail($strImagePath)) === false)
print
"No Thumbnail!";
else
$imgJpeg = imageCreateFromString($imgJpeg);
?>
thrustvector at &#39;gee&#39;mail dot com
16 年前
如果您使用图像编辑软件编辑了图像,并且它不再包含 exif 缩略图,我已经创建了一个脚本,可以使用“PHP Exif 库”将其添加回图像中:http://pel.sourceforge.net/index.php

<?php
require_once('../PEL/PelJpeg.php');
require_once(
'../PEL/PelIfd.php');
$fullpath = 'images/DSC_0013c.JPG'; # 源图像路径(不包含 EXIF 缩略图)

$jpeg = new PelJpeg($fullpath);
$exif = $jpeg->getExif();
$tiff = $exif->getTiff();
$ifd0 = $tiff->getIfd(); # 需要此变量以便稍后将其链接到新的 IFD

$ifd1 = $ifd0->getNextIfd();
if (!
$ifd1) { # 只有在不存在缩略图时才创建缩略图(即不存在 IFD1)
$ifd1 = new PelIfd(1);
$ifd0->setNextIfd($ifd1); # 将 ifd0 指向新的 ifd1(否则将无法读取 ifd1)

$original = ImageCreateFromString($jpeg->getBytes()); # 创建原始图像资源
$orig_w=imagesx($original);
$orig_h=imagesy($original);
$wmax = 160;
$hmax = 120;

if (
$orig_w>$wmax || $orig_h>$hmax) {
$thumb_w=$wmax;
$thumb_h=$hmax;
if (
$thumb_w/$orig_w*$orig_h>$thumb_h)
$thumb_w=round($thumb_h*$orig_w/$orig_h); # 保持纵横比
else
$thumb_h=round($thumb_w*$orig_h/$orig_w);
}
else {
# 只有当原始图像大于 'wmax'x'hmax' 时才设置缩略图大小
$thumb_w=$orig_w;
$thumb_h=$orig_h;
}

# 创建具有缩略图大小的图像资源
$thumb=imagecreatetruecolor($thumb_w,$thumb_h);
## 调整原始图像大小并复制到空白缩略图资源
imagecopyresampled($thumb,$original,
0,0,0,0,$thumb_w,$thumb_h,$orig_w,$orig_h);

# 开始将输出写入缓冲区
ob_start();
# 将缩略图资源内容输出到缓冲区
ImageJpeg($thumb);
# 从缓冲区缩略图内容创建 PelDataWindow(并结束输出到缓冲区)
$window = new PelDataWindow(ob_get_clean());

if (
$window) {

$ifd1->setThumbnail($window); # 将窗口数据设置为 ifd1 中的缩略图
$outpath = $fullpath; # 覆盖原始 jpg 文件
file_put_contents($outpath, $jpeg->getBytes()); # 将所有内容写入输出文件名
# 在文件中显示缩略图:
echo '<img src="thumb_exif.php?image='.$outpath.'" border=0 alt="如果看到此信息,则表示操作失败"><br>';


}
}
else {
echo
'ifd1 已存在!(IFD1 是存储缩略图的位置)<br>';
}
?>
<?php
# 这是 thumb_exif.php 中的代码:
$imgdat = exif_thumbnail($_REQUEST['image'], $width, $height, $type);
header('Content-type: ' . image_type_to_mime_type($type));
echo(
$imgdat);
?>

如果您有很多这样的文件,您可以轻松编写一个脚本来搜索这些文件并向其 EXIF 中添加缩略图。
Miguel Vitorino
17 年前
如果您想直接在 HTML 页面中嵌入缩略图,而无需先将其写入文件,请使用此方法。

<?php
$image
= exif_thumbnail($file, $width, $height, $type);

echo
"<img width='$width' height='$height' src='data:image/gif;base64,".base64_encode($image)."'>";
?>
匿名
17 年前
如果您想将 TIFF 转换为 JPG,如果您的服务器上安装了 ImageMagick,则可以使用它。

<?php
$exec
= 'convert /path/to/file.tiff /path/to/file.jpg 2>&1';
@
exec($exec, $exec_output, $exec_retval);

// 可能的错误
print_r($exec_output)
?>
hanspeter dot debets at dendrite dot com
19 年前
缩略图可以是 TIFF 格式(例如柯达相机将缩略图嵌入到 TIFF 中)这一点很棒,但我无法在 HTML 中显示作为嵌入图像的 TIFF(使用 <IMG...> 标签)。PHP 中似乎没有函数可以将 TIFF 更改为 JPG。(对于 TIFF 流,imagecreatefromstring 会给出“未知数据类型”错误。因此,以下示例对于 JPEG 嵌入式缩略图非常有效,但对于 TIFF 嵌入式缩略图则无效(但是,也许我做错了什么?)

test_exif.php

<HTML>
<HEAD>
<TITLE>测试 EXIF 读取</TITLE>
</HEAD>
<BODY>
<?php
$image
='P0000614.JPG';
echo(
"<B>". $image. "</B>:<BR><BR>\n");

$exif = exif_read_data($image, 'ANY_TAG',true);
if (!
$exif===false)
{
echo(
"图像包含标题<br><br>");
echo(
"<A href=showthumb.php?image=" . $image ."> <IMG border=0 src=showthumb.php?image=" . $image ."></A><BR><BR>");

foreach (
$exif as $key => $section)
{
foreach (
$section as $name => $val)
{
echo
"$key.$name: $val<br>\n";
}
}
}
else
{
echo(
"抱歉,图像 <B>".$image . "</B> 不包含(可读的)EXIF 数据。");
}
?>
</BODY>
</HTML>

showthumb.php

<?php
$imgdat
= exif_thumbnail($_REQUEST['image'],$width, $height, $type);
header('Content-type: ' . image_type_to_mime_type($type));
echo(
$imgdat);
?>

点击<A>时,TIFF图像会在Windows系统为其指定程序中打开,但JPEG图像却在浏览器中打开。

我使用的是Windows IIS 4上的PHP 4.3.6(是的,我知道……)
To Top