一、什么是Android中的Bitmap

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

二、Bitmap的剪切基本操作

public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
从原始位图剪切图像,这是一种高级的方式。可以用Matrix(矩阵)来实现旋转等高级方式截图
参数说明:
  Bitmap source:要从中截图的原始位图
  int x:起始x坐标
  int y:起始y坐标
int width:要截的图的宽度
int height:要截的图的宽度
Bitmap.Config  config:一个枚举类型的配置,可以定义截到的新位图的质量
返回值:返回一个剪切好的Bitmap

三、Bitmap剪切的封装

实际使用中,因为项目需要时常需要对基本功能进行封装,下面是一段封装的代码,仅供参考。

import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.PorterDuff;import android.graphics.PorterDuff.Mode;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.RectF;public class BitmapCut{/** * 通过资源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);}/** * 设置背景为圆角 *  * @param bitmap * @param pixels * @return */public static Bitmap removeYuanjiao(Bitmap bitmap, int pixels){int width = bitmap.getWidth();int height = bitmap.getHeight();Bitmap creBitmap = Bitmap.createBitmap(width, height,android.graphics.Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(creBitmap);Paint paint = new Paint();float roundPx = pixels;RectF rectF = new RectF(0, 0, bitmap.getWidth() - pixels,bitmap.getHeight() - pixels);paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));canvas.drawBitmap(bitmap, 0, 0, paint);if (!bitmap.isRecycled())bitmap.recycle();return creBitmap;}/** * 按正方形裁切图片 */public static Bitmap ImageCrop(Bitmap bitmap, boolean isRecycled){if (bitmap == null){return null;}int w = bitmap.getWidth(); // 得到图片的宽,高int h = bitmap.getHeight();int wh = w > h ? h : w;// 裁切后所取的正方形区域边长int retX = w > h ? (w - h) / 2 : 0;// 基于原图,取正方形左上角x坐标int retY = w > h ? 0 : (h - w) / 2;Bitmap bmp = Bitmap.createBitmap(bitmap, retX, retY, wh, wh, null,false);if (isRecycled && bitmap != null && !bitmap.equals(bmp)&& !bitmap.isRecycled()){bitmap.recycle();bitmap = null;}// 下面这句是关键return bmp;// Bitmap.createBitmap(bitmap, retX, retY, wh, wh, null,// false);}/** * 按长方形裁切图片 *  * @param bitmap * @return */public static Bitmap ImageCropWithRect(Bitmap bitmap){if (bitmap == null){return null;}int w = bitmap.getWidth(); // 得到图片的宽,高int h = bitmap.getHeight();int nw, nh, retX, retY;if (w > h){nw = h / 2;nh = h;retX = (w - nw) / 2;retY = 0;} else{nw = w / 2;nh = w;retX = w / 4;retY = (h - w) / 2;}// 下面这句是关键Bitmap bmp = Bitmap.createBitmap(bitmap, retX, retY, nw, nh, null,false);if (bitmap != null && !bitmap.equals(bmp) && !bitmap.isRecycled()){bitmap.recycle();bitmap = null;}return bmp;// Bitmap.createBitmap(bitmap, retX, retY, nw, nh, null,// false);}/** * Bitmap --> byte[] *  * @param bmp * @return */public 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();}/** * 将图像裁剪成圆形 *  * @param bitmap * @return */public static Bitmap toRoundBitmap(Bitmap bitmap){if (bitmap == null){return null;}int width = bitmap.getWidth();int height = bitmap.getHeight();float roundPx;float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;if (width <= height){roundPx = width / 2;top = 0;bottom = width;left = 0;right = width;height = width;dst_left = 0;dst_top = 0;dst_right = width;dst_bottom = width;} else{roundPx = height / 2;float clip = (width - height) / 2;left = clip;right = width - clip;top = 0;bottom = height;width = height;dst_left = 0;dst_top = 0;dst_right = height;dst_bottom = height;}Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);Canvas canvas = new Canvas(output);final int color = 0xff424242;final Paint paint = new Paint();final Rect src = new Rect((int) left, (int) top, (int) right,(int) bottom);final Rect dst = new Rect((int) dst_left, (int) dst_top,(int) dst_right, (int) dst_bottom);final RectF rectF = new RectF(dst);paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(bitmap, src, dst, paint);if (bitmap != null && !bitmap.isRecycled()){bitmap.recycle();bitmap = null;}return output;}// 将图片变成带圆边的圆形图片public static Bitmap getRoundBitmap(Bitmap bitmap, int width, int height){if (bitmap == null){return null;}// 将图片变成圆角Bitmap roundBitmap = Bitmap.createBitmap(width, height,Config.ARGB_8888);Canvas canvas = new Canvas(roundBitmap);Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);int len = (width > height) ? height : width;canvas.drawCircle(width / 2, height / 2, len / 2 - 8, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, len, len, true);canvas.drawBitmap(scaledBitmap, 0, 0, paint);// 将图片加圆边Bitmap outBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);canvas = new Canvas(outBitmap);paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setColor(0xffffffff);canvas.drawCircle(width / 2, height / 2, len / 2 - 4, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OVER));canvas.drawBitmap(roundBitmap, 0, 0, paint);bitmap.recycle();bitmap = null;roundBitmap.recycle();roundBitmap = null;scaledBitmap.recycle();scaledBitmap = null;return outBitmap;}// 将图片变成带圆边的圆形图片public static Bitmap getRoundBitmap(Bitmap bitmap, int width, int height,int color){if (bitmap == null){return null;}// 将图片变成圆角Bitmap roundBitmap = Bitmap.createBitmap(width, height,Config.ARGB_8888);Canvas canvas = new Canvas(roundBitmap);Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);int len = (width > height) ? height : width;canvas.drawCircle(width / 2, height / 2, len / 2 - 8, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, len, len, true);canvas.drawBitmap(scaledBitmap, 0, 0, paint);// 将图片加圆边Bitmap outBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);canvas = new Canvas(outBitmap);paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setColor(color);canvas.drawCircle(width / 2, height / 2, len / 2 - 4, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OVER));canvas.drawBitmap(roundBitmap, 0, 0, paint);bitmap.recycle();bitmap = null;roundBitmap.recycle();roundBitmap = null;scaledBitmap.recycle();scaledBitmap = null;return outBitmap;}/** * function:图片转圆角 *  * @param bitmap *            需要转的bitmap * @param pixels *            转圆角的弧度 * @return 转圆角的bitmap */public static Bitmap toRoundCorner(Bitmap bitmap, int pixels){Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_8888);Canvas canvas = new Canvas(output);final int color = 0xff424242;final Paint paint = new Paint();final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());final RectF rectF = new RectF(rect);final float roundPx = pixels;paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(bitmap, rect, rect, paint);if (bitmap != null && !bitmap.isRecycled()){bitmap.recycle();}return output;}/** * 获取指定的圆角图片 *  * @param bitmap * @return */public static Bitmap getRadiusBitmap(Bitmap bitmap){Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setColor(0xffffffff);Bitmap radiusBitmap = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_8888);Canvas canvas = new Canvas(radiusBitmap);RectF rectF = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());canvas.drawRoundRect(rectF, 7, 7, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(bitmap, 0, 0, paint);if (bitmap != null && !bitmap.isRecycled()){bitmap.recycle();}return radiusBitmap;}// 获得指定大小的圆边的bitmap数组public static ArrayList getRadiusBitmapList(String[] pathArray,int size, int len, float radius, int color){Bitmap canvasBitmap = null;Canvas canvas = null;Paint paint = null;RectF rectF = new RectF(0, 0, len - radius, len - radius);File file = null;FileInputStream fis = null;Bitmap bitmap = null;Bitmap scaledBitmap = null;ArrayList list = new ArrayList();for (int i = 0; i < pathArray.length; i++){file = new File(pathArray[i]);if (!file.exists())continue;try{fis = new FileInputStream(file);bitmap = BitmapFactory.decodeStream(fis);if (bitmap != null){canvasBitmap = Bitmap.createBitmap(len, len,Config.ARGB_8888);canvas = new Canvas(canvasBitmap);paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setColor(color);canvas.drawRoundRect(rectF, radius, radius, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));scaledBitmap = Bitmap.createScaledBitmap(bitmap, len, len,true);canvas.drawBitmap(scaledBitmap, 0, 0, paint);list.add(canvasBitmap);}} catch (FileNotFoundException e){} finally{if (fis != null){try{fis.close();} catch (IOException e1){}}}if (list.size() == size)break;}if (scaledBitmap != null && !scaledBitmap.isRecycled()){scaledBitmap.recycle();scaledBitmap = null;}if (bitmap != null && !bitmap.isRecycled()){bitmap.recycle();bitmap = null;}return list;}/** * 按照一定的宽高比例裁剪图片 *  * @param bitmap * @param num1 *            长边的比例 * @param num2 *            短边的比例 * @return */public static Bitmap ImageCrop(Bitmap bitmap, int num1, int num2,boolean isRecycled){if (bitmap == null){return null;}int w = bitmap.getWidth(); // 得到图片的宽,高int h = bitmap.getHeight();int retX, retY;int nw, nh;if (w > h){if (h > w * num2 / num1){nw = w;nh = w * num2 / num1;retX = 0;retY = (h - nh) / 2;} else{nw = h * num1 / num2;nh = h;retX = (w - nw) / 2;retY = 0;}} else{if (w > h * num2 / num1){nh = h;nw = h * num2 / num1;retY = 0;retX = (w - nw) / 2;} else{nh = w * num1 / num2;nw = w;retY = (h - nh) / 2;retX = 0;}}Bitmap bmp = Bitmap.createBitmap(bitmap, retX, retY, nw, nh, null,false);if (isRecycled && bitmap != null && !bitmap.equals(bmp)&& !bitmap.isRecycled()){bitmap.recycle();bitmap = null;}return bmp;// Bitmap.createBitmap(bitmap, retX, retY, nw, nh, null,// false);}}

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

更多相关文章

  1. Android(安卓)瀑布流Demo
  2. picasso_强大的Android图片下载缓存库
  3. Android图片缩放总结及比较
  4. [置顶] 我的Android进阶之旅------>android Matrix图片随意的放
  5. 【android】解决在图库中缩略图与实际图片不对应的问题
  6. Android(安卓)图片预览模仿朋友圈查看图片效果放大图片,左右滑动
  7. android viewpage的使用
  8. android背景选择器selector用法汇总
  9. 第二篇 ( wcf 与 android 图片上传下载)

随机推荐

  1. Quora千赞回答,python新手应该避免哪些坑
  2. numba,让你的Python飞起来!
  3. 一文搞懂Python迭代器和生成器
  4. 数据科学:是时候该用seaborn画图了
  5. 什么是机器学习中类别数据的转换?
  6. 教你使用Python批量读写excel文件
  7. 看图涨知识,一百天搞定机器学习
  8. xlwings,让excel飞起来!
  9. 知识星球 | 说说我为什么要做『python数
  10. 大数据告诉你,台风最喜欢在我国哪个省市登