I developed a solution with the PNGJ library to read an image from assets and then create a Bitmap using 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; }
I also invert alpha values due to my special needs. This code is tested only for API 21.
Jernej lavbic
source share