一、什么是Android中的Bitmap

Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。

二、Bitmap的缩放基本操作

在Android开发中,经常会遇到图片的操作问题,由于Android屏幕尺寸繁多,最经常的是图片的缩放问题。下面为一段Android操作的基本代码
    
// 获得图片的宽高    int width = bm.getWidth();    int height = bm.getHeight();    // 设置想要的大小    int newWidth = 320;    int newHeight = 480;    // 计算缩放比例    float scaleWidth = ((float) newWidth) / width;    float scaleHeight = ((float) newHeight) / height;    // 取得想要缩放的matrix参数    Matrix matrix = new Matrix();    matrix.postScale(scaleWidth, scaleHeight);    // 得到新的图片    Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix,      true);

三、Bitmap缩放方法的封装

为了使用方便,我们对bitmap方法进行封装

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.net.Uri;import android.util.Log;public class Bitmaptest{ private static final String TAG = "BitmapUtil"; /**  * 通过资源id转化成Bitmap  *  * @param context  * @param resId  * @return  */ public static Bitmap ReadBitmapById(Context context, int resId) {  BitmapFactory.Options opt = new BitmapFactory.Options();  opt.inPreferredConfig = Bitmap.Config.RGB_565;  opt.inPurgeable = true;  opt.inInputShareable = true;  InputStream is = context.getResources().openRawResource(resId);  return BitmapFactory.decodeStream(is, null, opt); } /**  * 缩放Bitmap满屏  *  * @param bitmap  * @param screenWidth  * @param screenHight  * @return  */ public static Bitmap getBitmap(Bitmap bitmap, int screenWidth,   int screenHight) {  int w = bitmap.getWidth();  int h = bitmap.getHeight();  Matrix matrix = new Matrix();  float scale = (float) screenWidth / w;  float scale2 = (float) screenHight / h;  // scale = scale < scale2 ? scale : scale2;  matrix.postScale(scale, scale);  Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);  if (bitmap != null && !bitmap.equals(bmp) && !bitmap.isRecycled())  {   bitmap.recycle();   bitmap = null;  }  return bmp;// Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); }  /**  * 按最大边按一定大小缩放图片  * */ public static Bitmap scaleImage(byte[] buffer, float size) {  // 获取原图宽度  BitmapFactory.Options options = new BitmapFactory.Options();  options.inJustDecodeBounds = true;  options.inPurgeable = true;  options.inInputShareable = true;  Bitmap bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length,    options);  // 计算缩放比例  float reSize = options.outWidth / size;  if (options.outWidth < options.outHeight)  {   reSize = options.outHeight / size;  }  // 如果是小图则放大  if (reSize <= 1)  {   int newWidth = 0;   int newHeight = 0;   if (options.outWidth > options.outHeight)   {    newWidth = (int) size;    newHeight = options.outHeight * (int) size / options.outWidth;   } else   {    newHeight = (int) size;    newWidth = options.outWidth * (int) size / options.outHeight;   }   bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length);   bm = scaleImage(bm, newWidth, newHeight);   if (bm == null)   {    Log.e(TAG, "convertToThumb, decode fail:" + null);    return null;   }   return bm;  }  // 缩放  options.inJustDecodeBounds = false;  options.inSampleSize = (int) reSize;  bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length, options);  if (bm == null)  {   Log.e(TAG, "convertToThumb, decode fail:" + null);   return null;  }  return bm; } /**  * 检查图片是否超过一定值,是则缩小  *  * @param view  * @param strFileName  */ public static Bitmap convertToThumb(byte[] buffer, float size) {  // 获取原图宽度  BitmapFactory.Options options = new BitmapFactory.Options();  options.inJustDecodeBounds = true;  options.inPurgeable = true;  options.inInputShareable = true;  Bitmap bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length,    options);  // 计算缩放比例  float reSize = options.outWidth / size;  if (options.outWidth > options.outHeight)  {   reSize = options.outHeight / size;  }  if (reSize <= 0)  {   reSize = 1;  }  Log.d(TAG, "convertToThumb, reSize:" + reSize);  // 缩放  options.inJustDecodeBounds = false;  options.inSampleSize = (int) reSize;  if (bm != null && !bm.isRecycled())  {   bm.recycle();   bm = null;   Log.e(TAG, "convertToThumb, recyle");  }  bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length, options);  if (bm == null)  {   Log.e(TAG, "convertToThumb, decode fail:" + null);   return null;  }  return bm; } /**  * Bitmap --> byte[]  *  * @param bmp  * @return  */ private static byte[] readBitmap(Bitmap bmp) {  ByteArrayOutputStream baos = new ByteArrayOutputStream();  bmp.compress(Bitmap.CompressFormat.JPEG, 60, baos);  try  {   baos.flush();   baos.close();  } catch (IOException e)  {   e.printStackTrace();  }  return baos.toByteArray(); } /**  * Bitmap --> byte[]  *  * @param bmp  * @return  */ public static byte[] readBitmapFromBuffer(byte[] buffer, float size) {  return readBitmap(convertToThumb(buffer, size)); } /**  * 以屏幕宽度为基准,显示图片  *  * @param iv  * @param path  * @param screenW  * @return  */ public static Bitmap decodeStream(Context context, Intent data, float size) {  Bitmap image = null;  try  {   Uri dataUri = data.getData();   // 获取原图宽度   BitmapFactory.Options options = new BitmapFactory.Options();   options.inJustDecodeBounds = true;   options.inPurgeable = true;   options.inInputShareable = true;   BitmapFactory.decodeStream(context.getContentResolver()     .openInputStream(dataUri), null, options);   // 计算缩放比例   float reSize = (int) (options.outWidth / size);   if (reSize <= 0)   {    reSize = 1;   }   Log.d(TAG, "old-w:" + options.outWidth + ", llyt-w:" + size     + ", resize:" + reSize);   // 缩放   options.inJustDecodeBounds = false;   options.inSampleSize = (int) reSize;   image = BitmapFactory.decodeStream(context.getContentResolver()     .openInputStream(dataUri), null, options);  } catch (Exception e)  {   e.printStackTrace();  }  return image; }  /**  * 按新的宽高缩放图片  *  * @param bm  * @param newWidth  * @param newHeight  * @return  */ public static Bitmap scaleImage(Bitmap bm, int newWidth, int newHeight) {  if (bm == null)  {   return null;  }  int width = bm.getWidth();  int height = bm.getHeight();  float scaleWidth = ((float) newWidth) / width;  float scaleHeight = ((float) newHeight) / height;  Matrix matrix = new Matrix();  matrix.postScale(scaleWidth, scaleHeight);  Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix,    true);  if (bm != null & !bm.isRecycled())  {   bm.recycle();   bm = null;  }  return newbm; } /**  * fuction: 设置固定的宽度,高度随之变化,使图片不会变形  *  * @param target  * 需要转化bitmap参数  * @param newWidth  * 设置新的宽度  * @return  */ public static Bitmap fitBitmap(Bitmap target, int newWidth) {  int width = target.getWidth();  int height = target.getHeight();  Matrix matrix = new Matrix();  float scaleWidth = ((float) newWidth) / width;  // float scaleHeight = ((float)newHeight) / height;  int newHeight = (int) (scaleWidth * height);  matrix.postScale(scaleWidth, scaleWidth);  // Bitmap result = Bitmap.createBitmap(target,0,0,width,height,  // matrix,true);  Bitmap bmp = Bitmap.createBitmap(target, 0, 0, width, height, matrix,    true);  if (target != null && !target.equals(bmp) && !target.isRecycled())  {   target.recycle();   target = null;  }  return bmp;// Bitmap.createBitmap(target, 0, 0, width, height, matrix,     // true); }  /**  * 根据指定的宽度平铺图像  *  * @param width  * @param src  * @return  */ public static Bitmap createRepeater(int width, Bitmap src) {  int count = (width + src.getWidth() - 1) / src.getWidth();  Bitmap bitmap = Bitmap.createBitmap(width, src.getHeight(),    Config.ARGB_8888);  Canvas canvas = new Canvas(bitmap);  for (int idx = 0; idx < count; ++idx)  {   canvas.drawBitmap(src, idx * src.getWidth(), 0, null);  }  return bitmap; }  /**  * 图片的质量压缩方法  *  * @param image  * @return  */ public static Bitmap compressImage(Bitmap image) {  ByteArrayOutputStream baos = new ByteArrayOutputStream();  image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  int options = 100;  while (baos.toByteArray().length / 1024 > 100)  { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩   baos.reset();// 重置baos即清空baos   image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中   options -= 10;// 每次都减少10  }  ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中  Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片  if (baos != null)  {   try   {    baos.close();   } catch (IOException e)   {    // TODO Auto-generated catch block    e.printStackTrace();   }  }  if (isBm != null)  {   try   {    isBm.close();   } catch (IOException e)   {    // TODO Auto-generated catch block    e.printStackTrace();   }  }  if (image != null && !image.isRecycled())  {   image.recycle();   image = null;  }  return bitmap; }  /**  * 图片按比例大小压缩方法(根据Bitmap图片压缩)  *  * @param image  * @return  */ public static Bitmap getImage(Bitmap image) {  ByteArrayOutputStream baos = new ByteArrayOutputStream();  image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  if (baos.toByteArray().length / 1024 > 1024)  {// 判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出   baos.reset();// 重置baos即清空baos   image.compress(Bitmap.CompressFormat.JPEG, 50, baos);// 这里压缩50%,把压缩后的数据存放到baos中  }  ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  BitmapFactory.Options newOpts = new BitmapFactory.Options();  // 开始读入图片,此时把options.inJustDecodeBounds 设回true了  newOpts.inJustDecodeBounds = true;  Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  newOpts.inJustDecodeBounds = false;  int w = newOpts.outWidth;  int h = newOpts.outHeight;  // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  float hh = 800f;// 这里设置高度为800f  float ww = 480f;// 这里设置宽度为480f  // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  int be = 1;// be=1表示不缩放  if (w > h && w > ww)  {// 如果宽度大的话根据宽度固定大小缩放   be = (int) (newOpts.outWidth / ww);  } else if (w < h && h > hh)  {// 如果高度高的话根据宽度固定大小缩放   be = (int) (newOpts.outHeight / hh);  }  if (be <= 0)   be = 1;  newOpts.inSampleSize = be;// 设置缩放比例  // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  isBm = new ByteArrayInputStream(baos.toByteArray());  bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  if (isBm != null)  {   try   {    isBm.close();   } catch (IOException e)   {    // TODO Auto-generated catch block    e.printStackTrace();   }  }  if (image != null && !image.isRecycled())  {   image.recycle();   image = null;  }  return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩 } /**  * 通过资源id转化成Bitmap 全屏显示  *  * @param context  * @param drawableId  * @param screenWidth  * @param screenHight  * @return  */ public static Bitmap ReadBitmapById(Context context, int drawableId,   int screenWidth, int screenHight) {  BitmapFactory.Options options = new BitmapFactory.Options();  options.inPreferredConfig = Config.ARGB_8888;  options.inInputShareable = true;  options.inPurgeable = true;  InputStream stream = context.getResources().openRawResource(drawableId);  Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);  return getBitmap(bitmap, screenWidth, screenHight); } }


示例代码:http://download.csdn.net/detail/stop_pig/7162695

更多相关文章

  1. Android高手进阶教程(二十二)之---Android中几种图像特效处理的
  2. Android(安卓)App 性能优化之图片优化
  3. 常用组件:android的图片组件ImageView
  4. Android移动图片
  5. Android(安卓)补间动画(动画列表,平移,旋转,缩放,渐变,动画集合)
  6. android 笔记 --- 自定义Android主题风格theme.xml方法
  7. Android(安卓)image的示例 拍照显示
  8. Android(安卓)利用Matrix实现图片随手指平移、旋转、缩放
  9. Android中的Selector

随机推荐

  1. 使用sqoop从mysql往hive中增量导数据shel
  2. 使用VS 2012调试PostgrelSQL
  3. 让我的MySQL能够承受上亿万条的数据量的
  4. MySQL数据库的基本操作
  5. sql System.Data.SqlClient.SqlError: 无
  6. webgote的例子(6)SQL注入(盲注)
  7. c访问mysql总报错,请指教
  8. MySQL图形界面客户端
  9. [sql2008错误问题] RegisteredServerExce
  10. 将下面语句插入到SQLSERVER数据库中出现