Ví někdo, proč transparentnost kreslení na Plátno funguje naprosto v pořádku, použití drawImage(), ale nefunguje na všechny s PixelWriter? Původně jsem si myslel, že to může mít něco společného s Směs nebo nějaký jiný režim/nastavení na plátně/kontextu, ale neměli jsme štěstí.
Potřebuju per-pixel variabilní transparentnost, ani jeden hodnotu průhlednosti pro celou čerpat provozu. Budu vykreslování počet "vrstev" (podobně, jak GIMP vrstvy práce, s volitelnou průhlednost per-pixel). Další otevřenou otázkou je, zda jsem lepší první kreslení FINÁLNÍ určen výstup na WritableImage a pak jen kreslení na Plátno, z výkonnostních důvodů, ale zdá se, že porazit bod pomocí Plátno v první řadě...
Níže je příklad, který ukazuje, částečně transparentní Barvě je nejprve vypracován na Obrázek a pak na Plátno, a přímo na Plátno s setColor(). Průhledné oblasti je Obraz nakreslit, neprůhledné oblasti je setColor část. Jak se dostaneme setColor() respektovat Barvu, průhlednost alfa pro každý pixel?
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.image.WritableImage;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.stage.Stage;
public class TransparencyTest extends Application {
private static final int width = 800;
private static final int height = 600;
private Scene scene;
private final Canvas canvas = new Canvas(width, height);
@Override
public void start(Stage stage) {
scene = new Scene(new Group(canvas));
stage.setScene(scene);
render();
stage.show();
exitOnEsc();
}
private void render() {
drawTransparentBg(canvas, 0, 0, width, height);
Color color = Color.web("#77000077");
WritableImage image = new WritableImage(200, 200);
for (int x = 0; x < 200; x++) {
for (int y = 0; y < 200; y++) {
image.getPixelWriter().setColor(x, y, color);
}
}
canvas.getGraphicsContext2D().drawImage(image, 50, 50);
for (int x = 0; x < 50; x++) {
for (int y = 0; y < 50; y++) {
canvas.getGraphicsContext2D().getPixelWriter().setColor(x, y, color);
}
}
}
public void drawTransparentBg(Canvas canvas, int xPos, int yPos, int width, int height) {
int gridSize = 8;
boolean darkX = true;
String darkCol = "#111111";
String lightCol = "#222266";
for (int x = xPos; x < canvas.getWidth(); x += gridSize) {
boolean dark = darkX;
darkX = !darkX;
if (x > width) {
break;
}
for (int y = yPos; y < canvas.getHeight(); y += gridSize) {
if (y > height) {
break;
}
dark = !dark;
String color;
if (dark) {
color = darkCol;
} else {
color = lightCol;
}
canvas.getGraphicsContext2D().setFill(Paint.valueOf(color));
canvas.getGraphicsContext2D().fillRect(x, y, gridSize, gridSize);
}
}
}
private void exitOnEsc() {
scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if (event.getCode().equals(KeyCode.ESCAPE)) {
Platform.exit();
}
});
}
}