Android调用相机拍照,压缩图片后保存SD卡中

2024-02-17 04:18

本文主要是介绍Android调用相机拍照,压缩图片后保存SD卡中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在搞一个项目,需求是调用系统相机拍完照片后保存本地,再上传至后台服务器,但为了节省流量需要压缩上传,将图片压缩至100K以内。这个是在特定机器上运行,类似于手持POS机,但是它的相机几乎没有优化,对焦慢,而且拍照也不清晰,使用自己的手机调用系统相机拍照后图片大概有300K左右,自动已经压缩了,但这个机器没有优化,调用相机拍照后的图片和原图一样2M左右,太大了,必须要压缩!
网上找了些资料,也作为参考:Android图片压缩 质量压缩和尺寸压缩;安卓相机拍摄照片,压缩后存储于SD卡
项目需要的效果为:

上代码:

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener{private Button openCamera,openCamera2;private ImageView showImgView;Uri photoUri;String filePath;  //图片路径@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findView();}private void findView() {// TODO Auto-generated method stubopenCamera = (Button) findViewById(R.id.openCamera);openCamera2 = (Button) findViewById(R.id.openCamera2);showImgView = (ImageView) findViewById(R.id.showImgView);openCamera.setOnClickListener(this);openCamera2.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()){case R.id.openCamera://打卡相机前先检测SD卡是否可以用if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){photoUri = patrUri("file1");startCamera(1001,photoUri);}else{Toast.makeText(MainActivity.this, "SD卡不可用", Toast.LENGTH_SHORT).show();}break;case R.id.openCamera2:if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){photoUri = patrUri("file2");startCamera(1002,photoUri);}else{Toast.makeText(MainActivity.this, "SD卡不可用", Toast.LENGTH_SHORT).show();}break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if(requestCode == 1001){if(resultCode == RESULT_OK){FileInputStream is = null;try {is = new FileInputStream(filePath);Bitmap bitmap = BitmapFactory.decodeStream(is);showImgView.setImageBitmap(bitmap);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}if(requestCode == 1002){if(resultCode == RESULT_OK){try {Bitmap bitmap = compressBySize(filePath,480,800);  //设置压缩后图片的高度和宽度saveFile(bitmap,filePath);showImgView.setImageBitmap(bitmap);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}// 压缩图片尺寸private static Bitmap compressBySize(String pathName, int targetWidth,int targetHeight) {BitmapFactory.Options opts = new BitmapFactory.Options();opts.inJustDecodeBounds = true;// 不去真的解析图片,只是获取图片的头部信息,包含宽高等;Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts);// 得到图片的宽度、高度;float imgWidth = opts.outWidth;float imgHeight = opts.outHeight;// 分别计算图片宽度、高度与目标宽度、高度的比例;取大于等于该比例的最小整数;int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth);int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight);opts.inSampleSize = 1;if (widthRatio > 1 || widthRatio > 1) {if (widthRatio > heightRatio) {opts.inSampleSize = widthRatio;} else {opts.inSampleSize = heightRatio;}}// 设置好缩放比例后,加载图片进内容;opts.inJustDecodeBounds = false;bitmap = BitmapFactory.decodeFile(pathName, opts);return bitmap;}//保存压缩后的图片private void saveFile(Bitmap bitmap, String filePath2) throws IOException {// TODO Auto-generated method stubFile testFile = new File(filePath2);if (testFile.exists()) {testFile.delete();}File myCaptureFile = new File(filePath2);System.out.println("------filePath2==" + filePath2);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));// 100表示不进行压缩,70表示压缩率为30%bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bos);bos.flush();bos.close();}//打开相机private void startCamera(int requestCode, Uri photoUri) {// TODO Auto-generated method stubIntent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);startActivityForResult(intent, requestCode);}/*** 图片保存路径  这里是在SD卡目录下创建了MyPhoto文件夹* @param fileName* @return*/private Uri patrUri(String fileName) {  //指定了图片的名字,可以使用时间来命名// TODO Auto-generated method stubString strPhotoName = fileName+".jpg";              String savePath = Environment.getExternalStorageDirectory().getPath()+ "/MyPhoto/";File dir = new File(savePath);if (!dir.exists()) {dir.mkdirs();}filePath = savePath + strPhotoName;return Uri.fromFile(new File(dir, strPhotoName));}
}

页面布局很简单,就两个Button跟一个ImageView,这里就不贴代码了。
效果图片:
这里写图片描述
SD卡中的图片:
这里写图片描述
可以看到,file2.jpg是压缩过的,file1.jpg是原图,因为是模拟器,效果不太明显,在真机上压缩后的图片在100K之内。

要调用相机和读写SD卡,最后不要忘了加权限。

代码下载
因为工作的原因,这里使用的是Myeclipse不过Eclipse也可以用。

这篇关于Android调用相机拍照,压缩图片后保存SD卡中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/716652

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取