在读取图片的时候压缩减小内存开支

这个问题真是把我折腾的够呛:

package com.example.tupian;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.Toast;

@SuppressLint("NewApi")
public class MainActivity extends Activity {
	private static Bitmap bitm;
	private static Bitmap bitm2;
	private ImageView iv;
	private ImageView iv2;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		 iv = (ImageView)findViewById(R.id.iv);
		 iv2 = (ImageView)findViewById(R.id.iv2);
		 Thread t = new Thread(new imgThred());
		 t.start();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	class imgThred implements Runnable{
		 public void run(){
//			dd= getDrawable("http://smartcost.com.cn/global/upload/img/20140520/1400549692206.jpg");
			 try {
				bitm = revitionImageSize("http://smartcost.com.cn/global/upload/img/20140520/1400549692206.jpg",300);
				bitm2 = revitionImageSize("http://smartcost.com.cn/global/upload/img/20140520/1400549692206.jpg",150);
			 } catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			msHandl.sendMessage(new Message());
		}
	}
	Handler msHandl = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			iv.setImageBitmap(bitm);
			iv2.setImageBitmap(bitm2);
		}
	};

	private Bitmap revitionImageSize(String path, int size) throws IOException {
		URL url;
		 url = new URL(path);
		// 取得图片
		InputStream temp = url.openStream();
		BitmapFactory.Options options = new BitmapFactory.Options();
		// 这个参数代表,不为bitmap分配内存空间,只记录一些该图片的信息(例如图片大小),说白了就是为了内存优化
		options.inJustDecodeBounds = true;
		// 通过创建图片的方式,取得options的内容(这里就是利用了java的地址传递来赋值)
		BitmapFactory.decodeStream(temp, null, options);
		// 关闭流
		temp.close();
		// 生成压缩的图片
		int i = 0;
		Bitmap bitmap = null;
		while (true) {
		// 这一步是根据要设置的大小,使宽和高都能满足
		if ((options.outWidth >> i <= size)
		&& (options.outHeight >> i <= size)) {
		// 重新取得流,注意:这里一定要再次加载,不能二次使用之前的流!
		temp = url.openStream();
		// 这个参数表示 新生成的图片为原始图片的几分之一。
		options.inSampleSize = (int) Math.pow(2.0D, i);
		// 这里之前设置为了true,所以要改为false,否则就创建不出图片
		options.inJustDecodeBounds = false; 

		bitmap = BitmapFactory.decodeStream(temp, null, options);
		break;
		}
		i += 1;
		}
		double bitcount =bitmap.getByteCount()/1000;
		Log.e("bitcount", bitcount+"");
		return bitmap;
	}

}

2、从资源中获取Bitmap

Resources res=getResources();

Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);

另外附上bitmap和SD卡的操作哦:http://blog.sina.com.cn/s/blog_a72ec20c01015rwj.html

唉,虽然今天晚上弄到现在,但明天到公司又是一场恶战。。。

在读取图片的时候压缩减小内存开支,布布扣,bubuko.com

时间: 2024-10-08 21:31:00

在读取图片的时候压缩减小内存开支的相关文章

Asp.net 从Excel读取图片并保存,无法从内存读取图片,Excel组件和相关IIS的配置及解决办法

</pre>目的:Asp.net web页面,读取Excel,(用的office组件),中的图片注意的事项:<p></p><p>只提供部分代码,因为重点是配置.</p><p>1:要想从Excel里读取图片,只能用剪贴板的方面将图片复制到内存然后再保存图片.</p><p>2:剪贴板的使用要引用WinForm</p><p>3: Excel是单线程的方式,所以代码里使用剪贴板也要用单线程的方式

Android中读取图片EXIF元数据之metadata-extractor的使用

一.引言及介绍 近期在开发中用到了metadata-extractor-xxx.jar 和 xmpcore-xxx.jar这个玩意, 索性查阅大量文章了解学习,来分享分享. 本身工作也是常常和处理大图片打交道,摸索摸索也是多多益善. 首先介绍一下什么是EXIF.EXIF是 Exchangeable Image File 的缩写,这是一种专门为数码相机照片设定的格式.这样的格式能够用来记录数字照片的属性信息,如相机的品牌及型号.相片的拍摄时间.拍摄时所设置的光圈大小.快门速度.ISO等信息.除此之

读取图片的两种方法

*读取图片的方法: *[UIImage imageNamed:filename]:通过图片名称加载会缓存图片,使用完成后不会释放,占用内存 *UIImage imageWithContentsOfFile:path:通过文件路径加载,不会缓存图片,使用完后自动释放 建议较多图片使用imageWithContentsOfFile: 加载图片

SQL 2008存储图片和SQL 2008读取图片

用SQL Server存储文字数据很容易实现,如果用SQL Server存储图片呢?大家有没有实现思路呢?现在我用一个Demo来为大家提供一种在SQL Server中存储图片的思路. 场景:在superPhoto文件夹中,有三位NBA超级巨星的图片需要存储在数据库中,他们分别是保罗.罗斯和德隆,文件内容如下: 有了需求,下面讲实现.实现过程分为3个步骤. 步骤1:我们需要在数据库test中建立T_superStar表,并向表中插入三位球星的信息. create table T_superStar

读取图片的几种方式

读取图片的方式有以下几种: 1 . 从沙盒中获取图片  : 1>通过imageNamed:去加载,加载沙盒中.app包中的图片文件 第一次加载图片时,会去沙盒中读取此文件,然后系统会将此图片缓存到内存中 方便以后读取,以后再读取时,会从缓存中寻找(加快加载速度) 如果图片经常使用,可以采用此种方式       2>通过filePath手动读取图片: 每一次都要重新从沙盒中读取 如果图片特别大,而且图片不会经常使用,可以采用此种方式,节约内存 代码演示如下 : //1.imageNamed UI

一张jpg图片实际加载过程内存消耗

一张jpg图片实际加载过程内存消耗,以一张1024*1024 argb8888 500k的jpg图片为例: a.读取图片文件(消耗图片大小内存,500k)     b.解析jpg数据(cgimage, 4mb) c.释放500k的图片内存    d.opengl纹理数据(4mb)    e.释放cgimage的4mb内存.      注意,这个过程不是必然的顺序执行,释放cgimage内存的实际是有系统决定的,会很快,但是不一定是立即执行.  所以内存会瞬间飙升9mb左右,然后减少5mb,稳定到

前端预览图片和H5canvas压缩图片上传

思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法得到base64字符串来实现压缩. 1.base64转二进制文件 /** * dataURL to blob, ref to https://gist.github.com/fupslot/5015897 * @param dataURI * @returns {Blob} */ function dataURItoBlob(dataURI) { var byteString = atob(dataURI.spl

C#对图片文件的压缩、裁剪操作

在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便.毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意. 于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小.尺寸的目标图片. 进入正题--> 先说图片压缩 第一步:需要读取一个图片文件,读取方法: // <param name="ImageFilePathAndName">图片文件的全路径名称&

C#对图片文件的压缩、裁剪操作初探

在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便.毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意. 于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小.尺寸的目标图片. 进入正题--> 先说图片压缩 第一步:需要读取一个图片文件,读取方法: // <param name="ImageFilePathAndName">图片文件的全路径名称&