1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBufferInt;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class InvertAlpha {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel(new GridLayout(0,2));
BufferedImage image = createImage();
BufferedImage image1 = createAlphaImage();
panel.add(new JLabel(new ImageIcon(image)));
panel.add(new JLabel(new ImageIcon(image1)));
BufferedImage image2 = createInvertAlphaImage(image1);
panel.add(new JLabel(new ImageIcon(image2)));
panel.add(new JLabel(new ImageIcon(maskImage(image,image2))));
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static BufferedImage maskImage(BufferedImage image1, BufferedImage image2) {
BufferedImage image = new BufferedImage(image1.getWidth(), image1.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
g.drawImage(image1, 0, 0, null);
g.setComposite(AlphaComposite.Xor);
g.drawImage(image2, 0, 0, null);
g.dispose();
return image;
}
public static BufferedImage createImage() {
BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.fillRect(0,0,256,256);
g.transform(AffineTransform.getRotateInstance(Math.PI / 4, 128, 128));
Color[] colors = { Color.GREEN, Color.ORANGE, Color.BLUE};
int color = 0;
for (int i = -256; i < 512; i += 32) {
for (int j = -256; j < 512; j += 32) {
g.setColor(colors[color++]);
g.fillRect(i, j, 32, 32);
color %= colors.length;
}
color++;
color %= colors.length;
}
g.dispose();
return image;
}
public static BufferedImage createAlphaImage() {
BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
g.setClip(new Ellipse2D.Double(0, 0, 256, 256));
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.fillRect(0,0,256,256);
g.transform(AffineTransform.getRotateInstance(Math.PI / 4, 128, 128));
Color[] colors = { Color.RED, Color.BLUE, Color.YELLOW };
int color = 0;
for (int i = 0; i < 256; i += 32) {
for (int j = 0; j < 256; j += 32) {
g.setColor(colors[color++]);
g.fillRect(i, j, 32, 32);
color %= colors.length;
}
}
g.dispose();
return image;
}
public static BufferedImage createInvertAlphaImage(BufferedImage image) {
BufferedImage newImage = copy(image);
DataBufferInt buffer = (DataBufferInt) newImage.getAlphaRaster().getDataBuffer();
int[] values = buffer.getData();
for (int i = 0; i < buffer.getSize(); i++) {
values[i] = values[i] ^ 0xffffffff ;
}
return newImage;
}
private static BufferedImage copy(BufferedImage image) {
ColorModel cm = image.getColorModel();
return new BufferedImage(cm, image.copyData(null), cm.isAlphaPremultiplied(), null);
}
} |
Partager