如何在固定尺寸的画布上显示整个图像?

时间:2013-01-29 07:07:17

标签: java swing applet

我正在使用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;

}

2 个答案:

答案 0 :(得分: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作为图像管理的一部分,并允许您以自包含和可重复使用的方式生成缩放图像

您可以查看Perfoming Custom Painting了解我的信息

而且,根据我的评论,您可能希望查看以前的问题以获取示例

答案 1 :(得分: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);

I found the snippet here