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);
?>(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
exif_thumbnail β ΠΠΎΠ»ΡΡΠ°Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅Π²ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
$file,&$width = null,&$height = null,&$image_type = nullexif_thumbnail() ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅Π²ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠΊΠΈΠ· ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ mimetype-ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π² header() ΡΡΠ½ΠΊΡΠΈΡ.
ΠΠ½ΠΎΠ³Π΄Π° exif_thumbnail()
Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ.
Π ΡΠ°ΠΊΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
ΠΎΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ false, Π½ΠΎ Π·Π°Π΄Π°ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌ
width ΠΈ height
ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
filewidthheightimage_type
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΡΡΠΊΠΈΠ· ΠΈΠ»ΠΈ false, Π΅ΡΠ»ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠΊΠΈΠ·Π°.
| ΠΠ΅ΡΡΠΈΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
| 7.2.0 |
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ file ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ Π²
stream ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΏΡΡΡ
ΠΊ ΡΠ°ΠΉΠ»Ρ, ΡΠ°ΠΊ ΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΉ ΡΠ΅ΡΡΡΡ.
|
ΠΡΠΈΠΌΠ΅Ρ #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ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΏΠΎΡΠΎΠΊΠ° Π² ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΎ ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ°ΡΡΠ²Π°Π΅ΠΌΡΠΌ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ.
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);
?>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.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)."'>";
?>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)
?>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.....)