# 创建和绘制图像

> 原文： [https://docs.oracle.com/javase/tutorial/https://docs.oracle.com/javase/tutorial/images/drawonimage.html](https://docs.oracle.com/javase/tutorial/https://docs.oracle.com/javase/tutorial/images/drawonimage.html)

我们已经知道如何加载现有图像，该图像是在系统或任何网络位置创建和存储的。但是，您可能还希望将新图像创建为像素数据缓冲区。

在这种情况下，您可以使用此类的三个构造函数手动创建`BufferedImage`对象：

*   new BufferedImage（width，height，type） - 构造一个预定义图像类型的`BufferedImage`。
*   new BufferedImage（width，height，type，colorModel） - 构造一个预定义图像类型的`BufferedImage`：`TYPE_BYTE_BINARY`或`TYPE_BYTE_INDEXED`。
*   `new BufferedImage(colorModel, raster, premultiplied, properties)` - 使用指定的`ColorModel`和`Raster`构造新的`BufferedImage`。

另一方面，我们可以使用`Component`类的方法。这些方法可以分析给定`Component`或`GraphicsConfiguration`的显示分辨率，并创建适当类型的图像。

*   `Component.createImage(width, height)`
*   `GraphicsConfiguration.createCompatibleImage(width, height)`
*   `GraphicsConfiguration.createCompatibleImage(width, height, transparency)`

GraphicsConfiguration 返回 BufferedImage 类型的对象，但是 Component 返回`Image type`的对象，如果你需要一个 BufferedImage 对象，那么你可以在代码中执行`instanceof`并转换为`BufferedImage`。

正如前面课程中已经提到的，我们不仅可以在屏幕上渲染图像。图像本身可以被视为绘图表面。为此，您可以使用`BufferedImage`类的`createGraphics()`方法：

```
...

BufferedImage off_Image =
  new BufferedImage(100, 50,
                    BufferedImage.TYPE_INT_ARGB);

Graphics2D g2 = off_Image.createGraphics();

```

屏幕外图像的另一个有趣用途是自动 _ 双缓冲 _。此功能允许通过将图像绘制到后台缓冲区然后将该缓冲区复制到屏幕而不是直接绘制到屏幕来避免动画图像中的闪烁。

Java 2D 还允许访问屏幕外图像的硬件加速，这可以提供更好的渲染和从这些图像复制的性能。您可以使用`Image`类的以下方法获得此功能的好处：

*   `getCapabilities`方法允许您确定图像当前是否加速。
*   `setAccelerationPriority`方法可让您设置有关图像加速度的重要性的提示。
*   `getAccelerationPriority`方法获得有关加速度重要性的提示。