cottonBallPaws
cottonBallPaws

Reputation: 21600

How to change the background color of a saved transparent bitmap

I am opening a png image into a Bitmap, making some modifications to it and then saving it to disk as a jpg. In the case where the png has some transparent areas, they are saved as black. Is there a way to change this default behavior so the image is saved with a different color background such as white?

Thanks

Upvotes: 28

Views: 32718

Answers (3)

OhhhThatVarun
OhhhThatVarun

Reputation: 4321

For Kotlin you can use this Extension function

/**
 * Returns a new Bitmap with provided background color and recycles the current one.
 */
fun Bitmap.changeBackgroundColor(color: Int): Bitmap {
    val newBitmap = Bitmap.createBitmap(width, height, config)
    val canvas = Canvas(newBitmap)
    canvas.drawColor(color)
    canvas.drawBitmap(this, 0F, 0F, null)
    recycle()
    return newBitmap
}

Upvotes: 1

Daren Robbins
Daren Robbins

Reputation: 2025

You could draw it to a new bitmap, e.g.

   Bitmap newBitmap = Bitmap.createBitmap(image.getWidth(), 
    image.getHeight(), image.getConfig());
    Canvas canvas = new Canvas(newBitmap);
    canvas.drawColor(Color.WHITE);
    canvas.drawBitmap(image, 0F, 0F, null);

then save new bitmap instead

Upvotes: 67

Muhammed Refaat
Muhammed Refaat

Reputation: 9103

To save an image and retain its transparent areas you can't save it as JPG, you have to save it as PNG, and not only that, but setting the setting of setHasAlpha() to true BEFORE saving the image, so it would be like that:

before saving:

mBitmap.setHasAlpha(true);

And when saving, save the image as PNG using whatever the method you are using for saving, for example:

File file = new File(folderDir, name);
try {
    file.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}
FileOutputStream out = new FileOutputStream(file);
mBitmap.setHasAlpha(true);
mBitmap.compress(Bitmap.CompressFormat.PNG, 80, out);
out.flush();
out.close();

Upvotes: 9

Related Questions