Nidhi Chaudhary
Nidhi Chaudhary

Reputation: 1

change color of transparent pixel in java

Now i am able to apply pixel of another image to source image pixel of pg to m. but problem is that i m loosing gradient or fading effect.

     public static void main(String[] args){
        try {
            BufferedImage image = ImageIO.read(new File("c:\\m.png"));
            BufferedImage patt = ImageIO.read(new File("c:\\pg.png"));

            int f = 0;
            int t = 0;
            int n = 0;
            BufferedImage bff = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
            for (int y = 0; y < image.getHeight(); ++y) {
                for (int x = 0; x < image.getWidth(); ++x) {
                    int argb = image.getRGB(x, y);
                    int nrg = patt.getRGB(x, y);

                    if(((argb>>24) & 0xff) == 0) {
                                bff.setRGB(x, y, (255<<24));
                    } else {
                                bff.setRGB(x, y, nrg);
                    }                               
                }
            }
            System.out.println("Trans : " + t + " Normal : " + n);
            File outputfile = new File("c://imagetest.png");
            ImageIO.write(bff, "png", outputfile);
        } catch (IOException ex) {

        }

}

thanks.

Upvotes: 0

Views: 2173

Answers (2)

ufis
ufis

Reputation: 176

For BufferedImage.setRGB(int x, int y, int rgb) the rgb value is made up as follows:

11111111 11111111 11111111 11111111
Alpha    Red      Green    Blue

In your code you test the following:

if (((argb >> 24) & 0xff) == 0)

which tests for an Alpha value of 0, thus completely transparent.

When you find it to be true, you then set the rgb value to 0 with

bff.setRGB(x, y, 0);

So you are setting it to transparent again.

Change that to

bff.setRGB(x, y, (255<<24));

or

bff.setRGB(x, y, 0xff000000); //This should be better

which will change it to an opaque black pixel. This will have a binary value of

11111111000000000000000000000000

Edit: Moritz Petersen's solution should work better as it retains the pixel's colour while removing transparency.

If you would like to set it to a specific colour you could do:

bff.setRGB(x, y, 0xffff0000); // red
bff.setRGB(x, y, 0xff00ff00); // green
bff.setRGB(x, y, 0xff0000ff); // blue

or any combination of red, green and blue values.

Upvotes: 0

Moritz Petersen
Moritz Petersen

Reputation: 13057

0xff000000 is opaque black, 0x00000000 is completely transparent.

What is 0 (the colour you chose)?

Yes, it's transparent.

Try 0xff000000 or even better: argb ^ 0xff000000, which just changes the transparency, instead.

                if(((argb>>24) & 0xff) == 0) {
                            bff.setRGB(x, y, argb ^ 0xff000000);
                } else {
                            bff.setRGB(x, y, argb);
                }                               

Upvotes: 3

Related Questions