从 exiftool 读取二进制图片数据?
Reading Binary Picture Data from exiftool?
我正在开发 .opus 音乐库软件,该软件可将 audio/video 文件转换为 .opus 文件并自动使用元数据对其进行标记。
该程序的早期版本已将专辑封面保存为二进制数据,显然正如 exiftool
所揭示的那样。
问题是,当我 运行 使用 -b
选项将数据输出为二进制的命令时,整个事情似乎都是二进制的。我不确定如何让程序解析它。我有点期待像 Picture : 11010010101101101011...
.
这样的条目
虽然输出看起来与此类似:
我如何解析图片数据以便为较新版本的程序重建图像? (我在 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"));
}
}
}
我正在开发 .opus 音乐库软件,该软件可将 audio/video 文件转换为 .opus 文件并自动使用元数据对其进行标记。
该程序的早期版本已将专辑封面保存为二进制数据,显然正如 exiftool
所揭示的那样。
问题是,当我 运行 使用 -b
选项将数据输出为二进制的命令时,整个事情似乎都是二进制的。我不确定如何让程序解析它。我有点期待像 Picture : 11010010101101101011...
.
虽然输出看起来与此类似:
我如何解析图片数据以便为较新版本的程序重建图像? (我在 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"));
}
}
}