1

我正在使用 Jtree 作为图像列表并显示所选图像,但问题是如果图像尺寸大于画布尺寸(即 300 X 300),它仅显示图像的左上角,如何以固定方式显示整个图像尺寸画布?

我正在使用以下代码:

private void displayImage(File file) {

    try 
    {
        BufferedImage image = ImageIO.read(file);
        ta.Picture = image;
    }
    catch (Exception e) 
    {}

    Graphics g = ta.imageCanvas.getGraphics();
    g.clearRect(0, 0, 300, 300);
    g.drawImage(ta.Picture, 00, 00, this);

} // displayImage

public void valueChanged(TreeSelectionEvent e) 
{
    // TODO Auto-generated method stub
    FileTreeNode node = (FileTreeNode) tree.getLastSelectedPathComponent();

    if (node.isLeaf()) 
    {

        currentFile = node.file;

        File ff = new File("F:/images_blue/" + currentFile.getName());
        displayImage(ff);

    } else
        currentFile = null;

}
4

2 回答 2

2

我只想指出...

Graphics g = ta.imageCanvas.getGraphics();
g.clearRect(0, 0, 300, 300);
g.drawImage(ta.Picture, 00, 00, this);

真是个坏主意。

getGraphics可能会返回null,并且充其量只是上一个重绘周期的快照,并且可能在下一个重绘周期被无效或取消引用。

您应该从类似的东西扩展JPanel并覆盖该paintComponent方法。这将允许您提供 getter 和 setter 作为图像管理的一部分,并允许您以自包含和可重用的方式生成缩放图像

您可以查看执行自定义绘画以获取信息

而且,根据我的评论,您可能想查看这些先前的问题以获取示例

于 2013-01-29T07:37:46.427 回答
1

你可以像这样缩放 BufferedImage ..

BufferedImage before = getBufferedImage(encoded);
int w = before.getWidth();
int h = before.getHeight();
BufferedImage after = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
AffineTransform at = new AffineTransform();
at.scale(2.0, 2.0);
AffineTransformOp scaleOp = 
   new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
after = scaleOp.filter(before, after);

我在这里找到了片段

于 2013-01-29T07:14:19.697 回答