• android中获取图片、获取图片像素、处理像素等基础知识


    一、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;                        
    View Code

    四、利用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;
        }
    View Code

      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;
        }
    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
  • 相关阅读:
    HashTable, HashMap,TreeMap区别
    redis的多线程
    五种I/O模型介绍
    SpringBoot的优点
    spring注解
    三种方法求解两个数组的交集
    数据库七种传播行为
    BETA 版冲刺前准备
    Python学习笔记(二)--变量和数据类型
    事后诸葛亮
  • 原文地址:https://www.cnblogs.com/bokeofzp/p/6054997.html
Copyright © 2020-2023  润新知