使用Javascript从JPEG中提取IPTC信息
我正在尝试使用Javascript从JPEG文件中提取IPTC照片标题信息。(我知道我可以在服务器端完成这项工作,但我正在专门寻找Javascript解决方案。) 我发现,它提取EXIF信息。。。但我不知道如何调整它以获取IPTC数据 是否存在提供此类功能的现有脚本?如果没有,您将如何修改EXIF脚本以同时解析IPTC数据 更新 我已经修改了上面链接的EXIF脚本。它有点像我想要的那样,但它并不是百分之百地获取正确的数据 在第401行之后,我添加了:使用Javascript从JPEG中提取IPTC信息,javascript,image-processing,exif,iptc,Javascript,Image Processing,Exif,Iptc,我正在尝试使用Javascript从JPEG文件中提取IPTC照片标题信息。(我知道我可以在服务器端完成这项工作,但我正在专门寻找Javascript解决方案。) 我发现,它提取EXIF信息。。。但我不知道如何调整它以获取IPTC数据 是否存在提供此类功能的现有脚本?如果没有,您将如何修改EXIF脚本以同时解析IPTC数据 更新 我已经修改了上面链接的EXIF脚本。它有点像我想要的那样,但它并不是百分之百地获取正确的数据 在第401行之后,我添加了: else if (iMarker == 23
else if (iMarker == 237) {
// 0xED = Application-specific 13 (Photoshop IPTC)
if (bDebug) log("Found 0xFFED marker");
return readIPTCData(oFile, iOffset + 4, getShortAt(oFile, iOffset+2, true)-2);
}
然后在脚本的其他地方,我添加了这个函数:
function readIPTCData(oFile, iStart, iLength) {
exif = new Array();
if (getStringAt(oFile, iStart, 9) != "Photoshop") {
if (bDebug) log("Not valid Photoshop data! " + getStringAt(oFile, iStart, 9));
return false;
}
var output = '';
var count = 0;
two = new Array();
for (i=0; i<iLength; i++) {
if (getByteAt(oFile, iStart + i) == 2 && getByteAt(oFile, iStart + i + 1) == 120) {
var caption = getString2At(oFile, iStart + i + 2, 800);
}
if (getByteAt(oFile, iStart + i) == 2 && getByteAt(oFile, iStart + i + 1) == 80) {
var credit = getString2At(oFile, iStart + i + 2, 300);
}
}
exif['ImageDescription'] = caption;
exif['Artist'] = credit;
return exif;
}
函数readIPTCData(oFile、iStart、iLength){
exif=新数组();
如果(getStringAt(oFile,iStart,9)!=“Photoshop”){
if(bDebug)日志(“无效的Photoshop数据!”+getStringAt(oFile,iStart,9));
返回false;
}
var输出=“”;
var计数=0;
二=新数组();
对于(i=0;i嗯,如果您找不到一个已经这样做的库,那么这应该可以让您继续创建自己的javascript解析器
对于它的价值,我对此进行了一点推断……我没有做过很多测试,但我所做的少数测试图像似乎有效
var bDebug = false;
var fieldMap = {
120 : 'caption',
110 : 'credit',
25 : 'keywords',
85 : 'byline',
122 : 'captionWriter',
105 : 'headline',
116 : 'copyright',
15 : 'category'
};
function readIPTCData(oFile, iStart, iLength) {
var data = {};
if (oFile.getStringAt(iStart, 9) != "Photoshop") {
if (bDebug) log("Not valid Photoshop data! " + oFile.getStringAt(iStart, 9));
return false;
}
var fileLength = oFile.getLength();
var length, offset, fieldStart, title, value;
var FILE_SEPARATOR_CHAR = 28,
START_OF_TEXT_CHAR = 2;
for (var i = 0; i < iLength; i++) {
fieldStart = iStart + i;
if(oFile.getByteAt(fieldStart) == START_OF_TEXT_CHAR && oFile.getByteAt(fieldStart + 1) in fieldMap) {
length = 0;
offset = 2;
while(
fieldStart + offset < fileLength &&
oFile.getByteAt(fieldStart + offset) != FILE_SEPARATOR_CHAR &&
oFile.getByteAt(fieldStart + offset + 1) != START_OF_TEXT_CHAR) { offset++; length++; }
if(!length) { continue; }
title = fieldMap[oFile.getByteAt(fieldStart + 1)];
value = oFile.getStringAt(iStart + i + 2, length) || '';
value = value.replace('\000','').trim();
data[title] = value;
i+=length-1;
}
}
return data;
}
function findIPTCinJPEG(oFile) {
var aMarkers = [];
if (oFile.getByteAt(0) != 0xFF || oFile.getByteAt(1) != 0xD8) {
return false; // not a valid jpeg
}
var iOffset = 2;
var iLength = oFile.getLength();
while (iOffset < iLength) {
if (oFile.getByteAt(iOffset) != 0xFF) {
if (bDebug) console.log("Not a valid marker at offset " + iOffset + ", found: " + oFile.getByteAt(iOffset));
return false; // not a valid marker, something is wrong
}
var iMarker = oFile.getByteAt(iOffset+1);
if (iMarker == 237) {
if (bDebug) console.log("Found 0xFFED marker");
return readIPTCData(oFile, iOffset + 4, oFile.getShortAt(iOffset+2, true)-2);
} else {
iOffset += 2 + oFile.getShortAt(iOffset+2, true);
}
}
}
IPTC.readFromBinaryFile = function(oFile) {
return findIPTCinJPEG(oFile);
}
var-bDebug=false;
变量字段映射={
120:‘标题’,
110:‘信用’,
25:‘关键字’,
85:‘署名’,
122:“captionWriter”,
105:"标题",,
116:‘版权’,
15:‘类别’
};
函数ReadIPCDATA(oFile、iStart、iLength){
变量数据={};
if(oFile.getStringAt(iStart,9)!=“Photoshop”){
if(bDebug)日志(“无效的Photoshop数据!”+oFile.getStringAt(iStart,9));
返回false;
}
var fileLength=oFile.getLength();
变量长度、偏移量、字段开始、标题、值;
var FILE_SEPARATOR_CHAR=28,
_TEXT_CHAR的开始_=2;
对于(变量i=0;i
我建议在Node.js和browser中都可以使用的库。它还支持新的HEIC图像格式
exifr.parse(输入,{iptc:true})。然后(输出=>{
console.log('IPTC',输出)
})
它解析多种数据格式(TIFF/EXIF、ICC、IPTC、XMP、JFIF)但是默认情况下IPTC没有启用,所以您需要在示例中所示的选项中启用它。这只在支持新的ish HTML5文件API的浏览器中才可能。您链接的脚本似乎通过从服务器获取图像数据来获取图像数据,这可能不是您想要做的。是的,这很好——我正在开发只供内部使用,我们都有最新的浏览器,所以这不是问题。这对我不起作用。你有JSFIDLE的例子吗?对于其他需要跨浏览器支持的人来说,这是一种处理JavaScript中二进制数据的好方法。“oFile”希望得到什么?IPTC的定义在哪里?它对PNG有效吗也