使用Javascript从JPEG中提取IPTC信息

我正在尝试使用 Javascript从JPEG文件中提取IPTC照片字幕信息. (我知道我可以做这个服务器端,但我正在寻找一个Javascript解决方案.)

我发现了this script,它提取EXIF信息…但我不知道如何适应它抓住IPTC数据.

是否有任何现有的脚本提供这样的功能?如果没有,您将如何修改EXIF脚本以解析IPTC数据?

UPDATE

我修改了我上面链接的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,9) != "Photoshop") {
    if (bDebug) log("Not valid Photoshop data! " + getStringAt(oFile,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 + 1) == 80) {
      var credit = getString2At(oFile,300);
   }       
}

exif['ImageDescription'] = caption;
exif['Artist'] = credit;

return exif;

}

所以让我现在稍稍修改一下我的问题.上述功能如何改善?

解决方法

对于什么是值得的,我推断了这一点…我没有做大量的测试,但几个测试图像我似乎工作.
var bDebug = false;

    var fieldMap = {
        120 : 'caption',110 : 'credit',25 : 'keywords',85 : 'byline',122 : 'captionWriter',105 : 'headline',116 : 'copyright',15 : 'category'
    };

    function readIPTCData(oFile,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,oFile.getShortAt(iOffset+2,true)-2);

            } else {
                iOffset += 2 + oFile.getShortAt(iOffset+2,true);
            }

        }

    }

    IPTC.readFromBinaryFile = function(oFile) {
        return findIPTCinJPEG(oFile);
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)