工作中遇到图片转灰度数组的须要,经过研究和大神的指导。终于得到例如以下两个方法。能够实现位图转灰度数组

简单的位图转灰度数组就是:得到位图中的每一个像素点,然后依据像素点得到RGB值,最后对RGB值,依据灰度算法得到灰度值就可以

/*如一张480*800的图片,终于得到一个byte[480*800/2]的灰度数组,由于函数把每两个相邻高的像素灰度转化为一个灰度*/

private byte[] java_convertIMG2GreyArray(Bitmap img) {

byte[] theBytes = null;

        /* 得到位图的宽高 */

        int width = img.getWidth();

        int height = img.getHeight();

        /* 取得位图的像素点 */

        int[] pixels = new int[width * height];

        img.getPixels(pixels, 0, width, 0, 0, width, height);

        /* 定义结果数据数组 */

        theBytes = new byte[width * height / 2];



        /*定义循环中用到的变量,节约内存和时间*/

        int x, y, k;

        int pixel, r, g, b;

        for (y = 0; y < height; y++) {

            for (x = 0, k = 0; x < width; x++) {

                //依次取得像素点

                pixel = pixels[y * width + x];

                //得到rgb

                r = (pixel >> 16) & 0xFF;

                g = (pixel >> 8) & 0xFF;

                b = pixel & 0xFF;

                /*每两行存为一行*/

                if (x % 2 == 1) {

                    theBytes[k + y * width / 2] = (byte) (theBytes[k + y

                            * width / 2] | ((r * 299 + g * 587 + b * 114 + 500) / 1000) & 0xf0);

                    k++;

                } else {

                    theBytes[k + y * width / 2] = (byte) (theBytes[k + y

                            * width / 2] | (((r * 299 + g * 587 + b * 114 + 500) / 1000) >> 4) & 0x0f);

                }

            }

        }

        return theBytes;

}

/*灰度依次转换 如:480 * 800最后得到一个byte[480*800]的灰度数组*/

private void java_convertIMGtoGreyArray(Bitmap img) {



        boolean usedebug = true;



        if (debugImage == null || debugUihandler == null)

            usedebug = false;



        int width = img.getWidth(); // 获取位图的宽

        int height = img.getHeight(); // 获取位图的高



        theBytes = null;



        theBytes = new byte[width * height];



        int[] pixels = new int[width * height]; // 通过位图的大小创建像素点数组



        img.getPixels(pixels, 0, width, 0, 0, width, height);



        for (int i = 0; i < height; i++) {



            for (int j = 0; j < width; j++) {



                int colorAtPixel = pixels[width * i + j];



                int alpha = (colorAtPixel >> 24) & 0xFF;

                int red = (colorAtPixel >> 16) & 0xFF;

                int green = (colorAtPixel >> 8) & 0xFF;

                int blue = colorAtPixel & 0xFF;



                theBytes[width * i + j] = (byte) ((red + green + blue) / 3);



                int theb = (0xff & theBytes[width * i + j]);



                pixels[width * i + j] = alpha << 24 | theb << 16 | theb << 8

                        | theb;



            }

        }



        bmo = img;



        bmo.setPixels(pixels, 0, width, 0, 0, width, height);



        pixels = null;



        if (debugUihandler != null)

            debugUihandler.post(new Runnable() {



                @Override

                public void run() {



                    if (debugImage != null && bmo != null)

                        debugImage.setImageBitmap(bmo);



                }

            });



    }

Bitmap转灰度字节数组byte[]的更多相关文章

  1. c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换

    字节数组byte[]与图片image之间的转化 字节数组转换成图片 public static Image byte2img(byte[] buffer) { MemoryStream ms = ne ...

  2. Java基础知识强化之IO流笔记27:FileInputStream读取数据一次一个字节数组byte[ ]

    1. FileInputStream读取数据一次一个字节数组byte[ ]  使用FileInputStream一次读取一个字节数组: int read(byte[]  b) 返回值:返回值其实是实际 ...

  3. C#中字节数组(byte[])和字符串相互转换

    转换过程主要使用到System.Text.Encoding命名空间下的类 1. 字符串转换成字节数组byte[]: string str = "This is test string&quo ...

  4. C#-----字节数组(byte[])和字符串相互转换

       Encoding类  表示字符编码 1.字符串转换成字节数组byte[] using System; using System.Collections.Generic; using System ...

  5. 字节数组byte[]和整型,浮点型数据的转换——Java代码

    近期在写C++ socket和java socket之间的通信程序,涉及到整数浮点数的传输.须要从字节数组还原数据,查了一些资料.总结例如以下 1.       整数和浮点数的机器表示 在机器内部.不 ...

  6. [.Net,C#]三类资源:流对象Stream,字节数组byte[],图片Image

    三类资源:流对象Stream,字节数组byte[],图片Image 关系:Stream<=>byte[],byte[]<=>Image Stream 与Image相互转化的媒介 ...

  7. C#中字节数组byte[]和字符串string类型的相互转换

    C#中字节数组byte[]和字符串string类型的相互转换: string转byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBy ...

  8. C#--整型与字节数组byte[]之间的转换

    using System; int  i = 123;byte [] intBuff = BitConverter.GetBytes(i);     // 将 int 转换成字节数组lob.Write ...

  9. java中字节数组byte[]和字符(字符串)之间的转换

    转自:http://blog.csdn.net/linlzk/article/details/6566124 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成by ...

随机推荐

  1. OpenStack 部署总结之:单节点icehouse网桥的配置

    部署完icehouse,安装完实例之后.假设虚拟主机须要和外部进行通信.还须要对宿主机的网桥进行配置 宿主机的配置 改动ifcfg-em1的内容为下面内容: DEVICE=em1 ONBOOT=yes ...

  2. jQuery框架开发一个最简单的幻灯效果

    在线演示 在这个课程中,我们将介绍如何使用jQuery来开发一个最简单的图片幻灯效果. 立刻观看互动课程:jQuery框架开发一个最简单的幻灯效果 阅读原文:jQuery框架开发一个最简单的幻灯效果

  3. 根据轨迹线构造GPS点的方法

    在地理国情普查项目中,元数据中的轨迹线图层由外业GPS点转换构成.理论上,外业GPS轨迹点在采集时间.采集人员等方面应当保持一致.但是,由于管理上.操作上的原因导致有元数据轨迹线而外业GPS轨迹点的现 ...

  4. Java网络爬虫 - 一个简单的爬虫例子

    WikiScraper.java package master.haku.scrape; import org.jsoup.Jsoup; import org.jsoup.nodes.Document ...

  5. Eclipse启动Tomcat错误(其他类似)

    Eclipse启动Tomcat错误信息: Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are alre ...

  6. 对象 get和set方法

    1.用途 用户定义的对象定义 getter 和 setter 以支持新增的属性. 示例:obj创建一个伪属性latest,它会返回log数组的最后一个元素. var obj = { log: ['ex ...

  7. DBA 需要知道N种对数据库性能的监控SQL语句

    --DBA 需要知道N种对数据库性能的监控SQL语句 -- IO问题的SQL内部分析 下面的DMV查询可以来检查当前所有的等待累积值. Select wait_type, waiting_tasks_ ...

  8. org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'statisticalMapper' defined in file

    ::, [localhost-startStop-1] DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFact ...

  9. 【VBA】点击工作簿中的每个单元格,整行整列变色

    需求描述 在点击单元格的时候,单元格所在行与列都变色显示 实现方案 打开Excle表格,按住ALT+F11 双击上图中的ThisWorkbook Private Sub Workbook_SheetS ...

  10. 如何修改浏览器默认的alert样式?

    window.alert = function(str) { var shield = document.createElement("DIV"); shield.id = &qu ...