主要2个方法:android
getPixels(int[] pixels , int offset , int stride , int x , int y ,int width , int height)数组
createBitmap(int[] colors , int offset , int stride , int width , int height , Config config)bash
加粗了2个方法中比较关键的参数 新建一个bitmap,长宽均为400:ide
Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
其中createBitmap()最后一个参数Config.ARGB_8888,表示色彩的存储方式,还有4444,565等,
8888效果最好,但相比其余更占空间。
复制代码
接下来往bitmap中添加红黄蓝绿4种颜色,看效果:spa
for (int i = 0; i < width / 2; i++) {
for (int j = 0; j < height / 2; j++) {//左上块
bitmap.setPixel(i, j, Color.RED);//红色
}
for (int j = height / 2; j < height; j++) {//左下块
bitmap.setPixel(i, j, Color.BLUE);//蓝色
}
}
for (int i = width / 2; i < width; i++) {
for (int j = 0; j < height / 2; j++) {//右上块
bitmap.setPixel(i, j, Color.YELLOW);//黄色
}
for (int j = height / 2; j < height; j++) { //右下块
bitmap.setPixel(i, j, Color.GREEN);//绿色
}
}
复制代码
好比上图右下的绿色块,开始填充的第一个坐标点在二维坐标系中就是(200,200),最后一个坐标点在右下点(400,400),因此宽高的for循环都从200开始,400结束。3d
直接把bitmap放入imageview,就会显示图1。code
imageView.setImageBitmap(bitmap);
复制代码
接下来用bitmap的width*height,从而获得一个int[]数组,这个数组就是用来装整个bitmap的像素点。cdn
int[] pixels = new int[width * height];
//pixels.length = 160000
复制代码
如今pixels[]数组有长度,可是并无给数组赋值,因此数组中每一个单位值都为0,能够AS打断点看到,按住alt,单击pixels:blog
bitmap.getPixels(pixels,0,width,0,0,width,height);
复制代码
当代码走过getPixels方法后再断点:图片
已经有值了,在上面说过,像素点的排列方式如同写做文,一行一行,从左往右,能够想象到图一中第一行的前200个像素点为红色,后200个为黄色,那么在pixels[]数组中 0~ 199为红色,200~399 为黄色?查阅数组:(一个颜色值为-65536,另外一个为-256)
将一个bitmap全部像素点组成的***二维图形***(做文本),经过必定的约束条件,转化为int[] 类型的***一维数组***
getPixels(int[] pixels , int offset , int stride , int x , int y ,int width , int height)
先遍历数组,把每个数所有赋值,至关于给了bitmap给了默认的颜色!
for (int i = 0; i < pixels.length; i++) {
//设置默认值
pixels[i] = Color.BLACK;
}
复制代码
若如今截取图1中左上的红色块区域,代码:
bitmap.getPixels(pixels,0,width, 0, 0, width/2, height/2)
复制代码
bitmap.getPixels(pixels,0,width, width/2, 0, width/2, height/2)
复制代码
若如今截取图1中左下的蓝色块区域,代码:
bitmap.getPixels(pixels,0,width, 0, height/2, width/2, height/2)
复制代码
若如今截取图1中右下的绿色块区域,代码:
bitmap.getPixels(pixels,0,width, width/2, height/2, width/2, height/2)
复制代码
从上面四个操做应该能理解getPixels方法后4个参数:x和y表示须要截取图像左上角的点坐标,width和height分别表示须要截取的宽高。
举个例子:如今要把上图截取的绿色块居中
bitmap.getPixels(pixels, width*100+100, width, 200, 200, width/2, height/2);
复制代码
若是不+100的样子:
bitmap.getPixels(pixels, width*100, width, 200, 200, width/2, height/2);
复制代码
场景:如今有一图片(w:400,h:2),须要把这800个像素所有放入一维数组pixels中让新图(w:800,h:1)使用。
//咱们先把其余参数固定:
bitmap.getPixels(pixels, 0, stride, 0, 0,400, 2);
复制代码
getPixels方法后四个参数固定为x:0,y:0,width:400,height:2 就至关于截取整个原图,offset也等于0,表示新bitmap从(0,0)开始填充
当stride=800时:规定了在原图上读取800个像素才能换行,而原图一行只有400,剩下400没有,又不能换行,只能用0填充(android规定的), 加入到一维数组中: 一维数组:0~800前400为有色,后400值为0,新图用来画第一行的时候,一半有色,一半无色
当stride=400时:规定了在原图上读取400个像素才能换行,原图一行就为400,读取完400换行,不会出现为空的状况,加入到一维数组中: 一维数组组:0~800都为有色的像素点,新图用来画第一行时都为有色。
仍是拿绿色块,举2个例子:
bitmap.getPixels(pixels, 0, 800, 200, 200, width / 2, height / 2);
复制代码
bitmap.getPixels(pixels, 0, 400, 200, 200, width / 2, height / 2);
复制代码
如今把createBitmap(int[] colors , int offset , int stride , int width , int height , Config config)方法拉出来,这个方法里面的参数理解就简单了,前3个参数和getPixels方法同样,后3个就没啥说的。
举个例子:取图一这个四色图4份,拼成一个大图
//数组放大4倍
int[] pixels = new int[width * height * 4];
//只改变了offset参数
bitmap.getPixels(pixels, 0, width * 2, 0, 0, width, height);
bitmap.getPixels(pixels, width, width * 2, 0, 0, width, height);
bitmap.getPixels(pixels, width*2*height, width * 2, 0, 0, width, height);
bitmap.getPixels(pixels, width*2*height+width, width * 2, 0, 0, width, height);
//新bitmap长宽都是2倍,offset表示从头开始填入像素,stride表示在数组中读取了width*2个像素 才能换一行
Bitmap bitmap2 = Bitmap.createBitmap(pixels, 0, width*2, width*2, height * 2, Bitmap.Config.ARGB_8888);
复制代码
getPixels(int[] pixels , int offset , int stride , int x , int y ,int width , int height)
abs(stride) must be >= width, x + width must be <= bitmap.width()
只要你思路是对的,符合正常人操做,就不会报错。