如何从非方形图像文件创建非方形 BufferedImage?
How can I create a non-square BufferedImage from a non-square image file?
我正在尝试从任意图像文件创建 BufferedImage,然后将该图像置于 JPanel 背景的中心。我对方形图像没有任何问题,但我不知道如何处理非方形图像。
一些调试表明(直接的)问题是当我使用 ImageIO 从矩形输入文件创建 BufferedImage 时,比如 256x128,BufferedImage.getHeight() returns 256 而不是128.
这是一个近似于我的代码的片段:
class ExtendedPanel extends JPanel {
static final int WIDTH = 400;
static final int HEIGHT = 400;
BufferedImage image;
public ExtendedPanel(File f) {
super();
setPreferredSize(new Dimension(WIDTH,HEIGHT));
image = ImageIO.read(f);
}
@Override
public void paintComponent(Graphics g) {
int x = (WIDTH - image.getWidth())/2;
int y = (HEIGHT - image.getHeight())/2;
Graphics2D g2d = (Graphics2d)g;
g2d.drawRenderedImage(image,AffineTransform.getTranslateInstance(x,y));
}
}
正如我所说,这对于方形图像文件来说很好。但是对于宽度大于高度的矩形图像,图像显示得比应有的高度高。我还没有尝试过使用比宽度高的图像,但我担心在这种情况下图像会显示得太靠左。我能做什么?
更多的是(理解)正确计算的问题
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2d)g;
// How to scale the image:
double xscale = ((double)WIDTH) / image.getWidth();
double yscale = ((double)HEIGHT) / image.getHeight());
// When scaling proportionally:
double scale = Math.min(xscale, yscale); // max for covering entire panel.
xscale = scale;
yscale = scale;
double w = scalex * image.getWidth();
double h = scaley * image.getHeight();
double x = (getWidth() - w) / 2;
double y = (getHeight() - h) / 2;
g.drawImage(img, (int)x, (int)y, (int)w, (int)h, Color.BLACK, null);
//g2d.translate(x, y);
//g2d.scale(xscale, yscale);
//g2d.draw...;
}
使用 drawImage
的简单(缩放)版本完全清楚需要什么。
要考虑的是按比例缩放、完全填充(图像部分丢失)或达到最大尺寸(看到背景)。
我正在尝试从任意图像文件创建 BufferedImage,然后将该图像置于 JPanel 背景的中心。我对方形图像没有任何问题,但我不知道如何处理非方形图像。
一些调试表明(直接的)问题是当我使用 ImageIO 从矩形输入文件创建 BufferedImage 时,比如 256x128,BufferedImage.getHeight() returns 256 而不是128.
这是一个近似于我的代码的片段:
class ExtendedPanel extends JPanel {
static final int WIDTH = 400;
static final int HEIGHT = 400;
BufferedImage image;
public ExtendedPanel(File f) {
super();
setPreferredSize(new Dimension(WIDTH,HEIGHT));
image = ImageIO.read(f);
}
@Override
public void paintComponent(Graphics g) {
int x = (WIDTH - image.getWidth())/2;
int y = (HEIGHT - image.getHeight())/2;
Graphics2D g2d = (Graphics2d)g;
g2d.drawRenderedImage(image,AffineTransform.getTranslateInstance(x,y));
}
}
正如我所说,这对于方形图像文件来说很好。但是对于宽度大于高度的矩形图像,图像显示得比应有的高度高。我还没有尝试过使用比宽度高的图像,但我担心在这种情况下图像会显示得太靠左。我能做什么?
更多的是(理解)正确计算的问题
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2d)g;
// How to scale the image:
double xscale = ((double)WIDTH) / image.getWidth();
double yscale = ((double)HEIGHT) / image.getHeight());
// When scaling proportionally:
double scale = Math.min(xscale, yscale); // max for covering entire panel.
xscale = scale;
yscale = scale;
double w = scalex * image.getWidth();
double h = scaley * image.getHeight();
double x = (getWidth() - w) / 2;
double y = (getHeight() - h) / 2;
g.drawImage(img, (int)x, (int)y, (int)w, (int)h, Color.BLACK, null);
//g2d.translate(x, y);
//g2d.scale(xscale, yscale);
//g2d.draw...;
}
使用 drawImage
的简单(缩放)版本完全清楚需要什么。
要考虑的是按比例缩放、完全填充(图像部分丢失)或达到最大尺寸(看到背景)。