Marvos
Marvos

Reputation: 277

Create a new bitmap and draw new pixels into it

I'm trying to make an app that will take two pictures you specify via editText, compare the colors of each pixel on both images and create a new picture (bitmap) (that you can save to the sd card) containing the differences between the two original pictures.

I'm having a problem with creating this new bitmap. How can I achieve my goal? I don't really know how to do this, do I create the new bitmap first and then write into it, or do I get the differences first and then draw a bitmap from that? The pictures will be approx. 300x300 px.

Upvotes: 8

Views: 40399

Answers (2)

Renard
Renard

Reputation: 6929

this code is just out of my head and untested but it should get you on the right track.

final int w1 = b1.getWidth();
final int w2 = b2.getWidth();
final int h1 = b1.getHeight();
final int h2 = b2.getHeight();
final int w = Math.max(w1, w2);
final int h = Math.max(h2, h2);

Bitmap compare = Bitmap.createBitmap(w, h, Config.ARGB_8888);

int color1, color2, a, r, g, b;

for (int x = 0; x < w; x++) {
    for (int y = 0; y < h; y++) {
        if (x < w1 && y < h1) {
            color1 = b1.getPixel(x, y);
        } else {
            color1 = Color.BLACK;
        }
        if (x < w2 && y < h2) {
            color2 = b2.getPixel(x, y);
        } else {
            color2 = Color.BLACK;
        }
        a = Math.abs(Color.alpha(color1) - Color.alpha(color2));
        r = Math.abs(Color.red(color1) - Color.red(color2));
        g = Math.abs(Color.green(color1) - Color.green(color2));
        b = Math.abs(Color.blue(color1) - Color.blue(color1));

        compare.setPixel(x, y, Color.argb(a, r, g, b));
    }
}
b1.recycle();
b2.recycle();

Upvotes: 20

Samuel
Samuel

Reputation: 17171

I would create the bitmap first and compute the differences between each pixel, but you're welcome to compute the differences first and then use Bitmap.copyPixels, but I think it's easier to understand the first way. Here is an example:

// Load the two bitmaps
Bitmap input1 = BitmapFactory.decodeFile(/*first input filename*/);
Bitmap input2 = BitmapFactory.decodeFile(/*second input filename*/);
// Create a new bitmap. Note you'll need to handle the case when the two input
// bitmaps are not the same size. For this example I'm assuming both are the 
// same size
Bitmap differenceBitmap = Bitmap.createBitmap(input1.getWidth(), 
    input1.getHeight(), Bitmap.Config.ARGB_8888);
// Iterate through each pixel in the difference bitmap
for(int x = 0; x < /*bitmap width*/; x++)
{
    for(int y = 0; y < /*bitmap height*/; y++)
    {
        int color1 = input1.getPixel(x, y);
        int color2 = input2.getPixel(x, y);
        int difference = // Compute the difference between pixels here
        // Set the color of the pixel in the difference bitmap
        differenceBitmap.setPixel(x, y, difference);
    }
}

Upvotes: 0

Related Questions