Каков самый простой способ удалить exif-данные с изображения, а затем переместить их в другую папку? То же местоположение, только в папке. Таким образом, есть оригинальные копии.Удалить Exif данные из изображения в java?
Спасибо.
Каков самый простой способ удалить exif-данные с изображения, а затем переместить их в другую папку? То же местоположение, только в папке. Таким образом, есть оригинальные копии.Удалить Exif данные из изображения в java?
Спасибо.
Я думаю, что простой способ сделать это - прочитать его как изображение, а затем записать его в новую папку, используя ImageIO.read(...)
и ImageIO.write(...)
. Я не думаю, что у Image
есть метаданные. Если это не сработает, вы можете записать его как bmp, а затем перечитать его и записать снова как jpeg.
Все, что вам нужно сделать, это двоичное чтение файла JPEG. Поиск маркеров APP1 (возможно, маркеров APP2, а также для расширений). Скопируйте байт по байту из источника в пункт назначения. Когда вы нажимаете маркер APP1 (или APP2), прекратите копирование и прочитайте следующий маркер перед возобновлением копирования.
Проблема, создаваемая этим, заключается в том, что ваш поток JPEG не имеет никакого значения. JPEG сам по себе не имеет определения цветовых компонентов. Это происходит от маркеров Exif (или JFif).
Если и уверены, что все ваши фотографии 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);
}
Прочитать в байтах, найти то, что вы хотите удалить, удалить. Я уверен, что формат jpeg доступен в Интернете, если вы Google для него. Или вы можете использовать один из нескольких бесплатных автономных редакторов изображений, доступных в Интернете. –
Что у вас есть? – RyPope
Связанные: http://stackoverflow.com/questions/37062959/how-to-remove-image-metadata-from-large-images-without-out-of-memory-in-java – Thilo