Android:从inputstream定义图像类型(jpeg或jpeg2000)

时间:2015-03-04 09:21:24

标签: java android jpeg inputstream jpeg2000

我有一个包含图像的输入流。图片可以与jpeg中一样,因此采用jpeg2000格式。 我已记录该流,并查看jpeg2000的下一个:

������jP

jpeg

������JFIF

根据我的理解,流中应该有一些神奇的字节,它将返回图像类型。任何想法如何得到它们?这应该与Android兼容

3 个答案:

答案 0 :(得分:1)

在我看来,您想要的是阅读一些元数据,以便找到有关您正在加载的图片的更多信息。

我不知道在Android中存在API以执行此操作,但this可能就是您所需要的。

例如,在您的情况下,您可以在官方文档中引用this

答案 1 :(得分:0)

尝试此操作以检查文件类型

private static String getMimeType(String fileUrl) {
    String extension = MimeTypeMap.getFileExtensionFromUrl(fileUrl);
    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}

答案 2 :(得分:0)

    public static ImageType getImageType(byte[] data) {
    if (data == null) {
        return UNKNOWN;
    }
    byte[] header = new byte[11];
    System.arraycopy(data, 0, header, 0, Math.min(data.length, header.length));
    int c1 = header[0] & 0xff;
    int c2 = header[1] & 0xff;
    int c3 = header[2] & 0xff;
    int c4 = header[3] & 0xff;
    int c5 = header[4] & 0xff;
    int c6 = header[5] & 0xff;
    int c7 = header[6] & 0xff;
    int c8 = header[7] & 0xff;
    int c9 = header[8] & 0xff;
    int c10 = header[9] & 0xff;
    int c11 = header[10] & 0xff;

    Log.d(TAG, "Headers: " + "\nc1: " + c1 + "\nc2: " + c2 + "\nc3: " + c3 + "\nc4: " + c4 +  "\nc5: " + c5
            + "\nc6: " + c6 + "\nc7: " + c7 + "\nc8: " + c8 + "\nc9: " + c9 + "\nc10: " + c10 + "\nc11: " + c11);

    // verify JPEG format
    if (c1 == 0xFF && c2 == 0xD8 && c3 == 0xFF) {
        if (c4 == 0xE0) {
            return JPEG;
        }

        /**
         * File format used by digital cameras to store images. Exif Format can be read by any application supporting JPEG. Exif Spec can be found at:
         * http://www.pima.net/standards/it10/PIMA15740/Exif_2-1.PDF
         */
        if ((c4 == 0xE1) && (c7 == 'E' && c8 == 'x' && c9 == 'i' && c10 == 'f' && c11 == 0)) {
            return JPEG;
        }
    }
    // verify JPEG2000 format. Codestream - http://sourceforge.net/p/optipng/mercurial/ci/a9d8ace0ee2f1aab641b787d252c166373bdeddc/tree/src/pngxtern/pngxrjpg.c#l26
    // 00 00 00 0C 6A 50 20 20 0D 0A 87 0A
    else if (c1 == 0x00 && c2 == 0x00 && c3 == 0x00 && c4 == 0x0C) {
        return JPEG2000;
    }

    // return JPEG by default
    return JPEG;
}

某些代码段取自here,并针对JPEG2000定义进行了增强。 默认情况下,在我的情况下返回JPEG格式,可以是你的其他任何东西。 UNKNOWNJPEGJPEG2000只是我的自定义枚举。