图记 2016.1.12 压缩图片
因为使用的图片大多是手机摄像头拍摄出来的图片,图片都比较大,所以在listview加载的时候,很容易出现OOM,这几天没事儿的时候就找了下压缩图片的方法,将图片复制到TuJi目录的时候,同时生成一张缩略图,用于在listview中显示,避免出现OOM,今天就总结一下所用到的压缩方法
BitmapFactory.Options
在选择图片的时候,会返回一个InputStream,这个时候,可以使用BitmapFactory.Options类,该方法提供了两个成员变量:
1. inJustDecodeBounds,当该变量为true的时候,在decodeStream的时候,不会将图片加载的内存中,但是我们可以读取图片的一些信息,譬如真实的宽、高等
2. inSampleSize,该变量用来设置缩放比例
当我们通过图片实际的大小获取到我们需要的缩放比例之后,将inJustDecodeBounds设置为false,这时候再decodeStream的时候,返回的bitmap就是按照我们设置的比例缩放过的bitmap。
bitmap.createScaleBitmap
createScaleBitmap方法可以按照你要求的比例将一个bitmap进行缩放并返回一个新的bitmap
Bitmap.createBitmap
Bitmap.createBitmap(source, x, y, width, height)该方法用来在一个bitmap中的某个位置开始截取一个固定宽高的图像,然后返回一个新的bitmap
参数:
source:要截取的bitmap
x:开始点的x轴坐标
y:开始点的y轴坐标
width:截取图片的宽
height:截取图片的高
AddPicActivity.java
package cn.lixyz.tuji;import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Date;import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.ExifInterface; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import cn.lixyz.tuji.Util.GetDate; import cn.lixyz.tuji.sqlite.MySQLiteOpenHelper;/*** 添加图片类 选择图片之后,先判断用户是否安装SD卡,如果安装,则在SD卡中新建一个cn.lixyz.tuji目录,将选择的图片复制到目录中* * @author LGB**/public class AddPicActivity extends Activity implements View.OnClickListener {private ImageView iv_select_img;private EditText et_image_name, et_image_tag, et_image_remark;private Button bt_submit;private Bitmap bitmap;private File sdPath;private String fileName = "TUJIE" + new Date().getTime();private FileOutputStream fos;private MySQLiteOpenHelper msoh;private SQLiteDatabase database;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_addpic);initView();}private void initView() {iv_select_img = (ImageView) findViewById(R.id.iv_select_img);et_image_name = (EditText) findViewById(R.id.et_image_name);et_image_tag = (EditText) findViewById(R.id.et_image_tag);et_image_remark = (EditText) findViewById(R.id.et_image_remark);bt_submit = (Button) findViewById(R.id.bt_submit);iv_select_img.setOnClickListener(this);bt_submit.setOnClickListener(this);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {Uri uri = data.getData();ContentResolver cr = this.getContentResolver();try {BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);int scale = options.outHeight / 150;options.inSampleSize = scale;options.inJustDecodeBounds = false;bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);Log.d("TTTT", bitmap.getWidth() + "--" + bitmap.getHeight());iv_select_img.setImageBitmap(bitmap);// 将原始bitmap发送到handler,以便于复制到TuJi目录和压缩生成缩略图Message msg = new Message();msg.obj = BitmapFactory.decodeStream(cr.openInputStream(uri));handler.sendMessage(msg);} catch (FileNotFoundException e) {Log.e("Exception", e.getMessage(), e);} catch (IOException e) {e.printStackTrace();}}}// 创建一个Handler,用来异步复制图片到TuJi目录Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);final Bitmap copyBitmap = (Bitmap) msg.obj;new Thread(new Runnable() {@Overridepublic void run() {try {copyPicToSDCard(copyBitmap, true);Bitmap newBitmap = copyBitmap.createScaledBitmap(copyBitmap, 100, 100, true);copyPicToSDCard(newBitmap, false);} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}}}).start();}};@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.iv_select_img:Intent intent = new Intent();intent.setType("image/*");intent.setAction(Intent.ACTION_GET_CONTENT);startActivityForResult(intent, 1);break;case R.id.bt_submit:String picName = et_image_name.getText().toString().trim();String picTag = et_image_tag.getText().toString().trim();String picRemark = et_image_remark.getText().toString().trim();msoh = new MySQLiteOpenHelper(AddPicActivity.this, "TujiData", null, 1);database = msoh.getWritableDatabase();ContentValues cv = new ContentValues();cv.put("picName", picName);cv.put("picTag", picTag);cv.put("picRemark", picRemark);cv.put("fileName", fileName);cv.put("date", new GetDate().getDate());database.insert("pics", null, cv);database.close();finish();break;}}/*** * @param bm* bitmap* @param bigOrSmall* 原始图片or缩略图,true为原始图,false为缩略图* @throws IOException*/private void copyPicToSDCard(Bitmap bm, boolean bigOrSmall) throws IOException {if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {/* 得到SD卡得路径 */sdPath = Environment.getExternalStorageDirectory();try {File dir = new File(sdPath + "/cn.lixyz.TuJi");if (bigOrSmall) {fos = new FileOutputStream(new File(dir + "/" + fileName + ".png"));} else {fos = new FileOutputStream(new File(dir + "/" + fileName + "_scale.png"));}if (!dir.exists()) {dir.mkdir();bm.compress(Bitmap.CompressFormat.PNG, 100, fos);} else {bm.compress(Bitmap.CompressFormat.PNG, 100, fos);}} catch (FileNotFoundException e) {// TODO Auto-generated catch block e.printStackTrace();} finally {fos.flush();fos.close();}}} }
因为使用的图片大多是手机摄像头拍摄出来的图片,图片都比较大,所以在listview加载的时候,很容易出现OOM,这几天没事儿的时候就找了下压缩图片的方法,将图片复制到TuJi目录的时候,同时生成一张缩略图,用于在listview中显示,避免出现OOM,今天就总结一下所用到的压缩方法
转载于:https://www.cnblogs.com/xs104/p/5123103.html
图记 2016.1.12 压缩图片相关推荐
- 压缩图片和改变图片图形
压缩图片和改变图片图形 GitHub网址:https://github.com/qianshao1030/BitmapDemo 包名:compile 'jp.wasabeef:glide-transf ...
- LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android
LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android jincon 发表于 2015-02-26 18:31:01 发表在: php开发 localresiz ...
- thumbnailator压缩图片并存至Excel单元格代码
文章目录 依赖 压缩图片工具类: 存至excel的转化器 Excel导入导出的数据类 将数据库实体转化为excel实体 依赖 <dependency><groupId>com. ...
- gulp教程之gulp-imagemin(gulp-imagemin压缩图片文件)
原文:http://www.ydcss.com/archives/26 简介: 使用gulp-imagemin压缩图片文件(包括PNG.JPEG.GIF和SVG图片),很多人安装gulp-imagem ...
- takephoto 框架_GitHub - Smecking/TakePhoto: 一款用于在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库...
TakePhoto是一款用于在Android设备上获取照片(拍照或从相册.文件中选择).裁剪图片.压缩图片的开源工具库,目前最新版本4.0.2. 3.0以下版本及API说明,详见TakePhoto2. ...
- Android压缩图片到100K以下并保持不失真的高效方法
在开发Android企业应用时,会经常上传图片到服务器,而我们公司目前维护的一个项目便是如此.该项目是通过私有apn与服务器进行交互的,联通的还好,但移动的速度实在太慢,客户在使用软件的过程中,由于上 ...
- Python利用PCA压缩图片
Python利用PCA压缩图片 参考 Python利用PCA对图片进行降维处理 PCA降维 维度 样本数 feature数 1.python代码实现PCA 这里先将1280的1D向量转变成2D图片之后 ...
- BitmapFactory压缩图片
我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常.所以在展示高分辨率图片或者上传图片的时候,最好先将图片进行压缩.下面看下我们如何对一张大图进 ...
- Java压缩图片大小
使用场景: 1.当使用图片上传功能时,上传图片太大,造成对服务器资源过多的占用2.客户端上传图片尺寸大小不一,前端需要展示给用户固定尺寸时,可通过java进行对上传图片统一进行处理 功能预览 1.压缩 ...
最新文章
- 关于一个简易的实时内存监控系统的思维导图
- 2017.10.25笔记3
- Java-使用JavaMail发送一封邮件给用户邮箱功能实现
- img标签默认有外边距吗_你知道css的盒模型吗?
- vmware linux 编译内核,VMWare编译linux内核的注意事项
- .so动态链接库文件
- 为什么看别人的网站排名都在第一页?有可能是以下三种原因
- matlab 中 diff 函数 cumsum 函数 logical 函数 tabulate 函数 使用方法
- Android release apk 签名流程
- 在IBM AIX p750小机上为Oracle扩展逻辑卷-视频分享
- 关于输入阻抗和输出阻抗的理解
- idea上移或下移一行
- 【论文笔记_知识蒸馏_目标检测_2022】Decoupled Knowledge Distillation
- Unity功能记录(七)------ UGUI获取UI在Canvas下的坐标/根据UI位置获取屏幕图片/二维码识别
- 关于坐标系(大地坐标、平面坐标、投影、北京54、西安80、WGS84)的一些理解
- 你不是骄傲,而是活得太傲娇了
- 谷歌无法更新至最新版本问题
- 剪映怎么去水印,剪映怎么剪辑视频
- 【RGB=HSI】单片机控制RGB单灯与HSI互转算法
- 短视频引流怎么做?如何利用短视频引流?短视频引流技巧