在Android中向图像写入EXIF元数据

17

我希望在图像中存储一些元数据。我的相机应用程序提供了一个位图,我将其存储在存储(MediaStore)设备中。除此之外,我还想在图像的元数据中添加一些标签。我认为EXIF是实现这一目的的好方法。但是我找不到如何做到这一点的好参考资料。

如果在Android编程中有一些工具可以完成这个任务,请让我知道。

谢谢


1
ExifInterface可能有些不可靠--我曾经看到它在某些情况下破坏了EXIF数据。一个更可靠的选项,可以处理更多的EXIF标签(包括自定义的EXIF标签)是Sanselan Android。http://code.google.com/p/sanselanandroid/ 这里有Sanselan Android的使用示例:http://massapi.com/source/sanselan-0.97-incubator/src/test/java/org/apache/sanselan/sampleUsage/WriteExifMetadataExample.java.html - Theo
请查看 这个链接 - dragon66
2个回答

11

好的,有人向我推荐了一个有用的资源(离线)。ExifInterface看起来就是我一直在寻找的东西。Android-er发布了一篇文章,演示了如何在Android中读取EXIF元数据,我认为写作方式应该不会有太大差异。

我不知道,但我们是否可以使用EXIF来写入任意元数据,即除了在ExifInterface文档中指定的元数据之外(例如纬度、经度、闪光灯等)。如果不能,那么将任意元数据写入图像文件的首选方法可能是什么?

谢谢


1
你能否从第二段中提出一个新问题,以便我们可以适当地回答它?(在我看来,答案是肯定的) - MikeD
1
刚刚完成了:https://dev59.com/6HDYa4cB1Zd3GeqPDbZ0 - vpk
我也发现这个库很有用:https://github.com/dragon66/pixymeta-android - vir us

10
public static void writeFile (File photo, double latitude, double longitude) throws IOException{
    ExifInterface exif = null;

    try{
        Log.v("latiDouble", ""+latitude);
        Log.v("longiDouble", ""+longitude);
        exif = new ExifInterface(photo.getCanonicalPath());
        if (exif != null) { 
            double latitu = latitude;
            double longitu = longitude;
            double alat = Math.abs(latitu);
            double along = Math.abs(longitu);
            String stringLati = convertDoubleIntoDegree(alat);
            String stringLongi = convertDoubleIntoDegree(along);
            exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, stringLati);
            exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, stringLongi);
            Log.v("latiString", ""+ stringLati);
            Log.v("longiString", ""+ stringLongi);
            exif.saveAttributes();
            String lati = exif.getAttribute (ExifInterface.TAG_GPS_LATITUDE);
            String longi = exif.getAttribute (ExifInterface.TAG_GPS_LONGITUDE);
            Log.v("latiResult", ""+ lati);
            Log.v("longiResult", ""+ longi);
        } 
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我从这里复制了答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接