CakeFest 2024: The Official CakePHP Conference

exif_thumbnail

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

exif_thumbnailLiest das eingebettete Miniaturbild eines Bildes aus

Beschreibung

exif_thumbnail(
    resource|string $file,
    int &$width = null,
    int &$height = null,
    int &$image_type = null
): string|false

exif_thumbnail() liest das eingebettete Miniaturbild eines Bildes aus.

Wenn man das Miniaturbild mit dieser Funktion ausliefern möchte, sollte man den Mimetype mit Hilfe der Funktion header() mitschicken.

Es kann passieren, dass exif_thumbnail() das Bild nicht erzeugen, aber dessen Größe bestimmen kann. In diesem Fall, ist der Rückgabewert false, obwohl width und height gesetzt sind.

Parameter-Liste

file

Der Ort der Bilddatei. Dies kann entweder ein Dateipfad oder eine Stream-Ressource sein.

width

Die Breite des gelieferten Miniaturbildes als Rückgabewert.

height

Die Höhe des gelieferten Miniaturbildes als Rückgabewert.

image_type

Der Bildtyp des gelieferten Miniaturbildes als Rückgabewert. Dieser ist entweder TIFF oder JPEG.

Rückgabewerte

Gibt das eingebettete Miniaturbild zurück oder false, wenn das Bild kein Miniaturbild enthält.

Changelog

Version Beschreibung
7.2.0 Der Parameter file unterstützt jetzt sowohl lokale Dateien als auch Stream-Ressourcen.

Beispiele

Beispiel #1 exif_thumbnail()-Beispiel

<?php
$image
= exif_thumbnail('/Pfad/zum/Bild.jpg', $width, $height, $type);
if (
$image!==false) {
header('Content-type: ' .image_type_to_mime_type($type));
echo
$image;
exit;
} else {
// kein Miniaturbild vorhanden. Fehler wird hier verarbeitet
echo 'Kein Miniaturbild verfügbar';
}
?>

Anmerkungen

Hinweis:

Wird file verwendet, um einen Stream an diese Funktion zu übergeben, dann muss der Stream durchsuchbar sein. Es ist zu beachten, dass sich die Position des Dateizeigers nicht ändert, nachdem diese Funktion aufgerufen wurde.

Siehe auch

add a note

User Contributed Notes 5 notes

up
7
Eric
19 years ago
This will allow you to manipulate the thumbnail image ($imgJpeg) using the various gd commands:

<?php
if (($imgJpeg = exif_thumbnail($strImagePath)) === false)
print
"No Thumbnail!";
else
$imgJpeg = imageCreateFromString($imgJpeg);
?>
up
3
thrustvector at &#39;gee&#39;mail dot com
15 years ago
If you've edited the image with image editing software and it no longer contains an exif thumbnail, I've created a script that will add one back into it, using the "PHP Exif Library": http://pel.sourceforge.net/index.php

<?php
require_once('../PEL/PelJpeg.php');
require_once(
'../PEL/PelIfd.php');
$fullpath = 'images/DSC_0013c.JPG'; # path of source image (does not contain an exif thumbnail)

$jpeg = new PelJpeg($fullpath);
$exif = $jpeg->getExif();
$tiff = $exif->getTiff();
$ifd0 = $tiff->getIfd(); # need this so that we can later link it to the new IFD

$ifd1 = $ifd0->getNextIfd();
if (!
$ifd1) { # Only create thumbnail if one doesn't exist (i.e. there is no IFD1)
$ifd1 = new PelIfd(1);
$ifd0->setNextIfd($ifd1); # point ifd0 to the new ifd1 (or else ifd1 will not be read)

$original = ImageCreateFromString($jpeg->getBytes()); # create image resource of original
$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); # maintain aspect ratio
else
$thumb_h=round($thumb_w*$orig_h/$orig_w);
}
else {
# only set the thumb's size if the original is larger than 'wmax'x'hmax'
$thumb_w=$orig_w;
$thumb_h=$orig_h;
}

# create image resource with thumbnail sizing
$thumb=imagecreatetruecolor($thumb_w,$thumb_h);
## Resize original and copy to the blank thumb resource
imagecopyresampled($thumb,$original,
0,0,0,0,$thumb_w,$thumb_h,$orig_w,$orig_h);

# start writing output to buffer
ob_start();
# outputs thumb resource contents to buffer
ImageJpeg($thumb);
# create PelDataWindow from buffer thumb contents (and end output to buffer)
$window = new PelDataWindow(ob_get_clean());

if (
$window) {

$ifd1->setThumbnail($window); # set window data as thumbnail in ifd1
$outpath = $fullpath; # overwrite original jpg file
file_put_contents($outpath, $jpeg->getBytes()); # write everything to output filename
# Show thumbnail in file:
echo '<img src="thumb_exif.php?image='.$outpath.'" border=0 alt="If you see this, it did not work"><br>';


}
}
else {
echo
'ifd1 already exists! (IFD1 is where the thumbnail is stored)<br>';
}
?>
<?php
# This is the code in thumb_exif.php :
$imgdat = exif_thumbnail($_REQUEST['image'], $width, $height, $type);
header('Content-type: ' . image_type_to_mime_type($type));
echo(
$imgdat);
?>

If you have a lot of such files, you can easily make a script that searches them out and adds thumbnails to their exif.
up
3
Miguel Vitorino
16 years ago
use this if you want to embed a thumbnail directly on the HTML page without writing it first to a file:

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

echo
"<img width='$width' height='$height' src='data:image/gif;base64,".base64_encode($image)."'>";
?>
up
-1
Anonymous
17 years ago
If you want to convert from TIFF to JPG you can use ImageMagick if it is installed in your server.

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

//possible error
print_r($exec_output)
?>
up
-2
hanspeter dot debets at dendrite dot com
19 years ago
Great that the thumbnail can be in TIFF format (f.i. Kodak cameras have embedded thumbnail in TIFF) BUT I have not been able to show TIFF as an embedded image in HTML (using the <IMG...> tag). There seems to be no function in PHP to change TIFF to, lets say, JPG. (imagecreatefromstring gives a 'unknown datatype' error for the TIFF stream. So below sample works great for JPEG embedded thumbnail, but not for TIFF embedded (but then, maybe I did something wrong?):

test_exif.php:

<HTML>
<HEAD>
<TITLE>Test EXIF Read </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(
"Image contains headers<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(
"Sorry, image <B>".$image . "</B> does not contain (readable) EXIF data.");
}
?>
</BODY>
</HTML>

showthumb.php:

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

When clicking on the <A> opens the TIFF image in the program that windows assigned to this type, but the JPEG opens in the browser.

I am using PHP 4.3.6 on windows iis 4 (yeah, I know.....)
To Top