Reputation: 1
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
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
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