- 信息读取.
传统方法引用Android 原生接口
ExifInterface mExifInterface = new ExifInterface(PATH);
//For example
String flash = mExifInterface.getAttribute(ExifInterface.TAG_FLASH);
String iso = mExifInterface.getAttribute(ExifInterface.TAG_ISO_SPEED_RATINGS);
String orientation = mExifInterface.getAttribute(ExifInterface.TAG_ORIENTATION);
- 引用3rd jar来实现信息读取
在build.gradle里面加入 compile 'com.drewnoakes:metadata-extractor:2.11.0'
private static void readPic(File jpegFile) {
com.drew.metadata.Metadata metadata;
try {
metadata = JpegMetadataReader.readMetadata(jpegFile);
Iterator<Directory> it = metadata.getDirectories().iterator();
while (it.hasNext()) {
Directory exif = it.next();
Iterator<com.drew.metadata.Tag> tags = exif.getTags().iterator();
while (tags.hasNext()) {
com.drew.metadata.Tag tag = tags.next();
android.util.Log.d("Exif tag", "tag ======== " + tag);
}
}
} catch (JpegProcessingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
- 信息写入
传统方法引用google 原生接口
和上面的一样
mExifInterface.setAttribute(ExifInterface.TAG_ORIENTATION, "1254");
mExifInterface.saveAttributes(); // 这个地方一定要调用保存。否则保存不了.
-
引用3rd jar来实现信息写入
下载 commons-imaging-1.0-SNAPSHOT.jar, 这个方法的好处是如果图片里面没有字段. 比如orientation 没有,但是
还可以写入. 场景: 比如你把多张图片合成之后,生成的新的图片里面没有了信息, 那么你就可以重新写入信息.private static void writePic(String srcJpeg) { File file = new File(srcJpeg); try { 这个类在这里下载 //https://github.com/skypx/JpegMetadate JpegInfo inJpegInfo = new JpegInfo(file); try { inJpegInfo.set(TiffTagConstants.TIFF_TAG_MAKE, "SKY"); inJpegInfo.set(ExifTagConstants.EXIF_TAG_ISO, (short)30); inJpegInfo.set(ExifTagConstants.EXIF_TAG_APERTURE_VALUE, new RationalNumber(2,4)); inJpegInfo.set(ExifTagConstants.EXIF_TAG_FLASH, (short) ExifTagConstants.FLASH_VALUE_OFF); rewriteInplace(inJpegInfo, file); } catch (ImageWriteException e) { e.printStackTrace(); } catch (ImageReadException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
}
private static final String SUFFIX_TEMP_FILE = ".rewrite-exif"; private static void rewriteInplace(JpegInfo exif, File file) throws IOException, ImageReadException, ImageWriteException { final long lastModified = file.lastModified(); File tempFile = File.createTempFile( file.getName(), SUFFIX_TEMP_FILE, file.getParentFile()); final FileOutputStream out = new FileOutputStream(tempFile); boolean success = false; try { try { exif.rewrite(file, out, true); out.flush(); } finally { out.close(); } success = tempFile.renameTo(file); if (success) { if (!file.setLastModified(lastModified)) { Log.w("TAG", "Failed to set last modified time to " + file.getAbsolutePath()); } } else { throw new IOException("Could not replace file " + file); } } finally { if (!success) { if (!tempFile.delete()) { Log.w("TAG","Could not delete temporary file " + tempFile.getAbsolutePath()); } } }
}