概要
Graphics
の論理ピクセル操作をXOR
モードで実行するように指定して、XOR
変更色と現在の色のXOR
で生成したマスクでピクセルの色を再度XOR
反転して描画します。
Screenshot
Advertisement
サンプルコード
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
int iw = icon.getIconWidth();
int ih = icon.getIconHeight();
Dimension dim = getSize();
int x = (dim.width - iw) / 2;
int y = (dim.height - ih) / 2;
g.drawImage(icon.getImage(), x, y, iw, ih, this);
g2.setPaint(Color.RED);
g2.fillOval(10, 10, 32, 32);
g2.setPaint(Color.GREEN);
g2.fillOval(50, 10, 32, 32);
g2.setPaint(Color.BLUE);
g2.fillOval(90, 10, 32, 32);
g2.setPaint(Color.PINK);
g2.fillOval(130, 10, 32, 32);
g2.setPaint(Color.CYAN);
g2.fillOval(170, 10, 32, 32);
g2.setPaint(Color.ORANGE);
g2.fillOval(210, 10, 32, 32);
g2.setXORMode(Color.PINK);
g2.fill(rubberBand);
g2.setPaintMode();
g2.setStroke(stroke);
g2.setPaint(Color.WHITE);
g2.draw(rubberBand);
g2.dispose();
}
View in GitHub: Java, Kotlin解説
- 現在の色:
Graphics#setPaint(...)
で設定した色- このサンプルでは
Color.ORANGE
、#FFC800
、1111 1111 1100 1000 0000 0000
- このサンプルでは
XOR
変更色:Graphics#setXORMode(...)
で設定した色- このサンプルでは
Color.PINK
、#FFAFAF
、1111 1111 1010 1111 1010 1111
- このサンプルでは
- マスク: 現在の色と
XOR
変更色の排他論理和- このサンプルでは
Color.ORANGE.getRGB() ^ Color.PINK.getRGB()
、#0067AF
、0000 0000 0110 0111 1010 1111
- このサンプルでは
- このサンプルでは現在の色が
Color.ORANGE
、XOR
変更色がColor.PINK
なのでマウスドラッグで囲んだ範囲内のColor.ORANGE
はColor.PINK
に、Color.PINK
はColor.ORANGE
に反転する - その他のピクセルの色はマスクで
XOR
した色に変換 XOR
なので2
回反転すると元の色に戻る- 例
1
: 赤(#FF0000
)は#FF67AF
になるマスク: 0000 0000 0110 0111 1010 1111 赤: 1111 1111 0000 0000 0000 0000 変換後: 1111 1111 0110 0111 1010 1111
- 例
2
: 青(#0000FF
)は#006750
になるマスク: 0000 0000 0110 0111 1010 1111 青: 0000 0000 0000 0000 1111 1111 変換後: 0000 0000 0110 0111 0101 0000
参考リンク
- Graphics#setXORMode(...) (Java Platform SE 8)
- Graphics2D (Java Platform SE 8)
Graphics
ではなくGraphics2D
のドキュメントに「setXORMode(Color xorcolor)
メソッドは、ソース・カラーのAlpha
成分を無視し、デスティネーション・カラーをその値に設定する特殊なComposite
オブジェクトを設定するための簡易メソッドとして実装されます。dstpixel = (PixelOf(srccolor) ^ PixelOf(xorcolor) ^ dstpixel);
」と説明されている- このため
Graphics#setComposite(...)
を設定しているとsetXORMode(...)
は無視される