【发布时间】:2020-01-02 08:56:18
【问题描述】:
从图像中删除 exif 数据然后将其移动到另一个文件夹的最简单方法是什么?相同的位置,只是在一个文件夹中。这样就有原件了。
谢谢。
【问题讨论】:
-
读入字节,找到要删除的内容,将其删除。如果您使用 Google 搜索,我确信 jpeg 格式可以在线获取。或者,您可以使用在线提供的几种免费独立图像编辑器之一。
-
到目前为止你得到了什么?
从图像中删除 exif 数据然后将其移动到另一个文件夹的最简单方法是什么?相同的位置,只是在一个文件夹中。这样就有原件了。
谢谢。
【问题讨论】:
如果您确定所有照片都是 JPEG 格式,您可以使用:
try (
FileInputStream is = new FileInputStream(new File("/path/to/photo.jpg"));
FileOutputStream os = new FileOutputStream(new File("/path/to/photo_without.jpg"))) {
new ExifRewriter().removeExifMetadata(is, os);
}
catch (IOException | ImageWriteException | ImageReadException e) {
System.err.println(e);
}
另外,如果你有 png/bmp/jpg,你需要读/写你的图片,但是这个方法比第一个慢:
// instead of just using ImageIO.read(stream)
// https://github.com/haraldk/TwelveMonkeys/issues/197
try (ImageInputStream input = ImageIO.createImageInputStream(stream)) {
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
if (!readers.hasNext()) return null;
ImageReader reader = readers.next();
reader.setInput(input);
ImageReadParam param = reader.getDefaultReadParam();
BufferedImage img = reader.getImageTypes(0).next().createBufferedImage(reader.getWidth(0), reader.getHeight(0));
param.setDestination(img);
try {
img = reader.read(0, param);
} catch (IOException e) {
logger.error("Ignored error reading photo while processing: ", e);
}
return img;
}
// here you remove the exif
try (
FileInputStream is = new FileInputStream(new File("/path/to/photo.jpg"));
FileOutputStream os = new FileOutputStream(new File("/path/to/photo_without.jpg"))) {
BufferedImage bi = readPhotoStream(is);
ImageIO.write(bi, "extensionString", os);
} catch (IOException e) {
System.err.println(e);
}
【讨论】:
我认为一种简单的方法是将其作为图像读取,然后使用ImageIO.read(...) 和ImageIO.write(...) 将其写入新文件夹。我认为Images 没有元数据。如果这不起作用,您可以将其写为 bmp,然后重新读取并再次将其写为 jpeg。
【讨论】:
您需要做的就是对 JPEG 文件进行二进制读取。搜索 APP1 标记(可能还有 APP2 标记以及扩展名)。从源逐字节复制到目标。当您点击 APP1(或 APP2)标记时,停止复制并读取到下一个标记,然后再继续复制。
这造成的问题是您的 JPEG 流没有意义。 JPEG 本身没有颜色分量的定义。这来自 Exif(或 JFif)标记。
【讨论】: