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

Posted YQS_Love

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android使用byte数组生成一张灰度图相关的知识,希望对你有一定的参考价值。

一、在Java里,保持一张图片使用byte数组,这样在传送数据到网络时就非常的方便。最近组长要我用一个300*400的byte数组,通过一个线程不断改变里面的值,比如让所有的位置上的值从0~255轮转,然后生产一张灰度图。一开始郁闷,怎么做都是彩色的图片,然后我就无语了,研究许久之后,终于知道怎么生产灰度图了。

二、方法
其实原理很简单,不过说实话,我还是不太明白为啥这么写就是灰度图(能力太差。。。),就不会有彩色了,下面直接上代码,下面个类就是通过byte数组生产一张Bitmap图片。

public class BitmapCreateFactroy 

    /**
     * Use color create a bitmap
     * 
     * @param color byte array
     * @param picw
     *            bitmap width
     * @param pich
     *            bitmap height
     * @return Bitmap
     */
    public static Bitmap createBitmap(byte[] values, int picW, int picH) 
        if(values == null || picW <= 0 || picH <= 0)
            return null;
        //使用8位来保存图片
        Bitmap bitmap = Bitmap
                .createBitmap(picW, picH, Config.ARGB_8888);
        int pixels[] = new int[picW * picH];
        for (int i = 0; i < pixels.length; ++i) 
        //关键代码,生产灰度图
            pixels[i] = values[i] * 256 * 256 + values[i] * 256 + values[i] + 0xFF000000;
        
        bitmap.setPixels(pixels, 0, picW, 0, 0, picW, picH);
        values = null;
        pixels = null;
        return bitmap;
    

这样,你就可以定义一个byte数组,然后将里面的值全部初始化或者动态改变每一位上的值(0~255,不过byte的范围没有这么大,强制转化就可以了),生产一张灰度图片。

传入的图片宽高要和byte数组这个矩阵一样,否则图片会生成失败哦!

例如:byte[] pictures = new byte[300 * 400];
BitmapCreateFactroy.createBitmap(pictures,300,400);

这样就得到了Bitmap图片,就可以用于显示,而byte数组则可以发送到网络或者别的地方。

如有错误,感谢指正,谢谢合作。

以上是关于Android使用byte数组生成一张灰度图的主要内容,如果未能解决你的问题,请参考以下文章

Java BufferImage图片处理(获取宽高图片截取转换灰度图)

C#图片灰度处理(位深度24→位深度8),用灰度数组byte[]新建一个8位灰度图像Bitmap 。

用c#编写一个程序读取一张bmp图片的数据并转化为灰度图保存到文件中

opencv c++ 以灰度图方式加载一张图片,并统计该图像素的最大值、最小值、均值以及方差,完整代码

Java 彩色图转灰度图

图片数据随笔