gpt4 book ai didi

java - g.drawImage() 是否仅渲染 JPanel 上可见的图像部分,还是 "keep in mind"图像的其余部分?

转载 作者:行者123 更新时间:2023-12-04 04:57:53 26 4
gpt4 key购买 nike

假设我们有以下代码:

(在扩展 JPanel 的类中):

public void paintComponent(Graphics g) {
g.drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null);
}

dx1dy1为负或 dx2dy2大于 JPanel 的宽度(换句话说,图像的一部分将在屏幕外),是否 drawImage()调整渲染的内容,使其只“关注” JPanel 上可见的部分?我对此很好奇,因为如果我在 JPanel 上绘制一个非常大的图像, paintComponent()可能会变慢。

最佳答案

这里有两个方面的问题......

1.加载大图

您已经在代码示例中将大图像加载到内存中(您将其直接绘制到组件上)。这意味着如果你有一个非常大的图像 - 当你开始将它加载到内存中以绘制它时你会遇到第一个问题(实际上并不重要) - 它会消耗 很多满载时的内存。

当您使用大图像时,这应该是最令人头疼的问题,因为标准 Java 不提供很多工具。您只能使用基本工具加载完整图像。

您可能想要研究一些加载图像部分的替代方法(不确定它总是可能的)或将大图像分成几部分并仅加载显示的图像部分。像 JAI 这样的 3rd 方库可能会对此有所帮助。

无论如何,这就是所有的“歌词”——让我们来看看你问的第二个问题。

2. 在组件上绘制大图

我敢打赌,您已经阅读了一些 Swing 教程,并且您可能知道该剪辑。您可能还知道通常设置为组件的当前 可见 界限。是的,只有可见部分。

因此,如果您有类似 5000x5000 像素大小的面板,上面画有 5000x5000 像素的图像,但面板的可见部分仅为 500x500 像素 - 图像也将被底层图形剪裁,只有适合剪辑的部分才会被画。

这种优化也适用于各种形状的绘制/填充和其他图形操作。这不是一件显而易见的事情,但在大多数情况下,最好绘制完整的形状/图像并让底层图形优化绘制操作。在大多数情况下,这比手动剪辑形状/图像并绘制结果要快几倍。

还有一件事 - 在图形上绘制图像是 Graphics2D 中最快的操作之一,所以我不会真正关注它。

你可以查看这个小例子,它清楚地表明了 Graphics2D 内部实现提供的绘画优化:

public class ImageDrawTest
{
public static void main ( String[] args )
{
final ImageIcon icon = new ImageIcon ( "C:\\large.jpg" );

JComponent c = new JComponent ()
{
protected void paintComponent ( Graphics g )
{
super.paintComponent ( g );

long time = System.nanoTime ();
g.drawImage ( icon.getImage (), 0, 0, null );
time = System.nanoTime () - time;
System.out.println ( time );
}
};

JFrame f = new JFrame ();
f.getContentPane ().setLayout ( new BorderLayout () );
f.getContentPane ().add ( c );
f.setSize ( 200, 100 );
f.setLocationRelativeTo ( null );
f.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
f.setVisible ( true );
}
}

Instead of C:\\large.jpg use any available large image path.



只需运行此示例并调整框架大小即可更改组件的可见区域以查看输出。它将以纳秒为单位显示每次重新绘制的绘制时间 - 它会根据可见区域的大小而有很大差异。

关于java - g.drawImage() 是否仅渲染 JPanel 上可见的图像部分,还是 "keep in mind"图像的其余部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16534946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com