您的位置:首页 > 编程语言 > PHP开发

getPixels

2015-12-16 12:17 651 查看
参考 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 {

@Override
protected 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);
}

@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.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;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android