使用内置摄像头并优化显示结果大图片的方法

举报
ShaderJoy 发表于 2021/12/30 01:06:33 2021/12/30
【摘要】 1.将BitmapFactory.Options.inJustDecodeBounds变量设置为true,这表示通知BitmapFactory类只需返回该类图像的范围,而不用解码图像本身。使用此方法,BitmapFactory.Options.outHeight和BitmapFactory.Options.outWidth变量将会被赋值...

1.将BitmapFactory.Options.inJustDecodeBounds变量设置为true,这表示通知BitmapFactory类只需返回该类图像的范围,而不用解码图像本身。使用此方法,BitmapFactory.Options.outHeight和BitmapFactory.Options.outWidth变量将会被赋值。

2.通过给内置的Camera应用程序传递一个附加值(该附加值在MediaStore类中指定,MediaStore.EXTRA_OUTPUT),我们能以Uri的形式指定Camera应用保存捕获图像的位置。以下的示例就将图像保存在SD卡中。注意:别忘了在AndroidManifest.xml文件中添加以下语句:


  
  1. <intent-filter>
  2. <action android:name="android.media.action.IMAGE_CAPTURE"/>
  3. <category android:name="android.intent.category.DEFAULT"/>
  4. </intent-filter>


  
  1. public class SizedImageCamera extends Activity
  2. {
  3. final static int CAMERA_RESULT = 0;
  4. ImageView imv;
  5. String imageFilePath;
  6. @Override
  7. protected void onActivityResult(int requestCode, int resultCode, Intent data)
  8. {
  9. // TODO Auto-generated method stub
  10. super.onActivityResult(requestCode, resultCode, data);
  11. if(resultCode==RESULT_OK)
  12. {
  13. imv=(ImageView)findViewById(R.id.ImageView);
  14. Display currentDisplay=getWindowManager().getDefaultDisplay();
  15. int dw=currentDisplay.getWidth();
  16. int dh=currentDisplay.getHeight();
  17. // 加载图像的尺寸而不是图像本身
  18. BitmapFactory.Options bmpFactoryOptions=new BitmapFactory.Options();
  19. bmpFactoryOptions.inJustDecodeBounds=true;
  20. Bitmap bmp=BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
  21. int heightRatio=(int)Math.ceil(bmpFactoryOptions.outHeight/(float)dh);
  22. int widthRatio=(int)Math.ceil(bmpFactoryOptions.outWidth/(float)dw);
  23. Log.v("HEIGHT RATIO",""+heightRatio);
  24. Log.v("WIDTH RATIO",""+widthRatio);
  25. // 如果两个比率都大于1,那么图像的一条边将大于屏幕
  26. if(heightRatio>1&&widthRatio>1)
  27. {
  28. if(heightRatio>widthRatio)
  29. {
  30. // 如果高度比率更大,则根据它缩放
  31. bmpFactoryOptions.inSampleSize=heightRatio;
  32. }
  33. else
  34. {
  35. // 若宽度比率更大,则根据它缩放
  36. bmpFactoryOptions.inSampleSize=widthRatio;
  37. }
  38. }
  39. // 对它进行真正的解码
  40. bmpFactoryOptions.inJustDecodeBounds=false;
  41. bmp=BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
  42. imv.setImageBitmap(bmp);
  43. }
  44. }
  45. @Override
  46. protected void onCreate(Bundle savedInstanceState)
  47. {
  48. // TODO Auto-generated method stub
  49. super.onCreate(savedInstanceState);
  50. setContentView(R.layout.main);
  51. imageFilePath = Environment.getExternalStorageDirectory()
  52. .getAbsolutePath() + "mypicture.jpg";
  53. File imageFile = new File(imageFilePath);
  54. Uri imageFileUri = Uri.fromFile(imageFile);
  55. Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
  56. i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
  57. startActivityForResult(i, CAMERA_RESULT);
  58. }
  59. }

4.给图像添加元数据ContentValues

(1)预填充


  
  1. ContentValues contentValues=new ContentValues(3);
  2. contentValues.put(Media.DISPLAY_NAME,"title");
  3. contentValues.put(Media.DESCRIPTION,"description");
  4. contentValues.put(Media.MIME_TYPE,"image/jpeg");
  5. Uri imageFileUri=getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, contentValues);



  
  1. ContentValues contentValues=new ContentValues(3);
  2. contentValues.put(Media.DISPLAY_NAME,"title");
  3. contentValues.put(Media.DESCRIPTION,"description");
  4. contentValues.put(Media.MIME_TYPE,"image/jpeg");
  5. getContentResolver().update(imageFileUri, contentValues,null,null);

Bitmap bmp=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri),null,bmpFactoryOptions);
 

setVisibility(View.GONE):将用户的元素都设置为不可见,且不占用布局空间

setVisibility(View.INVISIBLE):将隐藏元素,但是占用布局空间

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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