Я реализую слои в своем 2D-движке, и я хотел бы, чтобы слои можно было накладывать друг на друга, и я также хотел бы, чтобы функция «вырезала дыры» в слоях — это означает использование альфы. Однако при написании его отдельно я не могу заставить что-либо использовать настоящую альфу, он пытался подделать его, например, смешивая цвета вместе (мой код):
BufferedImage background, foreground;
public GraphicsTest() {
background = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);
foreground = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB); // Fully capable of alpha.
Random r = new Random();
int white = Color.white.getRGB();
// Draw random white dots
for (int i=0; i<500; i++) {
int
x = r.nextInt(500),
y = r.nextInt(500);
background.setRGB(x, y, white);
}
}
@Override
protected void paintComponent(Graphics g) {
BufferedImage output = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB); // Fully capable of alpha.
Graphics2D canvas = output.createGraphics();
Graphics2D overlay = foreground.createGraphics();
canvas.drawImage(background, 0, 0, null);
overlay.setColor(Color.white);
overlay.fillRect(0, 0, 500, 500);
// Start drawing with alpha
overlay.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f));
overlay.setColor(new Color(0xFF000000)); // Overwrite/draw full alpha, colour doesn't matter when alpha is 100%
overlay.fillRect(100, 100, 125, 87);
//canvas.setColor(Color.red);
//canvas.fillRect(0, 0, 500, 500);
canvas.drawImage(foreground, 0, 0, null);
overlay.dispose();
canvas.dispose();
g.drawImage(output, 0, 0, null);
// Also write to a file for manual raw pixel checking
try {
// Does output a 32-bit depth image
ImageIO.write(output, "PNG", new File("c:/output.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
Это самый простой тест, который я мог придумать, у меня есть два изображения, одно для фона и одно для переднего плана, мне нужно увидеть фон через передний план в поле 127x87 (произвольного размера). В настоящее время это приводит к белому экрану с черным полем, заднее поле должно быть той частью фона.
Я пробовал здесь всевозможные методы, устанавливая композит и рисуя черный с полной альфой, но в сочетании я никогда не вижу фона, setColor (0xFF000000), похоже, ничего не делает, кроме рисования черным, а композит является виновником это «подделка», вместо перезаписи FF000000 (черный) на фоне 00FFFFFF (белый без альфы), что дает FF000000 (то, что я установил), вместо этого 007F7F7F (серый без альфы).
Единственная причина, по которой я вижу это, заключается в том, что все проходит через объект Graphics2D, я не могу использовать output.setRGB, так как он медленный, и я не знаю, как рисовать с его помощью пользовательские фигуры.
setComposite()
см. классAlphaComposite
для различных режимов смешивания - person vandale   schedule 03.11.2013Color(int rgba, boolean hasalpha)
- person vandale   schedule 03.11.2013