Android 图片Bitmap的剪切

一、什么是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<Bitmap> 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<Bitmap> list = new ArrayList<Bitmap>();
		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

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android中,可以使用多种方式来读取图片并生成Bitmap对象。以下是几种常见的方法: 1. 使用文件流方式读取图片: ``` FileInputStream fis = new FileInputStream("/sdcard/test.png"); Bitmap bitmap = BitmapFactory.decodeStream(fis); ``` 2. 使用R文件方式读取图片: ``` Bitmap bitmap = BitmapFactory.decodeResource(this.getContext().getResources(), R.drawable.test); ``` 3. 使用ResourceStream方式读取图片,但不使用R文件: ``` Bitmap bitmap = BitmapFactory.decodeStream(getClass().getResourceAsStream("/res/drawable/test.png")); ``` 在读取图片时,还可以通过设置BitmapFactory.Options来进行一些优化操作。例如,可以设置inSampleSize来减小图片的宽高,从而减少内存占用: ``` BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; // 图片宽高都为原来的二分之一,即图片为原来的四分之一 Bitmap bitmap = BitmapFactory.decodeStream(fis, null, options); ``` 需要注意的是,以上方法中的路径或资源ID需要根据实际情况进行修改。此外,在使用ImageView显示Bitmap时,可以通过开启视图缓存的方式来获取缓存的Bitmap对象: ``` imageView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache()); imageView.setDrawingCacheEnabled(false); ``` 最后,根据需要对获取到的Bitmap对象进行进一步的处理,例如模糊处理等。 #### 引用[.reference_title] - *1* [安卓Bitmap读取图片](https://blog.csdn.net/zbuger/article/details/46895335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android中从ImageView中取出图片bitmap注意事项](https://blog.csdn.net/u013933272/article/details/50987092)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android学习 | 10.使用位图工具Bitmap在存储卡上读写图片文件](https://blog.csdn.net/M_Nobody/article/details/126141636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值