如何在Android中将exif数据写入图像?

Posted

技术标签:

【中文标题】如何在Android中将exif数据写入图像?【英文标题】:How to write exif data to image in Android? 【发布时间】:2015-02-28 05:33:11 【问题描述】:

我正在尝试使用 exif 接口将 User_CommentTAG_GPS 写入 android 应用程序中捕获的图像,但由于某种原因,当我查看图片在图库中的详细信息。

似乎标签没有被写入捕获的图像,因为文件路径可能是错误的。我认为这可能是因为我将标签写入了错误的图像路径。

有谁知道我将标签写入图像的方式是否存在问题?

这是在@Charlie 的以下更改之后保存 exif 数据的代码:

private File getOutputPhotoFile() throws IOException 
          File directory = new File(Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_PICTURES), getPackageName());
          if (!directory.exists()) 
            if (!directory.mkdirs()) 
              Log.e(TAG, "Failed to create storage directory.");
              return null;
            
          


          String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss", Locale.ENGLISH).format(new Date());

          File[] files = directory.listFiles();

          File exifVar =  new File(directory.getPath(), "IMG_" + timeStamp + ".jpg");
          if(files.length!=0) 
              File newestFile = files[files.length-1];
              exifVar =  new File(directory.getPath() + File.separator + newestFile.getName());
          

          String mString = "Generic Text..";     
          ExifInterface exif = new ExifInterface(exifVar.getAbsolutePath());
          exif.setAttribute("UserComment", mString);
          exif.saveAttributes();


          exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE,
            String.valueOf(latituteField.toString()));

          exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, 
            String.valueOf(longitudeField.toString()));

          exif.saveAttributes();

          return exifVar; 




    

【问题讨论】:

为什么要多次调用 exif.saveAttributes?我相信每次都会创造一个新的形象。只是想知道 有可能,我有一段时间没有从事这个项目了,我认为问题可能是数据被保存到名为“exif”的临时图像中,并且从未写入原图。 【参考方案1】:

您需要先将位于google exif 的exif 文件复制到您的项目中,然后使用以下代码:

    ExifInterface exif = new ExifInterface();
    exif.readExif(exifVar.getAbsolutePath());
    exif.setTagValue(ExifInterface.TAG_USER_COMMENT, mString);
    exif.forceRewriteExif(exifVar.getAbsolutePath())); 

这里使用的ExifInterface是你刚刚添加的新接口。

【讨论】:

如果能指定变量“exifi”的数据类型和初始化就更好了【参考方案2】:

您正在使用exifVar.toString()。这仅返回文件名,而不是图像的路径。由于您的应用可能不在有图片的文件夹中,您应该使用exifVar.getAbsolutePath()

如果您没有在运行程序的同时拍照,则路径将不正确。请改用此代码:

File[] files = directory.listFiles();

if(files.length==0) 
    // No images available
    return;


File newestFile = files[files.length-1];

File exifVar =  new File(directory.getPath() + File.separator + newestFile.getName());

题外话:

根据您庞大的导入列表:

import android.content.*;

进口

android.content.Context,
android.content.DialogInterface and
android.content.Intent

这会使您的代码更短一些。只是说

【讨论】:

经过上述修改后,exif数据仍然没有添加到图片细节中,您有什么想法吗?【参考方案3】:

确保您将写入权限设置为 sd(静态和动态), 同样对于 Android 10,您需要设置: android:requestLegacyExternalStorage="true"

到清单应用程序

【讨论】:

以上是关于如何在Android中将exif数据写入图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不加载图像的情况下为文件系统上的现有图像写入或修改 EXIF 数据?

Swift如何修改从移动相机拍摄的图像中的exif信息

错误地将 EXIF 元数据写入图像

Cordova 3.6:如何从 Android 的照片库中提取 GPS Exif 数据?

在 Python 中,如何读取图像的 exif 数据?

如何在android中将数据写入BLE设备