Vedant Agarwala
Vedant Agarwala

Reputation: 18819

Bitmap.getPixel only returning 0

I have the following code for creating a bitmap:

public PixelMapper(Path inputPath){
    RectF src = new RectF();
    inputPath.computeBounds(src, true);
    int width = (int)src.width()+1;
    int height = (int)src.height()+1;
    largeBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);

    Paint canvasPaint = new Paint();
    canvasPaint.setAntiAlias(false);
    canvasPaint.setColor(Color.BLACK);
    canvasPaint.setStyle(Style.STROKE);
    canvasPaint.setStrokeWidth(5);

    Canvas canvas = new Canvas(largeBitmap);
    canvas.drawPath(inputPath, canvasPaint);
    bitmap = Bitmap.createScaledBitmap(largeBitmap, SIDE_OF_BITMAP, SIDE_OF_BITMAP, true);
    bitmap = Bitmap.createBitmap(bitmap);//so that a immutable bitmap is created
    drawPixelMap();
}

public void drawPixelMap(){
    for(int x=0; x<bitmap.getWidth(); x++){
        String msg="";
        for(int y=0; y<bitmap.getHeight(); y++){
            msg = Integer.toHexString( bitmap.getPixel(x,y) );
            Log.v("bitmap", msg);   
        }           
    }
}

int[] pixels = new int[64]; 
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, SIDE_OF_BITMAP, SIDE_OF_BITMAP);
bitmap.setPixels(pixels, 0, 8, 0, 0, 8, 8);
for ( int pixel : pixels)
    Log.v("bitmap", Integer.toHexString(pixel) );

The problem is that all the log messages are "0": both getPixel and getPixels return "0". What is worse is that if I remove the line bitmap.getPixels(...); and leave the bitmap.setPixels(...) line,the image is still drawn as before. It seems that the bitmap variable is just a reference and a bitmap doesn't exist, and for some reason, I am unable to get those pixels. I know the bitmap is created as required as I am able to view it on a ImageView. It shows black and white pixels with a few grey ones too. Code:

Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, 128, 128, false);
imageView1.setImageBitmap(newBitmap);

The SIDE_OF_BITMAP = 8, all classes (Path, Bitmap, Canvas) are of android.

I tried saving the bitmap to file with the following code:

public String saveToStorage(String fileName){
    if( !storageDir.exists() )
        storageDir.mkdirs();
    File file = new File(storageDir, fileName + ".png");
    try{
        OutputStream out = new FileOutputStream(file);
        boolean result = bitmap.compress(CompressFormat.PNG, 100, out);
        out.close();
        return Boolean.toString(result);
    }
    catch (FileNotFoundException e){
        Log.e("save", "cannot save file", e);
        return "File not found exception";
    }
    catch (IOException e){
        Log.e("save", "IO error", e);
        return "IO Exception";
    }
}

but it returns "false" i.e. the bitmap.compress method returns false. Please give me any help at all, not necessarily sample code.

Upvotes: 1

Views: 3007

Answers (2)

Vedant Agarwala
Vedant Agarwala

Reputation: 18819

I found my mistake. It lies in the line

largeBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);

The Bitmap.Config.ALPHA_8 only creates a mask. It does not create actual pixels. That is why I was getting the erroneous results. However, when I was setting it to a ImageView I was getting the required result because its background (by default) is white. I solved my problem by changing the Bitmap.Config.ALPHA_8 to Bitmap.Config.ARGB_8888

Upvotes: 1

Alan
Alan

Reputation: 608

The line

bitmap = Bitmap.createBitmap(bitmap);

creates a immutable bitmap of the same dimension/color depth, etc as the source bitmap, but not converting the source bitmap from mutable to immutable. So your new bitmap is blank.

You can first create a immutable bitmap using newBitmap = Bitmap.createBitmap(int[], int, int, Bitmap.Config), then create a canvas for it by canvas = new Canvas(newBitmap). Your bitmap can now be copied to newBitmap by canvas.drawBitmap(bitmap, 0, 0, null).

Upvotes: 0

Related Questions