android中獲取圖片、獲取圖片像素、處理像素等基礎知識

1、android獲取圖片的主要方法。

  (1)、利用BitmapFactory.decode..各類方式獲取資源、sd卡的圖片,從這能夠看出android都是以位圖的形式加載的圖片的,jpg、png等形式的圖片都會轉化爲位圖的格式。java

  (2)、利用Bitmap.create來建立圖片,制定位圖的存儲格式android

2、android 中位圖的像素的獲取和處理。

  (1)、獲取像素採用bitmap.getPixel(x,y),獲取獲得圖像的像素值。ide

  (2)、採用bitmap.setPixel(x , y , argb)來設置圖像的像素。這個方法會拋出2個異常,主要是當咱們獲取的圖片不可mutable(修改、改變)時就會這樣,處理的方法是利用Bitemap.create建立一張圖片,而後來處理建立的圖片。編碼

3、獲取圖片的r、g、b三個圖像份量的值。

  獲取圖像r、g、b三個通道的值通常採用移位操做來得到:方法以下spa

             int argb = bitmap.getPixel(j , i );
                int r =( argb>>16)&0xff;
                int g =( argb>>8)&0xff;
                int b =argb&0xff;                        
View Code

4、利用a、r、g、b三個份量合成一個像素值(a爲alpha值表示圖像透明度)。

首先你得看圖片的格式,是幾個byte的,如android 中額度bitmap有 ALPHA_8(1個字節)、RGB_565(2個字節)、ARGB_4444(Deprecated 2個字節)、ARGB_8888(4個字節)。java中還有3個字節的,下面用四個字節的爲例:.net

  一、直接利用像素的整數值合成:經過打印alpha的默認值是255,即徹底不透明。code

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;
    }
View Code

  二、第二種方式就是利用移位操做:blog

 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;
    }
View Code

 

 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;     
    }  
View Code
相關文章
相關標籤/搜索