"show metadata" feature added : you can ask to show metadata (EXIF and IPTC)

on picture.php page. Metadata read functions were moved from
admin/include/functions_metadata.php to include/functions_metadata.inc.php


git-svn-id: http://piwigo.org/svn/trunk@493 68402e56-0260-453c-a942-63ccdbb3a9ee
This commit is contained in:
z0rglub 2004-08-25 21:09:09 +00:00
commit d8494248fc
11 changed files with 392 additions and 57 deletions

View file

@ -210,6 +210,8 @@ $upload = ($conf['upload_available']=='true')?'UPLOAD_YES':'UPLOAD_NO';
$cookie = ($conf['authorize_cookies']=='true')?'COOKIE_YES':'COOKIE_NO';
$use_exif = ($conf['use_exif']=='true')?'USE_EXIF_YES':'USE_EXIF_NO';
$use_iptc = ($conf['use_iptc']=='true')?'USE_IPTC_YES':'USE_IPTC_NO';
$show_exif = ($conf['show_exif']=='true')?'SHOW_EXIF_YES':'SHOW_EXIF_NO';
$show_iptc = ($conf['show_iptc']=='true')?'SHOW_IPTC_YES':'SHOW_IPTC_NO';
//----------------------------------------------------- template initialization
$template->set_filenames( array('config'=>'admin/configuration.tpl') );
@ -244,6 +246,8 @@ $template->assign_vars(array(
$cookie=>'checked="checked"',
$use_exif=>'checked="checked"',
$use_iptc=>'checked="checked"',
$show_exif=>'checked="checked"',
$show_iptc=>'checked="checked"',
'L_CONFIRM'=>$lang['conf_confirmation'],
'L_CONF_GENERAL'=>$lang['conf_general_title'],
@ -313,6 +317,10 @@ $template->assign_vars(array(
'L_USE_EXIF_INFO'=>$lang['conf_use_exif_info'],
'L_USE_IPTC'=>$lang['conf_use_iptc'],
'L_USE_IPTC_INFO'=>$lang['conf_use_iptc_info'],
'L_SHOW_EXIF'=>$lang['conf_show_exif'],
'L_SHOW_EXIF_INFO'=>$lang['conf_show_exif_info'],
'L_SHOW_IPTC'=>$lang['conf_show_iptc'],
'L_SHOW_IPTC_INFO'=>$lang['conf_show_iptc_info'],
'F_ACTION'=>add_session_id(PHPWG_ROOT_PATH.'admin.php?page=configuration')
));

View file

@ -25,17 +25,10 @@
// | USA. |
// +-----------------------------------------------------------------------+
/**
* returns informations from IPTC metadata, mapping is done at the beginning
* of the function
*
* @param string $filename
* @return array
*/
function get_iptc_data($filename)
include_once(PHPWG_ROOT_PATH.'/include/functions_metadata.inc.php');
function get_sync_iptc_data($file)
{
global $getimagesize_time;
$map = array(
'keywords' => '2#025',
'date_creation' => '2#055',
@ -45,61 +38,25 @@ function get_iptc_data($filename)
);
$datefields = array('date_creation', 'date_available');
$result = array();
// Read IPTC data
$iptc = array();
$start = get_moment();
getimagesize($filename, &$imginfo);
$getimagesize_time+= get_moment() - $start;
if (is_array($imginfo) and isset($imginfo['APP13']))
$iptc = get_iptc_data($file, $map);
foreach ($iptc as $pwg_key => $value)
{
$iptc = iptcparse($imginfo['APP13']);
if (is_array($iptc))
if (in_array($pwg_key, $datefields))
{
$rmap = array_flip($map);
foreach (array_keys($rmap) as $iptc_key)
if ( preg_match('/(\d{4})(\d{2})(\d{2})/', $value, $matches))
{
if (isset($iptc[$iptc_key][0]) and $value = $iptc[$iptc_key][0])
{
// strip leading zeros (weird Kodak Scanner software)
while ($value[0] == chr(0))
{
$value = substr($value, 1);
}
// remove binary nulls
$value = str_replace(chr(0x00), ' ', $value);
foreach (array_keys($map, $iptc_key) as $pwg_key)
{
if (in_array($pwg_key, $datefields))
{
if ( preg_match('/(\d{4})(\d{2})(\d{2})/', $value, $matches))
{
$value = $matches[1].'-'.$matches[2].'-'.$matches[3];
}
else
{
continue;
}
}
$result[$pwg_key] = $value;
}
}
$iptc[$pwg_key] = $matches[1].'-'.$matches[2].'-'.$matches[3];
}
}
}
return $result;
return $iptc;
}
function update_metadata($files)
{
global $conf;
// $conf['use_iptc'] = true;
// $conf['use_exif'] = true;
$inserts = array();
@ -132,10 +89,13 @@ function update_metadata($files)
if ($conf['use_iptc'])
{
$iptc = get_iptc_data($file);
foreach (array_keys($iptc) as $key)
$iptc = get_sync_iptc_data($file);
if (count($iptc) > 0)
{
$insert[$key] = "'".addslashes($iptc[$key])."'";
foreach (array_keys($iptc) as $key)
{
$insert[$key] = "'".addslashes($iptc[$key])."'";
}
}
}

View file

@ -58,4 +58,34 @@ $conf['top_number'] = 10;
$conf['anti-flood_time'] = 60; // seconds between 2 comments : 0 to disable
$conf['max_LOV_categories'] = 50;
// $conf['show_iptc_mapping'] is used for showing IPTC metadata on
// picture.php page. For each key of the array, you need to have the same
// key in the $lang array. For example, if my first key is 'iptc_keywords'
// (associated to '2#025') then you need to have $lang['iptc_keywords'] set
// in language/$user['language']/common.lang.php. If you don't have the lang
// var set, the key will be simply displayed
//
// To know how to associated iptc_field with their meaning, use
// tools/metadata.php
$conf['show_iptc_mapping'] = array(
'iptc_keywords' => '2#025',
'iptc_caption_writer' => '2#122',
'iptc_byline_title' => '2#085',
'iptc_caption' => '2#120'
);
// in EXIF fields, you can choose to display fields in sub-arrays, for
// example ['COMPUTED']['ApertureFNumber']. for this, add
// 'COMPUTED;ApertureFNumber' in $conf['show_exif_fields']
//
// The key displayed in picture.php will be $lang['exif_field_Make'] for
// example and if it exists. For compound fields, only take into account the
// last part : for key 'COMPUTED;ApertureFNumber', you need
// $lang['exif_field_ApertureFNumber']
$conf['show_exif_fields'] = array('Make',
'Model',
'DateTime',
'COMPUTED;ApertureFNumber');
// for PHP version newer than 4.1.2 :
// $conf['show_exif_fields'] = array('CameraMake','CameraModel','DateTime');
?>

View file

@ -0,0 +1,73 @@
<?php
// +-----------------------------------------------------------------------+
// | functions_metadata.inc.php |
// +-----------------------------------------------------------------------+
// | application : PhpWebGallery <http://phpwebgallery.net> |
// | branch : BSF (Best So Far) |
// +-----------------------------------------------------------------------+
// | file : $RCSfile$
// | last update : $Date$
// | last modifier : $Author$
// | revision : $Revision$
// +-----------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation |
// | |
// | This program is distributed in the hope that it will be useful, but |
// | WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | General Public License for more details. |
// | |
// | You should have received a copy of the GNU General Public License |
// | along with this program; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+
/**
* returns informations from IPTC metadata, mapping is done at the beginning
* of the function
*
* @param string $filename
* @return array
*/
function get_iptc_data($filename, $map)
{
$result = array();
// Read IPTC data
$iptc = array();
$imginfo = array();
getimagesize($filename, $imginfo);
if (isset($imginfo['APP13']))
{
$iptc = iptcparse($imginfo['APP13']);
if (is_array($iptc))
{
$rmap = array_flip($map);
foreach (array_keys($rmap) as $iptc_key)
{
if (isset($iptc[$iptc_key][0]) and $value = $iptc[$iptc_key][0])
{
// strip leading zeros (weird Kodak Scanner software)
while ($value[0] == chr(0))
{
$value = substr($value, 1);
}
// remove binary nulls
$value = str_replace(chr(0x00), ' ', $value);
foreach (array_keys($map, $iptc_key) as $pwg_key)
{
$result[$pwg_key] = $value;
}
}
}
}
}
return $result;
}
?>

View file

@ -29,3 +29,5 @@ INSERT INTO phpwebgallery_config (param,value,comment) VALUES ('auto_expand','fa
INSERT INTO phpwebgallery_config (param,value,comment) VALUES ('show_nb_comments','true','Show the number of comments under the thumbnails');
INSERT INTO phpwebgallery_config (param,value,comment) VALUES ('use_iptc','false','Use IPTC data during database synchronization with files metadata');
INSERT INTO phpwebgallery_config (param,value,comment) VALUES ('use_exif','true','Use EXIF data during database synchronization with files metadata');
INSERT INTO phpwebgallery_config (param,value,comment) VALUES ('show_iptc','false','Show IPTC metadata on picture.php if asked by user');
INSERT INTO phpwebgallery_config (param,value,comment) VALUES ('show_exif','true','Show EXIF metadata on picture.php if asked by user');

View file

@ -159,6 +159,10 @@ $lang['conf_use_exif'] = 'Use EXIF';
$lang['conf_use_exif_info'] = 'Use EXIF data during metadata synchronization into PhpWebGallery database';
$lang['conf_use_iptc'] = 'Use IPTC';
$lang['conf_use_iptc_info'] = 'Use IPTC data during metadata synchronization into PhpWebGallery database';
$lang['conf_show_exif'] = 'Show EXIF';
$lang['conf_show_exif_info'] = 'Give the possibility to show EXIF metadata on visualisation page. See include/config.inc.php for available EXIF fields';
$lang['conf_show_iptc'] = 'Show IPTC';
$lang['conf_show_iptc_info'] = 'Give the possibility to show IPTC metadata on visualisation page. See include/config.inc.php for available IPTC fields';
//FAQ
$lang['help_images_title'] = 'Adding pictures';

View file

@ -279,4 +279,7 @@ $lang['search_author'] = 'author';
$lang['search_date_available'] = 'availability date';
$lang['search_date_creation'] = 'creation date';
$lang['search_one_clause_at_least'] = 'search at least on one search clause';
$lang['picture_show_metadata'] = 'Show file metadata ?';
$lang['picture_hide_metadata'] = 'Hide file metadata';
?>

View file

@ -197,6 +197,10 @@ foreach (array('prev', 'current', 'next') as $i)
{
$picture[$i]['url'].= '&amp;search='.$_GET['search'];
}
if (isset($_GET['show_metadata']))
{
$picture[$i]['url'].= '&amp;show_metadata=1';
}
}
$url_home = PHPWG_ROOT_PATH.'category.php?cat='.$page['cat'].'&amp;';
@ -405,6 +409,8 @@ $template->assign_vars(array(
'L_COMMENT' =>$lang['comment'],
'L_DOWNLOAD' => $lang['download'],
'L_DOWNLOAD_HINT' => $lang['download_hint'],
'L_PICTURE_SHOW_METADATA' => $lang['picture_show_metadata'],
'L_PICTURE_HIDE_METADATA' => $lang['picture_hide_metadata'],
'T_DEL_IMG' =>PHPWG_ROOT_PATH.'template/'.$user['template'].'/theme/delete.gif',
@ -570,7 +576,138 @@ $template->assign_block_vars('info_line', array(
'INFO'=>$lang['visited'],
'VALUE'=>$picture['current']['hit'].' '.$lang['times']
));
//-------------------------------------------------------------------- metadata
if ($conf['show_exif'] or $conf['show_iptc'])
{
$metadata_showable = true;
}
else
{
$metadata_showable = false;
}
if ($metadata_showable and !isset($_GET['show_metadata']))
{
$url = PHPWG_ROOT_PATH.'picture.php?'.$_SERVER['QUERY_STRING'];
$url.= '&amp;show_metadata=1';
$template->assign_block_vars('show_metadata', array('URL' => $url));
}
if ($metadata_showable and isset($_GET['show_metadata']))
{
$url = PHPWG_ROOT_PATH.'picture.php';
$str = $_SERVER['QUERY_STRING'];
parse_str($str, $get_vars);
$is_first = true;
foreach ($get_vars as $key => $value)
{
if ($key != 'show_metadata')
{
if ($is_first)
{
$url.= '?';
$is_first = false;
}
else
{
$url.= '&amp;';
}
$url.= $key.'='.$value;
}
}
$template->assign_block_vars('hide_metadata', array('URL' => $url));
include_once(PHPWG_ROOT_PATH.'/include/functions_metadata.inc.php');
$template->assign_block_vars('metadata', array());
if ($conf['show_exif'])
{
if ($exif = @read_exif_data($picture['current']['src']))
{
$template->assign_block_vars(
'metadata.headline',
array('TITLE' => 'EXIF Metadata')
);
foreach ($conf['show_exif_fields'] as $field)
{
if (strpos($field, ';') === false)
{
if (isset($exif[$field]))
{
$key = $field;
if (isset($lang['exif_field_'.$field]))
{
$key = $lang['exif_field_'.$field];
}
$template->assign_block_vars(
'metadata.line',
array(
'KEY' => $key,
'VALUE' => $exif[$field]
)
);
}
}
else
{
$tokens = explode(';', $field);
if (isset($exif[$tokens[0]][$tokens[1]]))
{
$key = $tokens[1];
if (isset($lang['exif_field_'.$tokens[1]]))
{
$key = $lang['exif_field_'.$tokens[1]];
}
$template->assign_block_vars(
'metadata.line',
array(
'KEY' => $key,
'VALUE' => $exif[$tokens[0]][$tokens[1]]
)
);
}
}
}
}
}
if ($conf['show_iptc'])
{
$iptc = get_iptc_data($picture['current']['src'],
$conf['show_iptc_mapping']);
if (count($iptc) > 0)
{
$template->assign_block_vars(
'metadata.headline',
array('TITLE' => 'IPTC Metadata')
);
}
foreach ($iptc as $field => $value)
{
$key = $field;
if (isset($lang[$field]))
{
$key = $lang[$field];
}
$template->assign_block_vars(
'metadata.line',
array(
'KEY' => $key,
'VALUE' => $value
)
);
}
}
}
//------------------------------------------------------- favorite manipulation
if ( !$user['is_the_guest'] )
{

View file

@ -196,6 +196,26 @@
<input type="radio" class="radio" name="use_iptc" value="true" {USE_IPTC_YES} />{L_YES}&nbsp;&nbsp;
<input type="radio" class="radio" name="use_iptc" value="false" {USE_IPTC_NO} />{L_NO}
</td>
</tr>
<tr>
<td>
<strong>{L_SHOW_EXIF}&nbsp;:</strong>
<br /><span class="small">{L_SHOW_EXIF_INFO}</span>
</td>
<td class="row1">
<input type="radio" class="radio" name="show_exif" value="true" {SHOW_EXIF_YES} />{L_YES}&nbsp;&nbsp;
<input type="radio" class="radio" name="show_exif" value="false" {SHOW_EXIF_NO} />{L_NO}
</td>
</tr>
<tr>
<td>
<strong>{L_SHOW_IPTC}&nbsp;:</strong>
<br /><span class="small">{L_SHOW_IPTC_INFO}</span>
</td>
<td class="row1">
<input type="radio" class="radio" name="show_iptc" value="true" {SHOW_IPTC_YES} />{L_YES}&nbsp;&nbsp;
<input type="radio" class="radio" name="show_iptc" value="false" {SHOW_IPTC_NO} />{L_NO}
</td>
</tr>
<!-- BEGIN remote_sites -->
<tr>

View file

@ -69,6 +69,30 @@
</a>
</div>
<!-- END favorite -->
<!-- BEGIN show_metadata -->
[ <a href="{show_metadata.URL}">{L_PICTURE_SHOW_METADATA}</a> ]
<!-- END show_metadata -->
<!-- BEGIN hide_metadata -->
[ <a href="{hide_metadata.URL}">{L_PICTURE_HIDE_METADATA}</a> ]
<!-- END hide_metadata -->
<!-- BEGIN metadata -->
<table class="metadata">
<!-- BEGIN headline -->
<tr>
<th colspan="2">{metadata.headline.TITLE}</th>
</tr>
<!-- END headline -->
<!-- BEGIN line -->
<tr>
<td>{metadata.line.KEY}</td>
<td>{metadata.line.VALUE}</td>
</tr>
<!-- END line -->
</table>
<!-- END metadata -->
<!-- BEGIN modification -->
<div class="menu" style="text-align:center;margin:5px;">
[ <a href="{U_ADMIN}">{L_ADMIN}</a> ]

74
tools/metadata.php Normal file
View file

@ -0,0 +1,74 @@
<?php
// +-----------------------------------------------------------------------+
// | metadata.php |
// +-----------------------------------------------------------------------+
// | application : PhpWebGallery <http://phpwebgallery.net> |
// | branch : BSF (Best So Far) |
// +-----------------------------------------------------------------------+
// | file : $RCSfile$
// | last update : $Date$
// | last modifier : $Author$
// | revision : $Revision$
// +-----------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation |
// | |
// | This program is distributed in the hope that it will be useful, but |
// | WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | General Public License for more details. |
// | |
// | You should have received a copy of the GNU General Public License |
// | along with this program; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+
$filename = 'sample.jpg';
echo 'Informations are read from '.$filename.'<br /><br /><br />';
$iptc_result = array();
$imginfo = array();
getimagesize($filename, $imginfo);
if (isset($imginfo['APP13']))
{
$iptc = iptcparse($imginfo['APP13']);
if (is_array($iptc))
{
foreach (array_keys($iptc) as $iptc_key)
{
if (isset($iptc[$iptc_key][0]) and $value = $iptc[$iptc_key][0])
{
// strip leading zeros (weird Kodak Scanner software)
while ($value[0] == chr(0))
{
$value = substr($value, 1);
}
// remove binary nulls
$value = str_replace(chr(0x00), ' ', $value);
}
$iptc_result[$iptc_key] = $value;
}
}
echo 'IPTC Fields in '.$filename.'<br />';
$keys = array_keys($iptc_result);
sort($keys);
foreach ($keys as $key)
{
echo '<br />'.$key.' = '.$iptc_result[$key];
}
}
else
{
echo 'no IPTC information';
}
echo '<br /><br /><br />';
echo 'EXIF Fields in '.$filename.'<br />';
$exif = read_exif_data($filename);
echo '<pre>';
print_r($exif);
echo '</pre>';
?>