Bitmap转灰度字节数组byte[]

原创 2015年07月07日 16:52:59

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

简单的位图转灰度数组就是:得到位图中的每个像素点,然后根据像素点得到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);

                }
            });

    }



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android下常用的图像处理程序(灰度化、线性灰度变化、二值化)

1、图像灰度化: public Bitmap bitmap2Gray(Bitmap bmSrc) { // 得到图片的长和宽 int width = bmSrc.getWidth(); ...
  • xdhywj
  • xdhywj
  • 2013年05月05日 12:11
  • 8224

Android使用byte数组生成一张灰度图

Android使用byte数组生成一张灰度图

Android-将RGB彩色图转换为灰度图

Android-将RGB彩色图转换为灰度图 实例:RGB2Grey 项目运行效果图:              源代码: public class MainActivity ext...
  • wwj_748
  • wwj_748
  • 2012年11月21日 09:04
  • 7320

android 将彩色图转换为灰度图

/**       * 将彩色图转换为灰度图       * @param img 位图       *       * return 返回转换好的位图       */     publ...

Android提高十六篇之使用NDK把彩图转换灰度图

在Andorid上分别使用JAVA和NDK这两种方式来实现彩图转为灰度图,并且简单地介绍JNI在Android上的使用。...
  • hellogv
  • hellogv
  • 2010年12月23日 14:28
  • 32708

【Android】Android Studio中使用OpenCV将彩图转换成灰度图

MainActivity.java package com.duanjiwei.firstopencvapp; import android.graphics.Bitmap; import andr...

Android学习之Bitmap对象与字节数组相互转换

1、将Bitmap对象读到字节数组中 [java] view plain copy ByteArrayOutputStream baos = new...

C# Bitmap类型与Byte[]类型相互转化

Bitmap   =>   byte[]  Bitmap   b   =   new   Bitmap( "test.bmp "); MemoryStream   ms   =   new ...

Activity之间传递Bitmap,将Bitmap转换为Byte数组后传递

Activity之间传递数据的大小是有限制的,Bitmap又往往比较大,如果直接传递Bitmap的话总是会出现各种问题,因此需要将Bitmap转换为Byte数组后再传递 转换后发送: ...

c# Bitmap byte[]互转

c# Bitmap转byte[] 转自:http://www.cnblogs.com/liuxinls/p/3365276.html public static byte[] Bitmap2Byte...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bitmap转灰度字节数组byte[]
举报原因:
原因补充:

(最多只允许输入30个字)