从exiftool读取二进制图片数据?

时间:2018-07-15 17:07:06

标签: java ubuntu exiftool

我正在开发.opus音乐库软件,该软件可将音频/视频文件转换为.opus文件并自动用元数据标记它们。

该程序的先前版本已将专辑封面保存为二进制数据,显然是exiftool所揭示的。

exiftool output

问题是,当我运行命令使用-b选项将数据输出为二进制文件时,整个事情似乎都是二进制文件。我不确定如何使程序进行解析。我有点期待像Picture : 11010010101101101011...这样的条目。

输出看起来与此类似: Binary Output

如何解析图片数据,以便为程序的较新版本重建图片? (我在Kubuntu 18.04上使用Java8_171)

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试在文本编辑器中打开原始字节,因为这些原始字节不代表任何文本编辑器都可以显示的字符,因此,这当然会给您带来gobble-dee-gook的麻烦。从exiftool的输出中可以看到,您能够知道图像的长度(以字节为单位)。只要您知道文件中的起始字节位置,就可以使用少量Java代码使您的任务相对容易。如果您可以在文件中找到图像的起始位置,则应该可以执行以下操作:

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;

public class SaveImage {

    public static void main(String[] args) throws IOException {

        byte[] imageBytes;
        try (RandomAccessFile binaryReader =
                     new RandomAccessFile("your-file.xxx", "r")) {

            int dataLength = 0; // Assign this the byte length shown in your
                                // post instead of zero

            int startPos = 0;   // I assume you can find this somehow.
                                // If it's not at the beginning
                                // change it accordingly.

            imageBytes = new byte[dataLength];
            binaryReader.read(imageBytes, startPos, dataLength);
        }

        try (InputStream in = new ByteArrayInputStream(imageBytes)) {
            BufferedImage bImageFromConvert = ImageIO.read(in);
            ImageIO.write(bImageFromConvert,
                    "jpg",  // or whatever file format is appropriate
                    new File("/path/to/your/file.jpg"));
        }
    }
}