无法从从Base64

时间:2019-04-03 17:38:17

标签: java metadata-extractor

我目前正在围绕元数据提取器库开发一个小型包装程序,以便能够从ColdFusion代码访问JPEG上的一些元数据属性。 JPEG数据从REST端点作为base64字符串进入ColdFusion。我想将该字符串转换为字节数组,并从JPEG中读取Exif元数据,并将原始创建日期作为字符串返回给ColdFusion。但是,我无法从转换后的字节数组中读取Exif块。

我尝试同时使用java.utils.Base64和javax.xml.bind.DatatypeConverter进行base64转换,但在两种情况下,元数据提取程序都找不到Exif数据。我在十六进制编辑器中打开了原始源图像,并且存在Exif数据。我还尝试在原始图像文件上使用元数据提取器,但效果很好,当我打印出目录和标签时,就出现了Exif标头。

这是我用来读取元数据的类的构造函数:

public ImageMetaDataReader(String base64ImageData) throws IOException, ImageProcessingException {
        // create the image object from the provided string data

        byte [] imageBytes = java.util.Base64.getDecoder().decode(base64ImageData);
        javax.xml.bind.DatatypeConverter.parseBase64Binary(lexicalXSDBase64Binary)
        ByteArrayInputStream imageBytesReader = new ByteArrayInputStream(imageBytes);
        fileMetaData = JpegMetadataReader.readMetadata(imageBytesReader);

        imageBytesReader.reset();

        // read the exif data as well
        exifMetaData = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageBytes), imageBytes.length, FileType.Jpeg);
        return;
    }

我也曾尝试以徒劳的方式直接使用ExifReader,但在Intel和Motorola字节顺序之间却出现了不清楚的区别。

当我对原始图像运行代码时,我得到了JPEG数据中实际存在的所有文件头,Exif数据和所有其他标签。如构造函数所示,对base64字符串运行它时,我得到了几个JPEG目录,一些JFIF目录和一个Huffman表目录,

我怀疑鉴于上面提到的异常,在转换过程中某个地方的字节顺序被弄乱了,但是我不确定如何解决该问题。我能想到的唯一解决方案是将JPEG数据写到一个临时文件中,然后再读回,但是如果有更好的可行解决方案,我宁愿不这样做。

1 个答案:

答案 0 :(得分:0)

答案实际上是我最初如何在测试代码中创建base64字符串。最初,我将图像作为BufferedImage抓取,然后使用ImageIO方法将其读取为字节数组。我简化了测试代码,使其看起来像这样:

        byte [] fileContent = Files.readAllBytes(new File("duck.jpeg").toPath());
        String base64Image = java.util.Base64.getEncoder().encodeToString(fileContent);

        ImageMetaDataReader reader = new ImageMetaDataReader(base64Image);
        printResult(reader.getImageMetaData(), "imageMetaDataTest()");

现在我得到了所有元数据。我唯一能想到的是,当我将图像数据读入字节数组时,ImageIO函数会以某种方式擦除/破坏Exif数据。