gpt4 book ai didi

javascript - 使用 Javascript 从 JPEG 中提取 IPTC 信息

转载 作者:可可西里 更新时间:2023-11-01 02:25:21 25 4
gpt4 key购买 nike

我正在尝试使用 Javascript 从 JPEG 文件中提取 IPTC 照片说明信息。 (我知道我可以在服务器端执行此操作,但我正在专门寻找 Javascript 解决方案。)

我找到了 this script ,提取 EXIF 信息……但我不确定如何调整它以获取 IPTC 数据。

是否有提供此类功能的现有脚本?如果不是,您将如何修改 EXIF 脚本以解析 IPTC 数据?

更新

我修改了上面链接的 EXIF 脚本。它有点做了我想做的事,但它并没有在 100% 的时间内抓取正确的数据。

在第 401 行之后,我添加了:

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;

}

现在让我稍微修改一下我的问题。如何改进上述功能?

最佳答案

对于它的值(value),我对此进行了一些推断...我没有进行大量测试,但我使用的少数测试图像似乎有效。

    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);
}

关于javascript - 使用 Javascript 从 JPEG 中提取 IPTC 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5833026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com