从图像中删除exif数据然后将其移动到另一个文件夹的最简单方法是什么?相同的位置,只是在一个文件夹中。这样就有原始副本。
感谢。
答案 0 :(得分:0)
我认为一种简单的方法是将其作为图像读取,然后使用ImageIO.read(...)
和ImageIO.write(...)
将其写入新文件夹。我不认为Image
有元数据。如果这不起作用,你可以把它写成bmp,然后重新读取它并再次作为jpeg写。
答案 1 :(得分:0)
您需要做的就是对JPEG文件进行二进制读取。搜索APP1标记(可能是APP2标记以及扩展名)。从源到目标逐个字节地复制。当你按下APP1(或APP2)标记时,停止复制并在恢复复制之前读到下一个标记。
这会产生的问题是您的JPEG流没有任何意义。 JPEG本身没有颜色组件的定义。这来自Exif(或JFif)标记。
答案 2 :(得分:0)
如果您确定所有照片都是jpg格式,则可以使用
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你需要读/写你的图像,但这个方法比第一个慢吗
// read input stream into bufferedImage
private static BufferedImage readPhotoStream(InputStream stream) throws IOException {
// 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) {
LOG.error("Ignored error reading photo while processing: ", e);
}
return img;
}
// here u remove 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, extension, os);
}
catch (IOException e) {
System.err.println(e);
}