ALPHA_8位图和getPixel

时间:2012-02-12 08:11:15

标签: android bitmap

我正在尝试从PNG图像加载移动地图。为了节省内存  在我加载位图后,我做了类似的事情。

 
 
 `Bitmap mapBmp = tempBmp.copy(Bitmap.Config.ALPHA_8, false);` 
 

如果我绘制mapBmp,我可以看到地图,但是当我使用getPixel()时,我得到了  总是0(零)。

有没有办法从除了之外的位图检索ALPHA信息  用getPixel()?

4 个答案:

答案 0 :(得分:4)

在处理ALPHA_8时似乎是一个Android错误。我也试过copyPixelsToBuffer但无济于事。最简单的解决方法是浪费大量内存并使用ARGB_8888

Issue 25690

答案 1 :(得分:1)

我在Google上发现了这个问题,我可以使用Mitrescu Catalin最终使用的copyPixelsToBuffer()方法提取像素。这是我的代码看起来像以防其他人也发现这一点:

public byte[] getPixels(Bitmap b) {
    int bytes = b.getRowBytes() * b.getHeight();
    ByteBuffer buffer = ByteBuffer.allocate(bytes);
    b.copyPixelsToBuffer(buffer);
    return buffer.array();
}

如果您正在编写API级别12或更高级别,则可以使用getByteCount()来获取要分配的总字节数。但是,如果您要编写API级别19(KitKat),则应该使用getAllocationByteCount()代替。

答案 2 :(得分:0)

我能够找到一种很好的方式来创建边界地图。我从一开始就创建了一个ALPHA_8位图。我用路径绘制我的边界地图。然后我使用 copyPixelsToBuffer()并将字节传输到 ByteBuffer 。我使用缓冲区来“getPixels”。 我认为这是一个很好的解决方案,因为您可以缩小或向上缩小路径()并以所需的屏幕分辨率比例绘制边界图,而不是IO +解码操作。 对于ALPHA_8位图,Bitmap.getPixel()没用,它总是返回0.

答案 3 :(得分:0)

我使用PNGJ库开发了解决方案,从资源中读取图像,然后使用Config.ALPHA_8创建位图。

import ar.com.hjg.pngj.IImageLine;
import ar.com.hjg.pngj.ImageLineHelper;
import ar.com.hjg.pngj.PngReader;

public Bitmap getAlpha8BitmapFromAssets(String file) {

    Bitmap result = null;

    try {

        PngReader pngr = new PngReader(getAssets().open(file));
        int channels = pngr.imgInfo.channels;
        if (channels < 3 || pngr.imgInfo.bitDepth != 8)
            throw new RuntimeException("This method is for RGB8/RGBA8 images");

        int bytes = pngr.imgInfo.cols * pngr.imgInfo.rows;
        ByteBuffer buffer = ByteBuffer.allocate(bytes);

        for (int row = 0; row < pngr.imgInfo.rows; row++) { 

            IImageLine l1 = pngr.readRow();

            for (int j = 0; j < pngr.imgInfo.cols; j++) {

                int original_color = ImageLineHelper.getPixelARGB8(l1, j);

                byte x = (byte) Color.alpha(original_color);

                buffer.put(row * pngr.imgInfo.cols + j, x ^= 0xff);

            }

        }

        pngr.end();

        result = Bitmap.createBitmap(pngr.imgInfo.cols,pngr.imgInfo.rows, Bitmap.Config.ALPHA_8);
        result.copyPixelsFromBuffer(buffer);

    } catch (IOException e) {
        Log.e(LOG_TAG, e.getMessage());
    }

    return result;

}

由于我的特殊需要,我也反转了alpha值。此代码仅针对API 21进行测试。