我正在使用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;
}
答案 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);