Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Invert bitmap colors

I have the following problem. I have a charting program, and it's design is black, but the charts (that I get from the server as images) are light (it actually uses only 5 colors: red, green, white, black and gray).

To fit with the design inversion does a good job, the only problem is that red and green are inverted also (green -> pink, red -> green).

Is there a way to invert everything except those 2 colors, or a way to repaint those colors after inversion? And how costly are those operations (since I get the chart updates pretty often)?

Thanks in advance :)

UPDATE

I tried replacing colors with setPixel method in a loop

for(int x = 0 ;x < chart.getWidth();x++) {
        for(int y = 0;y < chart.getHeight();y++) {
            final int replacement = getColorReplacement(chart.getPixel(x, y));
            if(replacement != 0) {
                chart.setPixel(x, y, replacement);
            }
        }
    }

Unfortunetely, the method takes too long (~650ms), is there a faster way to do it, and will setPixels() method work faster?

like image 207
Alex Orlov Avatar asked Jan 07 '11 10:01

Alex Orlov


2 Answers

Manipulating a bitmap is much faster if you copy the image data into an int array by calling getPixels only once, and don't call any function inside the loop. Just manipulate the array, then call setPixels at the end.

Something like that:

int length = bitmap.getWidth()*bitmap.getHeight();
int[] array = new int[length];
bitmap.getPixels(array,0,bitmap.getWidth(),0,0,bitmap.getWidth(),bitmap.getHeight());
for (int i=0;i<length;i++){
// If the bitmap is in ARGB_8888 format
  if (array[i] == 0xff000000){
    array[i] = 0xffffffff;
  } else if ...
  }
}
bitmap.setPixels(array,0,bitmap.getWidth(),0,0,bitmap.getWidth(),bitmap.getHeight());
like image 60
Utyi Avatar answered Sep 20 '22 02:09

Utyi


If you have it available as BufferedImage, you can access its raster and edit it as you please.

WritableRaster raster = my_image.getRaster();

// Edit all the pixels you wanna change in the raster (green -> red, pink -> green)
// for (x,y) in ...
// raster.setPixel(x, y, ...) 

my_image.setData(raster);
like image 21
dagnelies Avatar answered Sep 22 '22 02:09

dagnelies