我正在尝试重新调整图像大小,该部分已完成。
然后我试图将exif标签复制到新文件。
我使用ExifInterface来读取标签。
我知道这是一个界面而不是一个对象。
但是当我尝试将它用于真正大尺寸的图像时,我得到了NullPointerException
。
我得到的错误不是所有的图像。
07-25 11:59:23.870: WARN/System.err(1362): java.lang.NullPointerException
07-25 11:59:23.870: WARN/System.err(1362): at android.media.ExifInterface.saveAttributes(ExifInterface.java:202)
我该如何解决?
复制exif信息的代码
try {
// copy paste exif information from original file to new
// file
ExifInterface oldexif = new ExifInterface(filePath);
ExifInterface newexif = new ExifInterface(file.getPath());
int build = Build.VERSION.SDK_INT;
// From API 11
if (build >= 11) {
newexif.setAttribute("FNumber",
oldexif.getAttribute("FNumber"));
newexif.setAttribute("ExposureTime",
oldexif.getAttribute("ExposureTime"));
newexif.setAttribute("ISOSpeedRatings",
oldexif.getAttribute("ISOSpeedRatings"));
}
// From API 9
if (build >= 9) {
newexif.setAttribute("GPSAltitude",
oldexif.getAttribute("GPSAltitude"));
newexif.setAttribute("GPSAltitudeRef",
oldexif.getAttribute("GPSAltitudeRef"));
}
// From API 8
if (build >= 8) {
newexif.setAttribute("FocalLength",
oldexif.getAttribute("FocalLength"));
newexif.setAttribute("GPSDateStamp",
oldexif.getAttribute("GPSDateStamp"));
newexif.setAttribute("GPSProcessingMethod",
oldexif.getAttribute("GPSProcessingMethod"));
newexif.setAttribute("GPSTimeStamp",
oldexif.getAttribute("GPSTimeStamp"));
}
newexif.setAttribute("DateTime",
oldexif.getAttribute("DateTime"));
newexif.setAttribute("Flash", oldexif.getAttribute("Flash"));
newexif.setAttribute("GPSLatitude",
oldexif.getAttribute("GPSLatitude"));
newexif.setAttribute("GPSLatitudeRef",
oldexif.getAttribute("GPSLatitudeRef"));
newexif.setAttribute("GPSLongitude",
oldexif.getAttribute("GPSLongitude"));
newexif.setAttribute("GPSLongitudeRef",
oldexif.getAttribute("GPSLongitudeRef"));
// You need to update this with your new height width
newexif.setAttribute("ImageLength",
oldexif.getAttribute("ImageLength"));
newexif.setAttribute("ImageWidth",
oldexif.getAttribute("ImageWidth"));
newexif.setAttribute("Make", oldexif.getAttribute("Make"));
newexif.setAttribute("Model", oldexif.getAttribute("Model"));
newexif.setAttribute("Orientation",
oldexif.getAttribute("Orientation"));
newexif.setAttribute("WhiteBalance",
oldexif.getAttribute("WhiteBalance"));
newexif.saveAttributes();
Toast.makeText(getApplicationContext(),
"Image resized & saved successfully",
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
其他onFly信息:
当我尝试读取这两个文件时,会创建新文件:
在oldexif上调试监视
在newexif上调试监视
测试图像
http://vikaskanani.files.wordpress.com/2011/07/test.jpg
为sdk 2.1使用Android模拟器
答案 0 :(得分:3)
您正在saveAttributes中的某处传递空值。
调试NullPointerExceptions非常简单,只要你有源代码。
您可以在下面找到适用于Android 2.1的ExifInterface的源代码
第202行包含:
sb.append(val.length() + " ");
这里唯一可以为null的是val。 (您在saveAttributes方法中传递的值之一)。
我建议仔细检查你传递给该值的值,并注意空值。
答案 1 :(得分:0)
复制EXIF数据的更好方法是使用Sanselan Android库。 ExifInterface在某些版本上存在数据损坏错误,并且还处理有限数量的EXIF标记。
以下是关于使用Sanselan复制EXIF数据并提供示例代码的博客文章: http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/