Не удается прочитать данные Exif из изображения JPEG, преобразованного из Base64 - PullRequest
0 голосов
/ 03 апреля 2019

В настоящее время я разрабатываю небольшую оболочку для библиотеки экстрактора метаданных, чтобы иметь возможность доступа к нескольким атрибутам метаданных в JPEG из кода ColdFusion.Данные JPEG поступают в ColdFusion из конечной точки REST в виде строки base64.Я хотел преобразовать эту строку в байтовый массив и прочитать метаданные Exif из JPEG, вернув исходную дату создания в ColdFusion в виде строки.Однако я не могу прочитать блок Exif из преобразованного байтового массива.

Я попытался использовать java.utils.Base64 и javax.xml.bind.DatatypeConverter для преобразования base64, но в обоих случаяхИзвлечение метаданных не может найти данные Exif.Я открыл исходное исходное изображение в шестнадцатеричном редакторе и данные Exif присутствуют.Я также попытался использовать metadata-extractor для исходного файла изображения, и это работало нормально, заголовки 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 и каталог таблиц Хаффмана, ничего больше.

Я подозреваю, что где-то во время преобразования порядок байтовпортится из-за исключения, которое я получил выше, но я не совсем уверен, что делать, чтобы его решить.Единственное решение, которое я могу придумать, - это записать данные JPEG во временный файл, а затем прочитать их обратно, но я бы не стал этого делать, если есть лучшее работоспособное решение.

1 Ответ

0 голосов
/ 04 апреля 2019

Ответ на самом деле оказался в том, как я изначально создавал строку 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, когда я считываю данные изображения в байтовый массив.

...