getPixels
16lz
2021-01-26
参考http://blog.csdn.net/sunboy_2050/article/details/7308805
package com.example.tt;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.Window;import android.widget.ScrollView;import android.widget.Scroller;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(new MyView(getApplicationContext()));}class MyView extends View{public MyView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);canvas.drawColor(Color.GRAY);Bitmap bitmapSrc=BitmapFactory.decodeResource(getResources(), R.drawable.img);int bmpSrcW=bitmapSrc.getWidth();int bmpSrcH=bitmapSrc.getHeight();Paint paint=new Paint();paint.setTextSize(50);paint.setColor(Color.RED);canvas.drawText("宽:"+bmpSrcW+" 高:"+bmpSrcH, 10, 60,paint );canvas.translate(0, 60);canvas.drawBitmap(bitmapSrc, 0, 0, null);/* * int[] pixels=new int [bmpSrcH*bmpSrcW]; * bitmapSrc.getPixels(pixels, 0, bmpSrcW, 0, 0, bmpSrcW, bmpSrcH); * * 把图片中的各个像素的值放到了pixels数组中,bitmap中像素按从左到右,从上到下次序依次放到pixels中, * 第三个参数通常使用图片宽度即可,第二个参数是从pixels数组中那个位置开始存放像素值。 * 第4、5个参数是bitmap中像素坐标 * 最后两个是要获取的图片的宽高 * */ Bitmap newBmp = change1(bitmapSrc, bmpSrcW, bmpSrcH);canvas.drawBitmap(newBmp, bmpSrcW+10,0 , null); newBmp = change2(bitmapSrc, bmpSrcW, bmpSrcH);canvas.drawBitmap(newBmp, 0, bmpSrcH+10 , null); newBmp = change3(bitmapSrc, bmpSrcW, bmpSrcH);canvas.drawBitmap(newBmp, bmpSrcW+10, bmpSrcH+10 , null);newBmp = change4(bitmapSrc, bmpSrcW, bmpSrcH);canvas.drawBitmap(newBmp,0 , ( bmpSrcH+10)*2 , null);newBmp = change5(bitmapSrc, bmpSrcW, bmpSrcH);canvas.drawBitmap(newBmp,bmpSrcW+10 , ( bmpSrcH+10)*2 , null);newBmp = change6(bitmapSrc, bmpSrcW, bmpSrcH);canvas.drawBitmap(newBmp,0 , ( bmpSrcH+10)*3 , null);newBmp = change7(bitmapSrc, bmpSrcW, bmpSrcH);canvas.drawBitmap(newBmp,bmpSrcW+10 , ( bmpSrcH+10)*3 , null);}/** * 对角调换 * @param bitmapSrc * @param bmpSrcW * @param bmpSrcH * @return */private Bitmap change1(Bitmap bitmapSrc, int bmpSrcW, int bmpSrcH) {int[] pixels=new int [bmpSrcH*bmpSrcW];bitmapSrc.getPixels(pixels, 0, bmpSrcW, 0, 0, bmpSrcW, bmpSrcH);for (int i = 0; i < pixels.length/2; i++) {int tmp=pixels[i];pixels[i]=pixels[pixels.length-1-i];pixels[pixels.length-1-i]=tmp;}Bitmap newBmp=Bitmap.createBitmap(pixels, 0, bmpSrcW, bmpSrcW, bmpSrcH, Config.ARGB_8888);return newBmp;} /** * 上下对调 * @param bitmapSrc * @param bmpSrcW * @param bmpSrcH * @return */private Bitmap change2(Bitmap bitmapSrc, int bmpSrcW, int bmpSrcH) {int[] pixels=new int [bmpSrcH*bmpSrcW];bitmapSrc.getPixels(pixels, 0, bmpSrcW, 0, 0, bmpSrcW, bmpSrcH);for (int i = 0; i < bmpSrcH/2; i++) {for (int j = 0; j < bmpSrcW; j++) {int tmp=pixels[i*bmpSrcW+j];pixels[i*bmpSrcW+j]=pixels[ ( bmpSrcH-1-i) * bmpSrcW+j ];pixels[ ( bmpSrcH-1-i) * bmpSrcW+j ]=tmp;}}Bitmap newBmp=Bitmap.createBitmap(pixels, 0, bmpSrcW, bmpSrcW, bmpSrcH, Config.ARGB_8888);return newBmp;}/** * 左右对调 * @param bitmapSrc * @param bmpSrcW * @param bmpSrcH * @return */private Bitmap change3(Bitmap bitmapSrc, int bmpSrcW, int bmpSrcH) {int[] pixels=new int [bmpSrcH*bmpSrcW];bitmapSrc.getPixels(pixels, 0, bmpSrcW, 0, 0, bmpSrcW, bmpSrcH);for (int i = 0; i < bmpSrcW/2; i++) {for (int j = 0; j < bmpSrcH; j++) {int tmp=pixels[j*bmpSrcW+i];pixels[j*bmpSrcW+i]=pixels[ (j+1)*bmpSrcW-i-1 ];pixels[ (j+1)*bmpSrcW-i -1 ]=tmp;}}Bitmap newBmp=Bitmap.createBitmap(pixels, 0, bmpSrcW, bmpSrcW, bmpSrcH, Config.ARGB_8888);return newBmp;}/** * 截取一块 * @param bitmapSrc * @param bmpSrcW * @param bmpSrcH * @return */private Bitmap change4(Bitmap bitmapSrc, int bmpSrcW, int bmpSrcH) {int[] pixels=new int [bmpSrcH*bmpSrcW];for (int i = 0; i < pixels.length; i++) {pixels[i]=Color.BLUE;}bitmapSrc.getPixels(pixels, bmpSrcW*60+80, bmpSrcW, 80, 60,200 ,160 ); Bitmap newBmp=Bitmap.createBitmap(pixels, 0, bmpSrcW, bmpSrcW, bmpSrcH, Config.ARGB_8888);return newBmp;}/** * 截取一块并置于左上角 * @param bitmapSrc * @param bmpSrcW * @param bmpSrcH * @return */private Bitmap change5(Bitmap bitmapSrc, int bmpSrcW, int bmpSrcH) {int[] pixels=new int [bmpSrcH*bmpSrcW];for (int i = 0; i < pixels.length; i++) {pixels[i]=Color.BLUE;}bitmapSrc.getPixels(pixels,0, bmpSrcW, 80, 60,200 ,160 ); Bitmap newBmp=Bitmap.createBitmap(pixels, 0, bmpSrcW, bmpSrcW, bmpSrcH, Config.ARGB_8888);return newBmp;}/** * 默认背景透明 * @param bitmapSrc * @param bmpSrcW * @param bmpSrcH * @return */private Bitmap change6(Bitmap bitmapSrc, int bmpSrcW, int bmpSrcH) {int[] pixels=new int [bmpSrcH*bmpSrcW];bitmapSrc.getPixels(pixels,20, bmpSrcW, 80, 60,200 ,160 );Bitmap newBmp=Bitmap.createBitmap(pixels, 0, bmpSrcW, bmpSrcW, bmpSrcH, Config.ARGB_8888);return newBmp;}/** * 泛红效果 * @param bitmapSrc * @param bmpSrcW * @param bmpSrcH * @return */private Bitmap change7(Bitmap bitmapSrc, int bmpSrcW, int bmpSrcH) {int[] pixels=new int [bmpSrcH*bmpSrcW];bitmapSrc.getPixels(pixels,0, bmpSrcW, 0, 0,bmpSrcW ,bmpSrcH );for (int i = 0; i < pixels.length; i++) {int argb=pixels[i];//一个像素包含alpha,red,green,blue,分别占8位,组成一个32位的int值//argb占32位,即java中int类型的大小,左起前8位代表alpha(透明度),接着8位是red的值,然后8位是green,最后8位是blue,//8位二进制的最大值是2^8-1,即16进制0xff,10进制255 // 0xff 前24位是0,后8位是1,即 00000000 00000000 00000000 11111111//argb>>16后,左起前16位是0,接着8位是alpha,最后8位是red值,与0xff做 & 运算,(按位与,对应位同为1才是1,否则是0)//所以运算后前24位是0,后8位原来是1则还是1,原来是0则是0,所以后8位的值不变,前24位变为了0,所以就取出了red值,//green,blue值的取法类似 //可以使用Color.red(argb);获取该像素中的red值int r= ( argb>> 16 ) & 0xff; int g= ( argb>> 8 ) & 0xff;int b= argb & 0xff; r=(int) (r*1.5);if (r>0xff) {r=0xff;}////g=(int) (g*1.2);//if (g>0xff) {//g=0xff;//}////b=(int) (b*1.2);//if (b>0xff) {//b=0xff;//}//0xff<<24,把透明度置为完全不透明(透明度表示后面的rgb颜色的加深程度,所以透明度值越大,颜色越深,透明度为0时表示完全透明)//0xff<<24后右起24位位0,左起8位为alpha。//r<<16后左起8位为0,右边16位为0,其他位为red值//g<<8后左起16位为0,右起8位为0,其他位为green值//使用 | 运算后就把argb拼接了起来得到了32位的值,即一个像素的值//可以使用Color.rgb();得到像素值argb= (0xff<<24) | (r<<16) | (g<<8) | b;pixels[i]=argb;}Bitmap newBmp=Bitmap.createBitmap(pixels, 0, bmpSrcW, bmpSrcW, bmpSrcH, Config.ARGB_8888);return newBmp;}}}
更多相关文章
- Bitmap在内存中加载
- [置顶] 一个类搞定Android适配!!
- Android(安卓)(最新)控件透明度,布局透明度,Activity透明度,颜色透
- 简单实现android侧边栏效果
- Android中的颜色表示的详解
- android 布局适应不同分辨率
- 软件工程之四则运算开发感悟与收获
- android中YUV转RGB的方法
- 闲话Android(安卓)之 屏幕大小、pixel、分辨率、dpi、dip