前言
Android中对Bitmap的操作很多,比如缩放,裁剪,旋转等,这里简单记录一下,方便自己查阅。
PS: 参考别人内容修改,部分内容有改动和自己的理解。
正文
Matrix
对Bitmap的操作大都需要Matrix支持,Matrix 通过矩阵来处理位图,计算出各个像素点的位置,从而把bitmap显示出来。
Matrix3*3的矩阵结构
MSCALE_X MSKEW_X MTRANS_X
MSKEW_Y MSCALE_Y MTRANS_Y
MPERSP_0 MPERSP_1 MPERSP_2
大概对应的意思
缩放X 偏移X 平移X
偏移Y 缩放Y 平移Y
透视0 透视1 透视2
Matrix的操作有set,pre和post方法,例如缩放setScale(),preScale(),postScale()
- setScale(sx,sy),首先会将该Matrix设置为对角矩阵,即相当于调用reset()方法,然后在设置该Matrix的MSCALE_X和MSCALE_Y直接设置为sx,sy的值
- preScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M' = M * S(sx, sy)。
- postScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M' = S(sx, sy) * M。
缩放
PS: 这里暂时不判断source是否为null,下同
//传入指定高宽
public Bitmap scaleBitmap(Bitmap source, int width, int height) {
int bitmapWidth = source.getWidth();
int bitmapHeight = source.getHeight();
float scaleWith = ((float) width) / bitmapWidth;
float scaleHeight = ((float) height) / bitmapHeight;
Matrix matrix = new Matrix();
matrix.postScale(scaleWith, scaleHeight);
return Bitmap.createBitmap(source, 0, 0, bitmapWidth, bitmapHeight, matrix, true);
}
或者
//传入缩放比
private Bitmap scaleBitmap2(Bitmap source, float scale) {
int bitmapWidth = source.getWidth();
int bitmapHeight = source.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
return Bitmap.createBitmap(source, 0, 0, bitmapWidth, bitmapHeight, matrix, true);
}
裁剪
/**
* @param source source
* @param x 起始裁剪坐标x
* @param y 起始裁剪坐标y
* @param width 裁剪宽度
* @param height 裁剪高度或叫长度
*/
private Bitmap cropBitmap(Bitmap source, int x, int y, int width, int height) {
if (width <= 0 || height <= 0) {
return Bitmap.createBitmap(source, 0, 0, 1, 1);
}
return Bitmap.createBitmap(source, x, y, width, height);
}
PS: width 和 height不能为0 ,也不能超过source对应的宽高
举个例子
//裁剪bitmap从底部开始裁剪上半部分
cropBitmap(bitmap,0, 0, bitmap.getWidth(), bitmap.getWidth()/2)
//裁剪bitmap从中心位置开始裁剪下半部
cropBitmap(bitmap0, 0, bitmap0.getHeight() / 2, bitmap0.getWidth(), bitmap.getWidth() / 2)
旋转
/**
* @param source source
* @param rotate [0-360]
*/
private Bitmap rotateBitmap(Bitmap source, float rotate) {
int width = source.getWidth();
int height = source.getHeight();
Matrix matrix = new Matrix();
matrix.setRotate(rotate);
return Bitmap.createBitmap(source, 0, 0, width, height, matrix, true);
}
拼接
/**
* source1+ source2 横[宽]向拼接在一起
*
* @param source1 source1
* @param source2 source2
*/
private Bitmap mosaicBitmap(Bitmap source1, Bitmap source2) {
Bitmap result = Bitmap.createBitmap(source1.getWidth() + source2.getWidth(),
Math.max(source1.getHeight(), source2.getHeight()), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(source1, 0, 0, null);
canvas.drawBitmap(source2, source1.getWidth(), 0, null);
return result;
}
或者
/**
* source1+ source2 纵[高]向拼接在一起
*
* @param source1 source1
* @param source2 source2
*/
private Bitmap mosaicBitmap2(Bitmap source1, Bitmap source2) {
Bitmap result = Bitmap.createBitmap(Math.max(source1.getWidth(), source2.getWidth()),
source1.getHeight() + source2.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(source1, 0, 0, null);
canvas.drawBitmap(source2, 0, source1.getHeight(), null);
return result;
}
偏移
对于偏移,暂时没搞懂(比如kx和ky的范围以及这个功能的作用),这里只是记录一下代码。
private Bitmap skewBitmap(Bitmap source, float kx, float ky) {
Matrix matrix = new Matrix();
matrix.postSkew(kx, ky);
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}
参考文章
暂无评论...
随机推荐
自定义垂直Seekbar简介
前言记录一下自定义的垂直SeekBar,记录于此,方便自己查阅。正文一般来说,水平SeekBar是最多的,比如多媒体中的进度控制,音量条的控制,但是偶尔存在项目需要竖直SeekBar。由于没有原生的,要么自定义,要么直接把SeekBar进行90°的翻转也可以,当然,网上也很多相关资料和开源...
刘大白:心上的写真
从低吟里,短歌离了她底两唇,飞行到我底耳际。但耳际不曾休止,毕竟颤动了我底心弦。从瞥见里,微笑辞了她底双唇,飞行到我底眼底。但眼底不曾停留,毕竟闪动了我底心镜。心弦上短歌之声底写真,常常从掩耳时复奏了;心境上微笑之影底写真,常常从合眼时重现了。1922
茨维塔耶娃:我想和你一起生活在某个小镇
我想和你一起生活在某个小镇共享无尽的黄昏和绵绵不绝的钟声。在这个小镇的旅店里——古老时钟敲出的微弱响声像时光轻轻滴落。有时候,在黄昏,自顶楼的某个房间里传来笛声吹笛者倚著窗牖,窗口大朵大朵的郁金香。此刻,你若不爱我我也不会在意在房间中央,一个磁砖砌成的炉子每一块磁砖...
周国平:对自己的人生负责
人活在世上,不免要承担各种责任,小至对家庭、亲戚、朋友,大至对国家和社会。这些责任多半是应该承担的。此外,还有一项根本的责任,便是对自己的人生负责。每个人在世上都只有活一次的机会,没有任何人能够代替他重新活一次。如果这惟一的人生虚度了,也没有任何人能够真正安慰他。认识到这一点,对自己的人生怎么能不...
李娟:想起外婆吐舌头的样子
外婆有个习惯性的小动作,就是吐舌头。通常这一动作会出现在做了错事之后。而她做了错事通常会先掖着瞒着,如打碎了糖罐子,就悄悄把碎片扫一扫,剩糖撮一撮,换个一模一样的罐子装了原样摆着。直到你问她:糖为什么突然少了半罐子?她就吐吐舌头,笑眯眯地坦白。家里的金鱼死后,鱼缸一直空在那里,空了很久。有一天却发...
重写TextView的setText出现异常问题
前言TextView重写setText(CharSequence text, BufferType type) 时出现如下异常日志(截取部分日志):java.lang.NullPointerException: Attempt to invoke interface method 'int j...