วาดรูปกับความโปร่งแสงล่องหนใน JavaFX นงานโดยใช้ PixelWriter

0

คำถาม

มีใครรู้ว่าทำไมความโปร่งแสงล่องหวาดบนผ้าใบทำงานสบายดีทุกอย่าใช้ drawImage()แต่ไม่ได้ทำงานทั้งหมกับ PixelWriter? ฉันตอนแรกคิดว่ามันอาจจะมีบางอย่างเกี่ยวข้องกับการผสมหรือคนอื่นโหมด/การตั้งค่าบนผ้าใบหยาบ/คอนเท็กซ์แต่ไม่มีโชคบ้างไหนกับเรื่องนั้นหรอก

ฉันต้องการต่อพิกเซลตัวแปรความโปร่งแสงล่องหนไม่เป็นโสดความโปร่งแสงล่องหนค่าสำหรับทั้งหมดดึงดำเนินงานการ)กิบัติงานอยู่ ฉันจะเป็นการแสดงผลเป็นจำนวนของ"ขั้น"(คล้ายกับว่า GIMP เสื้อผ้าหลายชั้นทำงานกับเลือกเพิ่มความโปร่งแสงล่องต่อพิกเซล). การเพิ่มเติมเปิดคำถามคือไม่ว่าผมดีกว่านี้ก่อนวาระสุดท้ายตั้งใจจะแสดงผลหน้าจอที่ให้ WritableImage แล้วก็วาดกันผ้าใบสำหรับการแสดงเหตุผลแต่นั่นดูเหมือนจะปราบประเด็นของการใช้เป็นผ้าใบในตอนแรก...

ด้านล่างคือเป็นตัวอย่างซึ่งนั่นแสดงเป็นบางส่วนของความโปร่งแสงสีเป็นแรกที่ดึงดูดภาพแล้วเพื่อนคนงานและตรงไปยังผ้าใบกับ setColor(). ในความโปร่งแสงพื้นที่ภาพวาดระทึบนพื้นที่เป็น setColor นส่วนหนึ่ง. เราจะทำยังไง setColor()ต้องเคารพสีของอัลฟาความโปร่งแสงล่องสำหรับแต่ละพิกเซล?

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();
            }
        });
    }
}

Example output

canvas javafx
2021-11-23 17:44:37
1

คำตอบที่ดีที่สุด

4

คน GraphicsContext เริ่มต้นกับค่าปริยาย BlendModeและทั้งหมดของแบบฟอร์ม drawImage() ใช้ปัจจุบันโหมด. ในความเปรียบต่างของ, PixelWriter วิธีการของ แทนที่ ค่าของไม่สนใจ BlendMode.

ตัวอย่างด้านล่างให้คุณทดลองกับการรองรับ BlendMode คุณค่าที่จะเห็นผลกระทบ เป็นเกี่ยวข้องกันตัวอย่างแสดง อยู่ที่นี่,

image

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.ChoiceBox;
import javafx.scene.effect.BlendMode;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class TransparencyTest extends Application {

    private static final int S = 8;
    private static final int W = S * 36;
    private static final int H = W;
    private final Canvas canvas = new Canvas(W, H);
    private final GraphicsContext g = canvas.getGraphicsContext2D();
    private BlendMode mode = g.getGlobalBlendMode();

    @Override
    public void start(Stage stage) {
        render(mode);
        BorderPane root = new BorderPane(new Pane(canvas));
        ObservableList<BlendMode> modes
            = FXCollections.observableArrayList(BlendMode.values());
        ChoiceBox<BlendMode> cb = new ChoiceBox<>(modes);
        cb.setValue(mode);
        cb.valueProperty().addListener((o) -> {
            render(cb.getValue());
        });
        root.setBottom(cb);
        stage.setScene(new Scene(root));
        stage.show();
    }

    private void render(BlendMode mode) {
        drawBackground();
        g.setGlobalBlendMode(mode);
        Color color = Color.web("#7f00007f");
        int s = 24 * 8;
        WritableImage image = new WritableImage(s, s);
        for (int x = 0; x < s; x++) {
            for (int y = 0; y < s; y++) {
                image.getPixelWriter().setColor(x, y, color);
            }
        }
        s = 6 * 8;
        g.drawImage(image, s, s);
        for (int x = 0; x < s; x++) {
            for (int y = 0; y < s; y++) {
                g.getPixelWriter().setColor(x, y, color);
            }
        }
    }

    public void drawBackground() {
        g.setGlobalBlendMode(BlendMode.SRC_OVER);
        Color darkCol = Color.web("#333333");
        Color lightCol = Color.web("#cccccc");
        boolean dark = false;
        for (int x = 0; x < W; x += S) {
            dark = !dark;
            for (int y = 0; y < H; y += S) {
                dark = !dark;
                g.setFill(dark ? darkCol : lightCol);
                g.fillRect(x, y, S, S);
            }
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
2021-11-24 18:33:38

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่