我正在尝试从PNG图像加载移动地图。为了节省内存 在我加载位图后,我做了类似的事情。
`Bitmap mapBmp = tempBmp.copy(Bitmap.Config.ALPHA_8, false);`
如果我绘制mapBmp,我可以看到地图,但是当我使用getPixel()时,我得到了 总是0(零)。
有没有办法从除了之外的位图检索ALPHA信息 用getPixel()?
答案 0 :(得分:4)
在处理ALPHA_8
时似乎是一个Android错误。我也试过copyPixelsToBuffer
但无济于事。最简单的解决方法是浪费大量内存并使用ARGB_8888
。
答案 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进行测试。