Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bitmap loses transparency when it's saved

i have a problem when i'm trying to save a bitmap to the external picture directory. When i use the Bitmap.compress function to save it, the bitmap loses its transparency and makes the background black. But when i pass the bitmap to a imageview and show it in the activity it looks fine and has transparency. Only when i try to save it, then transparency turns black.

I have to say, that im using two bitmaps and porterduff mode the draw a path on a bitmap and show only the picture in the drawn path, and all other pixels should be cut off or transparent.

So here's the function for creating a path bitmap:

private void createPathBitmap(RectF rect, Bitmap bitmap, Path path) {
    RectF tmpRect = new RectF(rect);
    Bitmap src = Bitmap.createBitmap(bitmap, (int) tmpRect.left, (int) tmpRect.top, (int) tmpRect.width(), (int) tmpRect.height());
    Bitmap dst = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(dst);

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeWidth(mDisplayDensity * SnippetLayer.PATH_DIAMETER);
    path.offset(-rect.left, -rect.top);
    canvas.drawPath(path, paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    RectF srcRect = new RectF(0, 0, rect.width(), rect.height());
    canvas.drawBitmap(src, null, srcRect, paint);
    BitmapManager.sBitmapSnippet = dst;
}

And here's the method for saving that bitmap to external storage:

 SimpleDateFormat dateFormat = new SimpleDateFormat("HH_mm_ss_dd_MM_yyyy");
        File snippetFile = new File(picDir, fileName+"_"+dateFormat.format(new Date())+".png");
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(snippetFile);
            BitmapManager.sBitmapSnippet.setHasAlpha(true);
            BitmapManager.sBitmapSnippet.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

The picture is shown only in the path, and the rest of the bounding box is black and not transparent. I appreciate any help.

like image 861
pawlinsky Avatar asked Nov 07 '14 13:11

pawlinsky


2 Answers

I'm using compress() method to write bitmap into output stream:

bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);

It is important to use PNG format. JPEG transforms my transparent background into black color.

like image 148
Volodymyr Kret Avatar answered Oct 07 '22 13:10

Volodymyr Kret


I don't know why exactly does it lose transparency, but I had the same problem. All you have to do is to change

BitmapManager.sBitmapSnippet.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);

to

BitmapManager.sBitmapSnippet.compress(Bitmap.CompressFormat.PNG, 0, fileOutputStream);.

This will compress the bitmap with full quality, but containing transparent regions.

like image 30
artus9033 Avatar answered Oct 07 '22 12:10

artus9033