带字节缓冲区的不精确位图灰度转换

时间:2019-07-05 08:33:42

标签: java android

我正在尝试为android studio中的位图制作一个简单的像素计算器 需要一种快速获取像素并对其进行修改的方法,因此尝试了很多方法,例如:
1- getPixel()和setPixel()“非常慢”
2-锁定位和解锁位“需要未使用的Xamarin C#”
3个字节的缓冲区最终可以解决速度问题,并且对速度有所帮助,但仅适用于代码
R = G = B =(A或G或B)
但使用真实的公式
R = G = B =(0.299 * R + 0.587 * G + 0.114 * B) 结果不正确,为什么呢?

原始图片

enter image description here

下面代码后的图片

enter image description here

private void toGrayScale(Bitmap bmpData , Bitmap bmOut) {
    int size = bmpData.getRowBytes()*bmpData.getHeight()*4;
    int A,R,G,B;
    ByteBuffer buf = ByteBuffer.allocate(size);
    bmpData.copyPixelsToBuffer(buf);
    byte[] byt = buf.array();
    for(int ctr=0;ctr<size;ctr+=4)
    {
        //access array in form of argb. for ex. byt[0] is 'r', byt[1] is 'g' and so on..
        R = (int) byt[ctr];
        G = (int) byt[ctr + 1];
        B = (int) byt[ctr + 2];
        A = (int) byt[ctr + 3];
        // retrieve color of all channels
        byt[ctr] = byt[ctr + 1] = byt[ctr + 2] = (byte)(0.3 * R + 0.6 * G + 0.1 * B) ;
    }
    ByteBuffer retBuf = ByteBuffer.wrap(byt);
    bmOut.copyPixelsFromBuffer(retBuf);
}

我希望结果是黑白图像,但像素变得模糊

0 个答案:

没有答案