一、android獲取圖片的主要方法。
(1)、利用BitmapFactory.decode..各種方式獲取資源、sd卡的圖片,從這可以看出android都是以位圖的形式加載的圖片的,jpg、png等形式的圖片都會轉化為位圖的格式。
(2)、利用Bitmap.create來創建圖片,制定位圖的存儲格式
二、android 中位圖的像素的獲取和處理。
(1)、獲取像素采用bitmap.getPixel(x,y),獲取得到圖像的像素值。
(2)、采用bitmap.setPixel(x , y , argb)來設置圖像的像素。這個方法會拋出2個異常,主要是當我們獲取的圖片不可mutable(修改、改變)時就會這樣,處理的方法是利用Bitemap.create創建一張圖片,然后來處理創建的圖片。
三、獲取圖片的r、g、b三個圖像分量的值。
獲取圖像r、g、b三個通道的值一般采用移位操作來獲得:方法如下

int argb = bitmap.getPixel(j , i ); int r =( argb>>16)&0xff; int g =( argb>>8)&0xff; int b =argb&0xff;
四、利用a、r、g、b三個分量合成一個像素值(a為alpha值表示圖像透明度)。
首先你得看圖片的格式,是幾個byte的,如android 中額度bitmap有 ALPHA_8(1個字節)、RGB_565(2個字節)、ARGB_4444(Deprecated 2個字節)、ARGB_8888(4個字節)。java中還有3個字節的,下面用四個字節的為例:
1、直接利用像素的整數值合成:通過打印alpha的默認值是255,即完全不透明。

public Bitmap getTranslateImage(Bitmap bitmap , int alpha)//alpha 0 - 255 { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Bitmap bitmap2 = Bitmap.createBitmap(w , h , Bitmap.Config.ARGB_8888); for(int i = 0 ; i < h ; i++) for(int j = 0 ; j < w; j ++) { int argb = bitmap.getPixel(j , i ); int r =( argb>>16)&0xff; int g =( argb>>8)&0xff; int b =argb&0xff; int a =(argb>>24)&0xff; System.out.println("a的值:"+a); int rgb =((a*256+r) * 256 + g) * 256 + b; bitmap2.setPixel(j , i , rgb); } return bitmap2; }
2、第二種方式就是利用移位操作:

public Bitmap getTranslateImage(Bitmap bitmap , int alpha)//alpha 0 - 255 { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Bitmap bitmap2 = Bitmap.createBitmap(w , h , Bitmap.Config.ARGB_8888); for(int i = 0 ; i < h ; i++) for(int j = 0 ; j < w; j ++) { int argb = bitmap.getPixel(j , i ); int r =( argb>>16)&0xff; int g =( argb>>8)&0xff; int b =argb&0xff; int a =(argb>>24)&0xff; int rgb =(a<<24)|(r<<16)|(g<<8)|b; bitmap2.setPixel(j , i , rgb); } return bitmap2; }
Note:這里是android下的圖像處理,與java里的還是有些不同的,android處理的是位圖,采用的是無符號編碼。java中的
BufferedImage.TYPE_3BYTE_BGR占3個字節的像素的格式,最高位是符號位,轉換時候需要考慮最高位為1后就得用負數表示。並且java處理不同的圖片格式,如jpg等圖片時候getRed是不支持返回int的因此用object作為返回類型。具體可參見:http://blog.csdn.net/fykhlp/article/details/6204714

public BufferedImage getGrayPicture(BufferedImage originalImage) { int green=0,red=0,blue=0,rgb; int imageWidth = originalImage.getWidth(); int imageHeight = originalImage.getHeight(); for(int i = originalImage.getMinX();i < imageWidth ;i++) { for(int j = originalImage.getMinY();j < imageHeight ;j++) { //圖片的像素點其實是個矩陣,這里利用兩個for循環來對每個像素進行操作 Object data = routeImage.getRaster().getDataElements(i, j, null);//獲取該點像素,並以object類型表示 red = routeImage.getColorModel().getRed(data); blue = routeImage.getColorModel().getBlue(data); green = routeImage.getColorModel().getGreen(data); red = (red*3 + green*6 + blue*1)/10; green = red; blue = green; /* 這里將r、g、b再轉化為rgb值,因為bufferedImage沒有提供設置單個顏色的方法,只能設置rgb。rgb最大為8388608,當大於這個值時,應減去255*255*255即16777216 */ rgb = (red*256 + green)*256+blue; if(rgb>8388608) { rgb = rgb - 16777216; } //將rgb值寫回圖片 routeImage.setRGB(i, j, rgb); } } return originalImage; }