ALPHA_8 bitmaps and getPixel

后端 未结 4 1585
既然无缘
既然无缘 2020-12-31 19:59

I am trying to load a movement map from a PNG image. In order to save memory after I load the bitmap I do something like that.

 
 `Bitmap mapBmp = tempBmp.         


        
4条回答
  •  轮回少年
    2020-12-31 20:38

    I developed solution with PNGJ library, to read image from assets and then create Bitmap with 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, because of my particular needs. This code is only tested for API 21.

提交回复
热议问题