利用MediaStore检索图像+利用ExitInterface修改EXIF信息

举报
ShaderJoy 发表于 2021/12/30 01:09:30 2021/12/30
【摘要】 利用MediaStore检索图像 由于ContentProvider(当前为MediaStore)在应用程序之间是共享的,且大多数应用程序默认使用MediaStore,因此可以利用它来建立自己的图像库应用程序。 MediaStore和所有的内容提供器都以一种类似数据库的方式运作。从它们中选择记录,获得一个Cursor对象,并通过它来...

利用MediaStore检索图像

由于ContentProvider(当前为MediaStore)在应用程序之间是共享的,且大多数应用程序默认使用MediaStore,因此可以利用它来建立自己的图像库应用程序。

MediaStore和所有的内容提供器都以一种类似数据库的方式运作。从它们中选择记录,获得一个Cursor对象,并通过它来遍历结果。

1.首先创建一个打算返回列的字符串数组。对于MediaStore中的图像,其标准列在MediaStore.Images.Media类表示。

String[] columns={Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME};
 


  
  1. long oneHourAgo=System.currentTimeMillis()/1000-(60*60);
  2. String[] whereValues={""+oneHourAgo};
  3. cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,Media.DATE_ADDED+" > ?",whereValues,Media.DATE_ADDED+" ASC");

displayColumn=cursor.getColumnIndexOrThrow(Media.DISPLAY_NAME);
 


  
  1. public class MediaStoreGallery extends Activity
  2. {
  3. public final static int DISPLAYWIDTH=200;
  4. public final static int DISPLAYHEIGHT=200;
  5. TextView titleTextView;
  6. ImageButton imageButton;
  7. Cursor cursor;
  8. Bitmap bmp;
  9. String imageFilePath;
  10. int fileColumn;
  11. int titleColumn;
  12. int displayColumn;
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState)
  15. {
  16. // TODO Auto-generated method stub
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.main);
  19. titleTextView=(TextView)this.findViewById(R.id.TitleTextView);
  20. imageButton=(ImageButton)this.findViewById(R.id.ImageButton);
  21. String[] columns={Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME};
  22. cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,null,null,null);
  23. // long oneHourAgo=System.currentTimeMillis()/1000-(60*60);
  24. // String[] whereValues={""+oneHourAgo};
  25. // cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,
  26. // Media.DATE_ADDED+" > ?",whereValues,Media.DATE_ADDED+" ASC");
  27. fileColumn=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  28. titleColumn=cursor.getColumnIndexOrThrow(Media.TITLE);//可简写成
  29. displayColumn=cursor.getColumnIndexOrThrow(Media.DISPLAY_NAME);
  30. if(cursor.moveToFirst())
  31. {
  32. titleTextView.setText(cursor.getString(titleColumn));
  33. imageFilePath=cursor.getString(fileColumn);
  34. bmp=getBitmap(imageFilePath);
  35. imageButton.setImageBitmap(bmp);
  36. }
  37. imageButton.setOnClickListener(new OnClickListener()
  38. {
  39. @Override
  40. public void onClick(View v)
  41. {
  42. // TODO Auto-generated method stub
  43. if(cursor.moveToNext())
  44. {
  45. titleTextView.setText(cursor.getString(titleColumn));
  46. imageFilePath=cursor.getString(fileColumn);
  47. bmp=getBitmap(imageFilePath);
  48. imageButton.setImageBitmap(bmp);
  49. }
  50. }
  51. });
  52. }
  53. private Bitmap getBitmap(String imageFilePath)
  54. {
  55. // 加载图像的尺寸而不是图像本身
  56. BitmapFactory.Options bmpFactoryOptions=new BitmapFactory.Options();
  57. bmpFactoryOptions.inJustDecodeBounds=true;
  58. Bitmap bmp=BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
  59. int heightRatio=(int)Math.ceil(bmpFactoryOptions.outHeight/(float)dh);
  60. int widthRatio=(int)Math.ceil(bmpFactoryOptions.outWidth/(float)dw);
  61. Log.v("HEIGHT RATIO",""+heightRatio);
  62. Log.v("WIDTH RATIO",""+widthRatio);
  63. // 如果两个比率都大于1,那么图像的一条边将大于屏幕
  64. if(heightRatio>1&&widthRatio>1)
  65. {
  66. if(heightRatio>widthRatio)
  67. {
  68. // 如果高度比率更大,则根据它缩放
  69. bmpFactoryOptions.inSampleSize=heightRatio;
  70. }
  71. else
  72. {
  73. // 若宽度比率更大,则根据它缩放
  74. bmpFactoryOptions.inSampleSize=widthRatio;
  75. }
  76. }
  77. // 对它进行真正的解码
  78. bmpFactoryOptions.inJustDecodeBounds=false;
  79. bmp=BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
  80. return bmp;
  81. }
  82. }

利用ExitInterface修改EXIF信息

1.EXIF 表示可交换的图像文件格式,它是在图像文件中保存元数据的一种标准方式。一般大多数标记与所捕获图像本身的数据相关,如ExposureTime和ShutterSpeedValue。

然而,有一些标记可以考虑填写或修改。

UserComment:由用户生成的备注

ImageDescription:标题

Artist:图像的创建者或接受者

Copyright:图像的版权持有人

Software:用于创建图像的软件

Android为我们提供了一种读写EXIF数据的方法,该方法的主要类是ExifInterface。

示例代码:


  
  1. //如何使用ExifInterface从一个图像文件读取特定的EXIF数据
  2. ExifInterface ei=new ExifInterface(imageFilePath);
  3. String imageDescription=ei.getAttribute("ImageDescription");
  4. if(imageDescription!=null)
  5. {
  6. Log.v("EXIF",imageDescription);
  7. }
  8. //如何使用ExifInterface将EXIF数据保存到图像文件中
  9. ei.setAttribute("ImageDescription","Something New");



文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/8710318

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。