Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从exiftool读取二进制图片数据?_Java_Ubuntu_Exiftool - Fatal编程技术网

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

Java 从exiftool读取二进制图片数据?,java,ubuntu,exiftool,Java,Ubuntu,Exiftool,我正在开发一个.opus音乐库软件,它可以将音频/视频文件转换为.opus文件,并自动用元数据标记它们 该程序的早期版本将专辑艺术保存为二进制数据,这显然是exiftool透露的 问题是,当我使用-b选项运行命令以二进制形式输出数据时,整个过程似乎都是二进制的。我不知道如何让程序解析它。我有点期待一个条目,如图片:110100101011011 但输出与此类似: 如何解析图片数据,以便为新版本的程序重建图像?我在Kubuntu 18.04上使用的是Java8_171,看起来您正试图在文本编辑器

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

该程序的早期版本将专辑艺术保存为二进制数据,这显然是exiftool透露的

问题是,当我使用-b选项运行命令以二进制形式输出数据时,整个过程似乎都是二进制的。我不知道如何让程序解析它。我有点期待一个条目,如图片:110100101011011

但输出与此类似:


如何解析图片数据,以便为新版本的程序重建图像?我在Kubuntu 18.04上使用的是Java8_171,看起来您正试图在文本编辑器中打开原始字节,这当然会让您大吃一惊,因为这些原始字节并不代表任何文本编辑器都可以显示的字符。我可以从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"));
        }
    }
}

但这是一个问题,我不知道从哪里开始。如果我这样做了,我可以将字节传递给imageview或类似的东西。您可以直接传递输出。输出是嵌入图像的原始转储,通常是jpg。只需运行exiftool-Picture-b文件,就可以获取输出流并将其视为图像文件。或者您可以使用'exiftool-Picture-b file>Tempfile.jpg将输出重定向到一个临时文件,然后以这种方式进行处理。@StarGeek Nice。我不知道。我明天来测试一下。如果您将其作为答案发布,如果它有效,我将接受: