因为使用的图片大多是手机摄像头拍摄出来的图片,图片都比较大,所以在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 压缩图片相关推荐

  1. 压缩图片和改变图片图形

    压缩图片和改变图片图形 GitHub网址:https://github.com/qianshao1030/BitmapDemo 包名:compile 'jp.wasabeef:glide-transf ...

  2. LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android

    LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android jincon 发表于 2015-02-26 18:31:01 发表在: php开发 localresiz ...

  3. thumbnailator压缩图片并存至Excel单元格代码

    文章目录 依赖 压缩图片工具类: 存至excel的转化器 Excel导入导出的数据类 将数据库实体转化为excel实体 依赖 <dependency><groupId>com. ...

  4. gulp教程之gulp-imagemin(gulp-imagemin压缩图片文件)

    原文:http://www.ydcss.com/archives/26 简介: 使用gulp-imagemin压缩图片文件(包括PNG.JPEG.GIF和SVG图片),很多人安装gulp-imagem ...

  5. takephoto 框架_GitHub - Smecking/TakePhoto: 一款用于在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库...

    TakePhoto是一款用于在Android设备上获取照片(拍照或从相册.文件中选择).裁剪图片.压缩图片的开源工具库,目前最新版本4.0.2. 3.0以下版本及API说明,详见TakePhoto2. ...

  6. Android压缩图片到100K以下并保持不失真的高效方法

    在开发Android企业应用时,会经常上传图片到服务器,而我们公司目前维护的一个项目便是如此.该项目是通过私有apn与服务器进行交互的,联通的还好,但移动的速度实在太慢,客户在使用软件的过程中,由于上 ...

  7. Python利用PCA压缩图片

    Python利用PCA压缩图片 参考 Python利用PCA对图片进行降维处理 PCA降维 维度 样本数 feature数 1.python代码实现PCA 这里先将1280的1D向量转变成2D图片之后 ...

  8. BitmapFactory压缩图片

    我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常.所以在展示高分辨率图片或者上传图片的时候,最好先将图片进行压缩.下面看下我们如何对一张大图进 ...

  9. Java压缩图片大小

    使用场景: 1.当使用图片上传功能时,上传图片太大,造成对服务器资源过多的占用2.客户端上传图片尺寸大小不一,前端需要展示给用户固定尺寸时,可通过java进行对上传图片统一进行处理 功能预览 1.压缩 ...

最新文章

  1. 关于一个简易的实时内存监控系统的思维导图
  2. 2017.10.25笔记3
  3. Java-使用JavaMail发送一封邮件给用户邮箱功能实现
  4. img标签默认有外边距吗_你知道css的盒模型吗?
  5. vmware linux 编译内核,VMWare编译linux内核的注意事项
  6. .so动态链接库文件
  7. 为什么看别人的网站排名都在第一页?有可能是以下三种原因
  8. matlab 中 diff 函数 cumsum 函数 logical 函数 tabulate 函数 使用方法
  9. Android release apk 签名流程
  10. 在IBM AIX p750小机上为Oracle扩展逻辑卷-视频分享
  11. 关于输入阻抗和输出阻抗的理解
  12. idea上移或下移一行
  13. 【论文笔记_知识蒸馏_目标检测_2022】Decoupled Knowledge Distillation
  14. Unity功能记录(七)------ UGUI获取UI在Canvas下的坐标/根据UI位置获取屏幕图片/二维码识别
  15. 关于坐标系(大地坐标、平面坐标、投影、北京54、西安80、WGS84)的一些理解
  16. 你不是骄傲,而是活得太傲娇了
  17. 谷歌无法更新至最新版本问题
  18. 剪映怎么去水印,剪映怎么剪辑视频
  19. 【RGB=HSI】单片机控制RGB单灯与HSI互转算法
  20. 短视频引流怎么做?如何利用短视频引流?短视频引流技巧

热门文章

  1. Linux驱动学习--android中的内存管理机制ION(二)--ION的使用
  2. Linux系统克隆和快照
  3. 对于一款软件而言,完备的功能固然重要,但交互体验也不该被忽视
  4. sketchup/su模型导入到Unity3D
  5. Z1:第一台祖思机的架构与算法
  6. ch7 Process Mamagement
  7. PCB板一般缺陷检测法及其优缺点分析
  8. xml 学习(教训啊,还是要实战代码
  9. 2017年9月英语总结
  10. 计算机技术与消防,浅谈计算机技术在消防领域中应用.doc