正如本问题(Wrap image to Jframe)中所讨论的,我需要一个jframe来匹配提供的确切图像(图像本身最初是一个已经转换为图像的PDF)
提供的解决方案确实为我的图像尺寸构建了一个jframe,但我实际上无法看到所有图像。我需要能够调整jframe的大小,图像动态调整为新的jframe大小。如果失败了,我想如果我可以滚动jframe甚至放大或缩小,我至少可以到达我目前看不到的图像部分。
我需要这个的原因是,在我的代码中,我可以选择在图像上绘制一个Rectangle2D - 代码吐出坐标为java.awt.geom.Rectangle2D $ Float [x,y, W,H]。
然后,我将使用这些坐标使用Apache PDFbox中的PDFTextStripperbyArea类从原始PDF中提取区域。 PDFTextStripperbyArea将其输入作为Rectangle2D测量值。因此,图像和jframe必须始终具有相同的大小才能检索准确的坐标。
有人可以帮忙吗?
答案 0 :(得分:1)
要使用滚动窗格扭曲标签,您可以实施以下更改:
//frame.setLayout(new FlowLayout()); - comment out - use default (Borderlayout)
JLabel lbl= new JLabel();
lbl.setIcon(icon);
JScrollPane jsp = new JScrollPane(lbl); //warp the label with a scrollpane
//frame.add(lbl);
frame.add(jsp); //add scrollpane to frame instead of lbl
您可以找到更多信息here。
答案 1 :(得分:1)
从previous question继续,您的基本问题归结为两个问题。
坦率地说,这两个主题都有很多例子,你只需要将它们结合起来。你可以先看看:
以下是我在上一个问题中提到的ImagePanel
的修改,它将根据组件的大小缩放图像,同时保持宽高比。
public class ImagePane extends JPanel {
private BufferedImage img;
private Image scaled;
public ImagePane(BufferedImage img) {
this.img = img;
this.scaled = img;
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
Dimension size = getSize();
if (size.width > size.height) {
size.width = -1;
} else {
size.height = -1;
}
scaled = img.getScaledInstance(size.width, size.height, java.awt.Image.SCALE_SMOOTH);
}
});
}
@Override
public Dimension getPreferredSize() {
return scaled == null ? new Dimension(0, 0) : new Dimension(scaled.getWidth(this), scaled.getHeight(this));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (scaled != null) {
Graphics2D g2 = (Graphics2D) g.create();
g2.drawImage(scaled, 0, 0, this);
g2.dispose();
}
}
}
示例是为了简洁起见,Image#getScaledInstance
既不是最快的也不是产生最佳质量的结果。上面链接的前两个示例详细介绍了其他可能的解决方案。
您还需要计算和维护生成的缩放系数,这需要应用于任何其他绘制操作。
在这种情况下,我可能想要简单地计算缩放因子(而不是缩放图像)并使用AffineTransform
中的paintComponent
来应用它,但这一切都归结为需求