EXIF (Định dạng tệp hình ảnh có thể thay đổi) là tiêu chuẩn để chỉ định định dạng hình ảnh và âm thanh chủ yếu được sử dụng bởi máy ảnh kỹ thuật số và máy quét. Dữ liệu EXIF bao gồm thông tin gắn thẻ và siêu dữ liệu về tệp hình ảnh đã chụp. Siêu dữ liệu có thể chứa thông tin như hãng máy ảnh, kiểu máy, tốc độ màn trập, ngày giờ, khẩu độ, thời gian phơi sáng, độ phân giải X, độ phân giải Y. vân vân.

Nếu bạn muốn quản lý, trích xuất, cập nhật hoặc xóa dữ liệu EXIF của hình ảnh theo chương trình, thì bài viết này là dành cho bạn. Bài viết này sẽ trình bày các cách sau để thao tác với dữ liệu EXIF trong Java:

Thư viện thao tác siêu dữ liệu Java

API Java siêu dữ liệu của GroupDocs

GroupDocs.Metadata for Java là một Java API quản lý siêu dữ liệu dễ sử dụng. Nó không chỉ có khả năng trích xuất siêu dữ liệu từ các hình ảnh như JPG, PNG hoặc WebP mà còn có thể thêm, chỉnh sửa, cập nhật và xóa siêu dữ liệu khỏi hình ảnh và các tài liệu khác với các tùy chọn khác nhau.

Tôi đang sử dụng API này trong bài viết này, vì vậy vui lòng đảm bảo tải xuống hoặc tích hợp nó vào các ứng dụng dựa trên Maven của bạn bằng cách chỉ cần thêm các cấu hình sau vào tệp pom.xml.

Kho lưu trữ & phụ thuộc

<repository>
	<id>GroupDocsJavaAPI</id>
	<name>GroupDocs Java API</name>
	<url>http://repository.groupdocs.com/repo/</url>
</repository>
<dependency>
    <groupId>com.groupdocs</groupId>
    <artifactId>groupdocs-metadata</artifactId>
    <version>20.5</version>
    <classifier>javadoc</classifier>
</dependency>

Trích xuất dữ liệu EXIF từ hình ảnh trong Java - Trình xem siêu dữ liệu

Bạn có thể đọc các thuộc tính dữ liệu EXIF bằng cách làm theo các bước đơn giản. Hãy bắt đầu với việc trích xuất dữ liệu EXIF từ bức ảnh này về Tháp Eiffel. Tôi đã chọn tệp JPG làm hình ảnh ví dụ, bạn có thể sử dụng bất kỳ tệp nào của mình cho dù đó là tệp PNG, WebP, BMP, GIF hoặc TIFF.

Hình ảnh tháp Eiffel cho dữ liệu EXIF
  • Tải tệp nguồn hình ảnh chứa thông tin dữ liệu EXIF bằng hàm tạo của lớp Siêu dữ liệu.
  • Lấy gói gốc của nó bằng cách gọi phương thức getRootPackage().
  • Từ gói gốc, lấy gói EXIF của nó bằng cách gọi phương thức getExifPackage().
  • Sau khi bạn có gói EXIF, bạn có thể nhận các thuộc tính EXIF của hình ảnh như Tạo, Kiểu, Chiều rộng, Độ dài, Ngày-Giờ, v.v. như được minh họa trong ví dụ mã Java bên dưới.
// Extract EXIF Data Package Information from image in Java
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
	IExif root = (IExif) metadata.getRootPackage();
	if (root.getExifPackage() != null) {
		// Extract EXIF Package
		ExifPackage exifPackage = root.getExifPackage();
		System.out.println("Make : " + exifPackage.getMake());
		System.out.println("Model : " + exifPackage.getModel());
		System.out.println("Width : " + exifPackage.getImageWidth());
		System.out.println("Length : " + exifPackage.getImageLength());
		System.out.println("DateTime : " + exifPackage.getDateTime());					
	} 
}

Đây là thông tin EXIF bạn sẽ nhận được từ đoạn mã trên.

Make : NIKON CORPORATION
Model : NIKON D3000
Width : 640
Length : 424
DateTime : 2014:08:09 10:35:13

Để biết thêm thông tin về gói IFD (Thư mục tệp hình ảnh) và GPS (Hệ thống định vị toàn cầu), bạn chỉ cần gọi các phương thức tương ứng của gói EXIF, tức là getExifIfdPackage() hoặc getGpsPackage(). Từ các gói này, bạn có thể trích xuất thêm thông tin như;

  • Số sê-ri thiết bị chụp ảnh
  • Tên chủ sở hữu máy ảnh
  • Ý kiến người sử dụng
  • Độ cao
  • vĩ độ
  • kinh độ
  • vân vân.

Đây là mã mà bạn có thể thêm vào phương pháp trên để hiển thị dữ liệu EXIF cùng với thông tin IFD và GPS.

// EXIF IFD Package
ExifIfdPackage exifIfdPackage = exifPackage.getExifIfdPackage();
System.out.println("BodySerialNumber : " + exifIfdPackage.getBodySerialNumber());
System.out.println("CameraOwnerName : " + exifIfdPackage.getCameraOwnerName());
System.out.println("UserComment : " + exifIfdPackage.getUserComment());
// EXIF GPS Information Package
ExifGpsPackage exifGpsPackage = exifPackage.getGpsPackage();
System.out.println("getAltitude : " + exifGpsPackage.getAltitude());
System.out.println("Latitude Ref : " + exifGpsPackage.getLatitudeRef());
System.out.println("LongitudeRef : " + exifGpsPackage.getLongitudeRef());

Đọc tất cả các thẻ EXIF của hình ảnh bằng Java

Nếu bạn muốn hiển thị hoặc trích xuất tất cả các thuộc tính EXIF của bất kỳ hình ảnh hoặc tệp nào, bạn có thể thực hiện theo các bước tương tự như các ví dụ trên:

  • Chỉ cần tải tệp bằng hàm tạo Siêu dữ liệu.
  • Lấy gói gốc EXIF bằng cách gọi phương thức getRootPackage().
  • Lấy gói EXIF bằng cách gọi phương thức getExifPackage().
  • Lặp lại qua gói EXIF để nhận các cặp giá trị tên mong muốn của bạn.
  • Tương tự, lấy các gói IFD và GPS và hiển thị các khóa và giá trị của nó.
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
	IExif root = (IExif) metadata.getRootPackage();
	if (root.getExifPackage() != null) {
		String pattern = "%s = %s";
		// Reading all EXIF tags.
		for (TiffTag tag : root.getExifPackage().toList()) {
			System.out.println(String.format(pattern, tag.getName(), tag.getValue()));
		}
		// Extract all EXIF IFD tags.
		for (TiffTag tag : root.getExifPackage().getExifIfdPackage().toList()) {
			System.out.println(String.format(pattern, tag.getName(), tag.getValue()));
		}
		// Extract all EXIF GPS tags
		for (TiffTag tag : root.getExifPackage().getGpsPackage().toList()) {
			System.out.println(String.format(pattern, tag.getName(), tag.getValue()));
		}
	}
}

Cập nhật Thuộc tính EXIF trong Java

Bạn thậm chí có thể thay đổi dữ liệu EXIF hiện có của bất kỳ hình ảnh hoặc tài liệu nào một cách dễ dàng. Các bước rất đơn giản:

Cập nhật gói EXIF

  • Lấy gói EXIF bằng cách gọi phương thức getExifPackage().
  • Sử dụng các phương thức setter như;
  • Tương tự, bạn có thể đặt các giá trị cho Artist, Make, Model, Software, Image Width & Height, Date, Time, v.v.

Cập nhật gói EXIF IFD

Giống như cập nhật gói EXIF, bạn có thể cập nhật các thuộc tính của gói EXIF IFD và GPS. Vui lòng truy cập lớp ExifIfdPackage hoặc ExifGpsPackage để biết mức độ bạn có thể tùy chỉnh cho hình ảnh và tài liệu có giá trị của mình.

// Update/Set new values in EXIF Data (EXIF Package and EXIF IFD Package).
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
    IExif root = (IExif) metadata.getRootPackage();
    // Set the EXIF package if it's missing
    if (root.getExifPackage() == null) {
        root.setExifPackage(new ExifPackage());
    }
    ExifPackage exifPackage = root.getExifPackage();
    // Setting the desired values in EXIF Package and EXIF IFD Package.
    exifPackage.setCopyright("Copyright (C) 2011-2020 GroupDocs. All Rights Reserved.");
    exifPackage.setImageDescription("Eiffel Tower for EXIF");
    exifPackage.setSoftware("GroupDocs.Metadata");
    exifPackage.getExifIfdPackage().setBodySerialNumber("GD-2020");
    exifPackage.getExifIfdPackage().setCameraOwnerName("GroupDocs");
    exifPackage.getExifIfdPackage().setUserComment("Nice image captured in 2014");
    metadata.save("eiffel-tower-updated.jpg");
}

Xóa siêu dữ liệu EXIF khỏi hình ảnh trong Java

Điều này rất đơn giản nếu bạn muốn xóa gói EXIF khỏi bất kỳ tệp nào, chỉ cần đặt gói EXIF của nó thành null bằng cách gọi setExifPackage(null) của gói gốc.

// Removing the EXIF data from an image.
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
    IExif root = (IExif) metadata.getRootPackage();
    root.setExifPackage(null);
    metadata.save("eiffel-tower-no-exif.jpg");
}

Hình ảnh được hỗ trợ và các định dạng khác

Dưới đây là các định dạng tệp hiện được hỗ trợ bởi GroupDocs.Metadata. Bạn luôn có thể truy cập tài liệu để biết thông tin cập nhật.

Loại tài liệu Định dạng tệp
Hình ảnh BMP, GIF, JPG, JPEG, JPE, JP2, PNG, DJVU, DWG, DXF, WebP, TIFF, PSD, EMF, WMF
Âm thanh & Hình ảnh MP3, WAV, AVI, MOV / QT, FLV, ASF, DICOM

Xem thêm về GroupDocs.Metadata

Hãy nói chuyện nhiều hơn @ Diễn đàn hỗ trợ miễn phí.

Bài viết liên quan