ड्राइंग के साथ पारदर्शिता पर 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ý
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में