Android之小小图片加工厂

        有时候我们在项目中,需要把图片加工一下,比如说加个圆角,或者打上马赛克或者水印,虽然不是很难的东西,但是没弄过,还是很纠结的,比如像我这样的小白,现在根据网上一些大牛的一些方法,总结了下面这个图片加工厂工具类,可能还有更多的需求,有需要的时候,再去网上找,继续完善中,,直接上跟大家分享代码,注释比较多,而且简单,我就不多说了,直接上跟大家分享代码:

/**
 * 图片加工厂
 * 
 * @author way
 * 
 */
public class ImageUtil {
	/**
	 * 通过路径获取输入流
	 * 
	 * @param path
	 *            路径
	 * @return 输入流
	 * @throws Exception
	 *             异常
	 */
	public static InputStream getRequest(String path) throws Exception {
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setConnectTimeout(5000);
		if (conn.getResponseCode() == 200) {
			return conn.getInputStream();
		}
		return null;
	}

	/**
	 * 从流中读取二进制数据
	 * 
	 * @param inStream
	 *            输入流
	 * @return 二进制数据
	 * @throws Exception
	 *             异常
	 */
	public static byte[] readInputStream(InputStream inStream) throws Exception {
		ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
		byte[] buffer = new byte[4096];
		int len = 0;
		while ((len = inStream.read(buffer)) != -1) {
			outSteam.write(buffer, 0, len);
		}
		outSteam.close();
		inStream.close();
		return outSteam.toByteArray();
	}

	/**
	 * 把一个路径转换成Drawable对象
	 * 
	 * @param url
	 *            路径
	 * @return Drawable对象
	 */
	public static Drawable loadImageFromUrl(String url) {
		URL m;
		InputStream i = null;
		try {
			m = new URL(url);
			i = (InputStream) m.getContent();
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		Drawable d = Drawable.createFromStream(i, "src");
		return d;
	}

	/**
	 * 把一个路径转换成Drawable对象
	 * 
	 * @param url
	 *            字符串路径
	 * @return Drawable对象
	 * @throws Exception
	 *             异常
	 */
	public static Drawable getDrawableFromUrl(String url) throws Exception {
		return Drawable.createFromStream(getRequest(url), null);
	}

	/**
	 * 从路径中得到位图
	 * 
	 * @param url
	 *            字符串路径
	 * @return 位图
	 * @throws Exception
	 *             异常
	 */
	public static Bitmap getBitmapFromUrl(String url) throws Exception {
		byte[] bytes = getBytesFromUrl(url);
		return byteToBitmap(bytes);
	}

	/**
	 * 从路径中得到圆角位图
	 * 
	 * @param url
	 *            字符串路径
	 * @param pixels
	 *            圆角弧度
	 * @return 圆角位图
	 * @throws Exception
	 *             异常
	 */
	public static Bitmap getRoundBitmapFromUrl(String url, int pixels)
			throws Exception {
		byte[] bytes = getBytesFromUrl(url);
		Bitmap bitmap = byteToBitmap(bytes);
		return toRoundCorner(bitmap, pixels);
	}

	/**
	 * 从路径中得到圆角Drawable对象
	 * 
	 * @param url
	 *            字符串路径
	 * @param pixels
	 *            圆角弧度
	 * @return 圆角Drawable对象
	 * @throws Exception
	 *             异常
	 */
	public static Drawable geRoundDrawableFromUrl(String url, int pixels)
			throws Exception {
		byte[] bytes = getBytesFromUrl(url);
		BitmapDrawable bitmapDrawable = (BitmapDrawable) byteToDrawable(bytes);
		return toRoundCorner(bitmapDrawable, pixels);
	}

	/**
	 * 从路径中得到二进制数据
	 * 
	 * @param url
	 *            字符串路径
	 * @return 二进制数据
	 * @throws Exception
	 *             异常
	 */
	public static byte[] getBytesFromUrl(String url) throws Exception {
		return readInputStream(getRequest(url));
	}

	/**
	 * 从二进制数据中得到位图
	 * 
	 * @param byteArray
	 *            二进制数据
	 * @return 位图
	 */
	public static Bitmap byteToBitmap(byte[] byteArray) {
		if (byteArray.length != 0) {
			return BitmapFactory
					.decodeByteArray(byteArray, 0, byteArray.length);
		} else {
			return null;
		}
	}

	/**
	 * 从二进制数据中得到Drawable对象
	 * 
	 * @param byteArray
	 *            二进制数据
	 * @return Drawable对象
	 */
	public static Drawable byteToDrawable(byte[] byteArray) {
		ByteArrayInputStream ins = new ByteArrayInputStream(byteArray);
		return Drawable.createFromStream(ins, null);
	}

	/**
	 * 把位图转换称二进制数据
	 * 
	 * @param bm
	 *            位图
	 * @return 二进制数据
	 */
	public static byte[] Bitmap2Bytes(Bitmap bm) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
		return baos.toByteArray();
	}

	/**
	 * 把Drawable对象转换称位图
	 * 
	 * @param drawable
	 *            Drawable对象
	 * @return 位图
	 */
	public static Bitmap drawableToBitmap(Drawable drawable) {

		Bitmap bitmap = Bitmap
				.createBitmap(
						drawable.getIntrinsicWidth(),
						drawable.getIntrinsicHeight(),
						drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
								: Bitmap.Config.RGB_565);
		Canvas canvas = new Canvas(bitmap);
		drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
				drawable.getIntrinsicHeight());
		drawable.draw(canvas);
		return bitmap;
	}

	/**
	 * 图片去色,返回灰度图片
	 * 
	 * @param bmpOriginal
	 *            传入的图片
	 * @return 去色后的图片
	 */
	public static Bitmap toGrayscale(Bitmap bmpOriginal) {
		int width, height;
		height = bmpOriginal.getHeight();
		width = bmpOriginal.getWidth();

		Bitmap bmpGrayscale = Bitmap.createBitmap(width, height,
				Bitmap.Config.RGB_565);
		Canvas c = new Canvas(bmpGrayscale);
		Paint paint = new Paint();
		ColorMatrix cm = new ColorMatrix();
		cm.setSaturation(0);
		ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
		paint.setColorFilter(f);
		c.drawBitmap(bmpOriginal, 0, 0, paint);
		return bmpGrayscale;
	}

	/**
	 * 去色同时加圆角
	 * 
	 * @param bmpOriginal
	 *            原图
	 * @param pixels
	 *            圆角弧度
	 * @return 修改后的图片
	 */
	public static Bitmap toGrayscale(Bitmap bmpOriginal, int pixels) {
		return toRoundCorner(toGrayscale(bmpOriginal), pixels);
	}

	/**
	 * 把位图变成圆角位图
	 * 
	 * @param bitmap
	 *            需要修改的位图
	 * @param pixels
	 *            圆角的弧度
	 * @return 圆角位图
	 */
	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);

		return output;
	}

	/**
	 * 将BitampDrawable转换成圆角的BitampDrawable
	 * 
	 * @param bitmapDrawable
	 *            原生BitampDrawable对象
	 * @param pixels
	 *            圆角弧度
	 * @return 圆角BitampDrawable对象
	 */
	public static BitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable,
			int pixels) {
		Bitmap bitmap = bitmapDrawable.getBitmap();
		bitmapDrawable = new BitmapDrawable(toRoundCorner(bitmap, pixels));
		return bitmapDrawable;
	}

	/**
	 * 图片水印生成的方法
	 * 
	 * @param src
	 *            源图片位图
	 * @param watermark
	 *            水印图片位图
	 * @return 返回一个加了水印的图片
	 */
	public static Bitmap createBitmap(Bitmap src, Bitmap watermark) {
		if (src == null)
			return null;
		int w = src.getWidth();
		int h = src.getHeight();
		int ww = watermark.getWidth();
		int wh = watermark.getHeight();
		Bitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
		Canvas cv = new Canvas(newb);// 初始化画布
		cv.drawBitmap(src, 0, 0, null);// 在 0,0坐标开始画入src
		cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);// 在src的右下角画入水印
		cv.save(Canvas.ALL_SAVE_FLAG);// 保存,用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
		cv.restore();// 存储,用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
		return newb;
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值