繁体   English   中英

无法从从Base64转换的JPEG图像中读取Exif数据

[英]Cannot read Exif data from JPEG image converted from Base64

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

我尝试使用java.utils.Base64和javax.xml.bind.DatatypeConverter来执行base64转换,但在这两种情况下,metadata-extractor都找不到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字节排序之间的区别。

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

我怀疑在转换过程中的某个地方,由于上面的例外情况,字节排序被搞砸了,但我真的不知道如何解决它。 我能想到的唯一解决方案是将JPEG数据写入临时文件然后再读回来,但如果有更好的可行解决方案,我宁愿不这样做。

答案实际上是我最初在测试代码中创建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数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM