如何识别byte []的内容是jpeg?

时间:2010-12-28 23:15:57

标签: java image jpeg

我有一个小字节数组(25K以下),我接收并解码为更大的消息信封的一部分。有时这是一个图像,当它是图像时,有时它是一个jpg。我没有字节数组以外的上下文信息,并且需要识别它是否是图像,以及图像是否为jpg类型。

是否有一些神奇的数字或魔术字节存在于开头,结尾或某些偏移处,我可以看一下来识别它?

我的代码示例如下(来自内存,而不是c / p):

byte[] messageBytesAfterDecode = retrieveBytesFromEnvelope();
if(null != messageBytesAfterDecode && messageBytesAfterDecode > 0){
    if(areTheseBytesAJpeg(messageBytesAfterDecode)){
        doSomethingWithAJpeg(messageBytesAfterDecode)
    }else{
        flagEnvelopeAsHavingBadContentInTheField();
    }
}

我真的需要进入

的内容
areTheseBytesAJpeg(byte[] mBytes){}

方法,甚至指向详细说明的规范的指针。我希望有一个非常快速的方法来做出这个决定,因为我真的不想将它们读成图像等。

6 个答案:

答案 0 :(得分:51)

来自维基百科:

  

JPEG图像文件以FF D8开头,以FF D9结束。

http://en.wikipedia.org/wiki/Magic_number_(programming)

答案 1 :(得分:10)

有关jpeg的其他文件格式的一些额外信息:文件的初始值包含这些字节

BMP : 42 4D
JPG : FF D8 FF EO ( Starting 2 Byte will always be same)
PNG : 89 50 4E 47
GIF : 47 49 46 38

一些代码:

private static Boolean isJPEG(File filename) throws Exception {
    DataInputStream ins = new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));
    try {
        if (ins.readInt() == 0xffd8ffe0) {
            return true;
        } else {
            return false;

        }
    } finally {
        ins.close();
    }
}

答案 2 :(得分:6)

关于幻数(包括JPEG文件)的另一个“知识”来源是GNU / Linux magic命令使用的file文件。

如果您安装了file命令,那么file --version将告诉您magic文件所在的位置,您可以使用文本编辑器阅读它...并仔细阅读man 5 magic

magic文件内容确认其他答案的详细信息。)

答案 3 :(得分:5)

引用this wikipedia article

  

JPEG图像文件以FF D8和   用FF D9结束。 JPEG / JFIF文件   包含“JFIF”的ASCII代码(4A   46 49 46)作为空终止字符串。   JPEG / Exif文件包含ASCII代码   对于“Exif”(45 78 69 66)也作为一个   null终止字符串,后跟   有关该文件的更多元数据。

答案 4 :(得分:3)

许多格式都是通过所谓的魔术数字来识别的。这些是通常位于文件前面的字节序列,用于识别以下二进制数据是否真的与您的想法完全相同。快速谷歌搜索返回:http://www.linfo.org/magic_number.html,特别是引用:

“同样,JPEG(联合图像专家组)图像文件常用的幻数是0x4A464946,它是JFIF(JPEG文件交换格式)的ASCII等价物。但是,JPEG幻数不是第一个字节。文件;相反,它们以第七个字节开头。其他示例包括用于MIDI(乐器数字接口)文件的0x4D546864和用于bzip2压缩文件的0x425a6831415925。“

答案 5 :(得分:0)

JPG文件确实有一个特定的标题,您可以使用它来确定它是JPG文件的可能性非常高。但是,目前尚不清楚是否将整个文件放在字节数组中。

无论如何,这里有关于标题的详细信息:http://www.fastgraph.com/help/jpeg_header_format.html