Android图片缩放方法

原创 2012年03月26日 14:55:00

方法1:按固定比例进行缩放

在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。

然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止 100K?

  经过研究,发现,Options中有个属性inJustDecodeBounds,研究了一下,终于明白是什么意思了,SDK中的E文是这么说的

  If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.

  意思就是说如果该值设为true那么将不返回实际的bitmap不给其分配内存空间而里面只包括一些解码边界信息即图片大小信息,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。也就是说先将Options的属性inJustDecodeBounds设为true,先获取图片的基本大小信息数据(信息没有保存在bitmap里面,而是保存在options里面),通过options.outHeight和 options. outWidth获取的大小信息以及自己想要到得图片大小计算出来缩放比例inSampleSize,然后紧接着将inJustDecodeBounds设为false,就可以根据已经得到的缩放比例得到自己想要的图片缩放图了。

具体代码如下:

  FrameLayout fr=(FrameLayout)findViewById(R.id.FrameLayout01);

        BitmapFactory.Options options = new BitmapFactory.Options();

        options.inJustDecodeBounds = true;

        Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg", options); //此时返回bm为空

        options.inJustDecodeBounds = false;

         //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可

        int be = (int)(options.outHeight / (float)200);

        if (be <= 0)

            be = 1;

        options.inSampleSize = be;

        //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了

        bitmap=BitmapFactory.decodeFile("/sdcard/test.jpg",options);

        int w = bitmap.getWidth();

        int h = bitmap.getHeight();

        System.out.println(w+"   "+h);

        ImageView iv=new ImageView(this);

        iv.setImageBitmap(bitmap);

 

这样我们就可以读取较大的图片而不会内存溢出了。如果你想把压缩后的图片保存在Sdcard上的话就很简单了:

File file=new File("/sdcard/feng.png");

try {

    FileOutputStream out=new FileOutputStream(file);

    if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)){

        out.flush();

        out.close();

    }

} catch (FileNotFoundException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

} catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

}

 

ok,这样就把图片保存在/sdcard/feng.png这个文件里面了,呵呵。

方法2:按长宽各自比例进行缩放

但是这里的缩放保存是按长宽比例的,下边也可以按固定大小缩放哦:

int bmpWidth  = bitmap.getWidth(); 

int bmpHeight  = bitmap.getHeight(); 

//缩放图片的尺寸 

float scaleWidth  = (float) sWidth / bmpWidth;     //按固定大小缩放  sWidth 写多大就多大

float scaleHeight = (float) sHeight / bmpHeight;  //

Matrix matrix = new Matrix(); 

matrix.postScale(scaleWidth, scaleHeight);//产生缩放后的Bitmap对象 

Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, false); 

bitmap.recycle(); 

Bitmap resizeBitmap = bitmap; 

//Bitmap to byte[] 

byte[] photoData = bitmap2Bytes(resizeBitmap); 

//save file 

String fileName = "/sdcard/test.jpg";

FileUtil.writeToFile(fileName, photoData); 

if(icon.getMinimumWidth() > 163 || icon.getMinimumHeight() > 163)

{

	BitmapDrawable b = (BitmapDrawable)icon;

	Bitmap bitmap = b.getBitmap();

	int bmpWidth  = bitmap.getWidth(); 

	int bmpHeight  = bitmap.getHeight();

	//缩放图片的尺寸 

	float scaleWidth  = (float) sWidth / bmpWidth;     //按固定大小缩放  sWidth 写多大就多大

	float scaleHeight = (float) sHeight / bmpHeight;  //

	Matrix matrix = new Matrix(); 

	matrix.postScale(scaleWidth, scaleHeight);//产生缩放后的Bitmap对象 

	Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, false); 

	bitmap.recycle();

	Drawable d =new BitmapDrawable(resizeBitmap);

	icon = d;

}

然后我在做的时候遇到一个问题,就是图片的大小确实已经改变,但是图片还是被拉伸了,在用imageView. setBackgroundDrawable的时候有的图片还是会失真,事实上,如果不用上面方法进行图片的缩放,仅设置GridView或者ListView里面的LayoutParams也可以达到图片相应的图片大小,但是setBackgroundDrawable有个缺陷,会拉伸图片,解决方法是用imageView.setImageDrawable就可以了,实现图片等比例缩放,问题解决。

Android浏览图片,点击放大至全屏效果

最近做一个项目类似于QQ空间,做到照片浏览的功能,对于QQ空间中点击图片放大至全屏,感觉效果很赞,于是也做了个类似的效果。...

微信小程序测试:navigator组件使用flex布局不兼容问题及解决方案

今天使用navigator+flex布局来做一个测试,结果发现安卓机子竟然无效,而在苹果机子上却是能正常一行显示的。测试代码如下: ...
  • eadio
  • eadio
  • 2016年11月15日 11:09
  • 2542

微信小程序开发教程(基础篇)4-关于回调函数,匿名函数,闭包的杂谈

严格来说,这不能算是一篇微信小程序教程,不过会使用到上一篇中的app.js代码作为示例,姑且充个数吧。 回调函数 回调函数,对于初入编程这一行的同学可能会有些难以理解,毕竟回调函数的使用和程序顺序...

Android图片缩放方法

安卓开发中应用到图片的处理时候,我们通常会怎么缩放操作呢,来看下面的两种做法:   方法1:按固定比例进行缩放   在开发一些软件,如新闻客户端,很多时候要显示图片的缩略图,由于手机屏幕限...

Android中图片缩放方法

http://www.cnblogs.com/leizhenzi/archive/2011/05/14/2046431.html 方法1:按固定比例进行缩放 在开发图片浏览器等软件是,很多时候要显...
  • sqk1988
  • sqk1988
  • 2011年08月23日 09:42
  • 958

Android中图片缩放方法

转载地址: http://www.cnblogs.com/leizhenzi/archive/2011/05/14/2046431.html  方法1:按固定比例进行缩放在开发图片浏览器等软件是,很多...

j2me图片缩放方法

  • 2013年03月27日 10:40
  • 4KB
  • 下载

android 图片缩放

  • 2015年04月07日 23:10
  • 1.29MB
  • 下载

图片缩放。。以及将文件(file)转化成byte[]的方法

package com.focus.dreamswood.common.util; import java.awt.Image; import java.awt.image.Buffere...

android图片缩放

  • 2017年06月14日 09:30
  • 58KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android图片缩放方法
举报原因:
原因补充:

(最多只允许输入30个字)