首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >画布在drawImage()之后为空白

画布在drawImage()之后为空白
EN

Stack Overflow用户
提问于 2016-11-10 02:49:29
回答 1查看 1.7K关注 0票数 1

我有一个绘图窗口,允许用户打开一个图像,在上面画画,然后保存它。

我把它放在画布上,我可以创建一个空白的画布,在上面画画,并且没有问题地保存它。但是当我试图打开这个图像时:

代码语言:javascript
复制
GraphicsContext gc = canvas.getGraphicsContext2D();
File file = new File(path);
Image img = new Image(file.toURI().toString());
gc.drawImage(img,0,0);

它做的事情和以前一样。我得到了一张空白的画布,那张照片从未出现过。

我在密码里做错什么了吗?我知道路径是正确的,因为我可以在程序的其他部分的缩略图中看到这个图像。

更新

下面是一个完整的示例程序

代码语言:javascript
复制
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class GUITest extends Application{
    
    String path = "10-9-2016-22-28.png";

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Pane root = new Pane();
        Canvas canvas = new Canvas(600,800);
        
        GraphicsContext gc = canvas.getGraphicsContext2D();
        Image original = new Image(getClass().getResourceAsStream(path));
        gc.drawImage(original, 0, 0);
        
        root.getChildren().add(canvas);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

在我做canvas.widthProperty().bind(root.widthProperty());canvas.heightProperty().bind(root.heightProperty());之前,它现在还在工作。绑定画布尺寸与其父维度有什么问题吗?

EN

Stack Overflow用户

回答已采纳

发布于 2016-11-10 19:22:38

执行第一次布局传递时,Pane的大小变为非0。在尺寸是(0, 0)之前。由于(0, 0)大小的画布中没有空间,所以所有内容都被删除了。稍后,当Canvas增长到根的大小时,您不会重新绘制图像,因此不会显示任何内容。

由于这个原因,每次调整Canvas大小时,您都需要再次绘制画布内容(或者至少直到大小变为非零)。

出于同样的原因,您需要在根元素中设置场景的首选大小,而不是通过设置Canvas大小。

代码语言:javascript
复制
@Override
public void start(Stage primaryStage) throws Exception {
    Pane root = new Pane();
    root.setPrefSize(600, 800);
    Canvas canvas = new Canvas();

    GraphicsContext gc = canvas.getGraphicsContext2D();
    Image original = new Image(getClass().getResourceAsStream(path));

    root.layoutBoundsProperty().addListener((observable, oldValue, newValue) -> {
        canvas.setWidth(newValue.getWidth());
        canvas.setHeight(newValue.getHeight());
        gc.drawImage(original, 0, 0);
    });

    root.getChildren().add(canvas);
    Scene scene = new Scene(root);
    primaryStage.setScene(scene);
    primaryStage.show();
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40519240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档