从java中的图像中删除Exif数据?

时间:2014-03-28 20:30:34

标签: java jpeg exif

从图像中删除exif数据然后将其移动到另一个文件夹的最简单方法是什么?相同的位置,只是在一个文件夹中。这样就有原始副本。

感谢。

3 个答案:

答案 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);
    }