我一直在寻找这个问题3天了 - 尝试任何接近或相关的问题,看看我是否能让它发挥作用....
我正在用PHP
从JPG文件中提取EXIF标签并在一个简单的鼠标悬停脚本中使用它,但这就是它崩溃的地方:
获取EXIF数据
foreach($images as $img){
$exif = exif_read_data($img, 0, true);
在我测试期间,我简化了变量名称 - 我不认为这是必要的,但这就是我现在的位置
$Ititle = $exif['IFD0']['Title'];
$Isubject = $exif['IFD0']['Subject'];
$Icomment = $exif['IFD0']['Comments'];
$m = "<p>Title: ".$Ititle."<BR>Subject: ".$Isubject."<BR>Comments: ".$Icomment."</p>";
echo $m;
此Echo $ m按照预期使用Jpg图像中的标题/主题/评论。
所以我有一个缩略图使用鼠标悬停将大图像“preview1.2.3.4 ...”更改为鼠标悬停的img ....并将<p>
更改为正确的标题/主题/评论..
<img onmouseover="document.getElementById('exifdata<?echo $b;?>').innerHTML = '<?echo $m;?>'; preview<?echo $b;?>.src=img<?echo $p;?>.src" name="img<?echo $p;?>" src="<?echo $img;?>" style="float:left; margin-right:10px; Max-width: 100px; Max-height:100px; width:auto; height:auto;">
Img和文本更改适用于翻转但是
它在<p>
中显示出来
标题:H a p p y C o u p l e
主题:E n j o y i n g I N S u m m e r s
评论:
这是文本更改的DIV
<div style="width:680px; height:auto; overflow:hidden; background: rgba(66, 95, 149, 1);">
<p id='exifdata<?echo $b;?>'>testing
</p>
</div>
什么是添加这些问号后通过此innerHTML?
整个php页面:*对不起,如果它很乱 - 我一直在尝试很多东西
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<?php
header('Content-Type:text/html; charset=UTF-8');
$b = 1;
$blogs = array_filter(glob('./Content/*'), 'is_dir');
foreach($blogs as $entries){
/*
print "<br>";
print $entries;
print "<br>";
print "<p>Images</p>";
*/
#get all the JPG s in the blog folder
$images = array_filter(glob("$entries/*.JPG"));
#get Textblock and title txt files for verbage....
$textblock = file_get_contents("$entries/Textblock.txt");
$title = file_get_contents("$entries/Title.txt");
#get date for post
$PostDatestr = substr($entries,-8);
$PostDate = date("d M Y", strtotime($PostDatestr));
#Create Entry regardless of type:
?>
<div id="Notice">
<div id="Title"><h2><?echo $title;?></h2></div>
<section class="Wrapper">
<header class="Wrapper"><h1><?echo $PostDate;?></h1></header>
<article>
<?
#print the Blog post.... if one or less photos in DIR
if (count($images) <= 1){
#Don't use img tag if there are 0 images.
if (count($images) === 1){
?><img src="<?echo $images[0];?>" style="float:left; margin-right:10px; Max-width: 680px; Max-height:680px; width:auto; height:auto;">
<?
}
echo $textblock;
}
#print the Blog post.... if there is more than 1 photo in DIR
if (count($images) > 1){
#get info for each photo
?>
<div class="thumbnails" style="width;100%; height:auto; display:block; overflow:hidden;">
<?
foreach($images as $img){
$exif = exif_read_data($img, 0, true);
$Ititle = $exif['IFD0']['Title'];
$Isubject = $exif['IFD0']['Subject'];
$Icomment = $exif['IFD0']['Comments'];
$m = "<p>Title: ".$Ititle."<BR>Subject: ".$Isubject."<BR>Comments: ".$Icomment."</p>";
echo $m;
#echo $exif===false ? "No header data found.<br />\n" : "Image contains headers<br />\n";
?>
<img onmouseover="document.getElementById('exifdata<?echo $b;?>').innerHTML = '<?echo $m;?>'; preview<?echo $b;?>.src=img<?echo $p;?>.src" name="img<?echo $p;?>" src="<?echo $img;?>" style="float:left; margin-right:10px; Max-width: 100px; Max-height:100px; width:auto; height:auto;">
<?
$p++;
$lastimg = $img;
}
?>
</div>
<br><br>
<div class="preview<?echo $b;?>" align="center" Style="width:640px; margin:0 auto; overflow:hidden;">
<img name="preview<?echo $b;?>" src="<?echo $lastimg;?>" style="float:left; margin-right:10px; Max-width: 680px; Max-height:680px; width:auto; height:auto;" alt=""/>
</div>
<div style="width:680px; height:auto; overflow:hidden; background: rgba(66, 95, 149, 1);">
<p id='exifdata<?echo $b;?>'>testing
</p>
</div>
<?
}
?>
</article>
</Section>
</div>
<?
$b++;
}
?>
</body>
</html>
答案 0 :(得分:0)
我终于找到了解决问题的功能......
https://stackoverflow.com/a/20103241/1112764
谢谢! 我尝试了所有不同的编码/解码方式,用不同的程序重新标记到JPG中 - 我不得不使用这种方式去除无效字符。
答案 1 :(得分:0)
背景
问题可能是图像文件中标签格式错误的结果。即标记文本被写为Unicode(16),但在标记头字段中列为ASCII。标记格式在2002年的Exif 2.2和2012年的Exif 2.3 (JEITA CP-3451)中有所描述。如果exif_read_data
将所有内容视为ASCII而不考虑格式标记,则会出现相同的结果。
有报告称图像文件处理软件将错误引入Unicode图像标记。例如,根据图像历史记录,此KDE错误EXIF UserComments with special characters get tagged as ASCII仍可能是一个问题。
�字符本身是Unicode&#34;替换字符&#34;,代码点65533十进制,用于替换字符串中的无效字符。对于存储为16位值的ASCII文本,高位字节为零(ASCII NUL字符),可能是要替换的字符。尚未证实替换发生的地方 - 图像标记可能标记为Unicode并包含替换字符(不太可能),exif_read_data()
可能正在插入它们(可能但未经证实),或者浏览器可能正在用替换字符替换NUL字符(不太可能或依赖浏览器。)
我建议检查以下内容:
PHP setup需要对Unicode字符更正,并且模块mbstring必须可用。如果您必须处理来自需要不同设置的不同系统的图像,则文档读取不好。
具有明显限制的快速解决方案是通过删除NUL和替换字符将标记字符串转换为US-ASCII或至少Latin1 8位八位字节。执行此操作的功能是
function annul(s)
{ return s.replace(/[\u0000|\uFFFD]/g, "");
}
这至少清理了帖子中的字符串,但不会恢复存在的任何Unicode字符。
更难的方法是从标记字符串中返回的字符对重建Unicode 16值。必须这样做意味着PHP存在严重问题,或者图像文件编码严重,或者两者兼而有之,并且可能无法在所有情况下都有效。
理想的做法是为Unicode设置PHP exif.ini,并使用适合设置的编码声明正确标记所有图像。
决定采取什么行动在很大程度上取决于您的网站是否支持Unicode和全球语言。