3

有没有比以更大的 BufferedImage 为中心绘制像素更快的方法来实现 BufferedImage 的像素填充?

4

3 回答 3

3

BufferedImage 有一个构造函数,您可以在其中指定一个 WriteableRaster。

选取默认缓冲图像,将每个像素存储在一个 int 中,它使用 IntegerInterleavedRaster。

您可以使用 ColorModel.getRGBDefault() 的 ColorModel。

int imageWidth = 638, imageHeight = 480;
int dataImageWidth = 640;

SampleModel sm = new SinglePixelPackedSampleModel(TYPE_INT, imageWidth, imageHeight, dataImageWidth, new int[] { 0xff0000, 0xff00, 0xff });
DataBuffer db = new DataBufferInt(dataImageWidth * imageHeight);
WritableRaster r = Raster.createWritableRaster(sm, db, new Point());
BufferedImage image = new BufferedImage(ColorModel.getRGBDefault(), r, false, null);

注意 SinglePixelPackedSampleModel 中的 scanlineStride(倒数第二个参数)。

另一种更简单的方法是使用 BufferedImage 的 getSubimage 方法。

BufferedImage fullImage = new BufferedImage(dataImageWidth, imageHeight);
BufferedImage subImage = fullImage.getSubimage(0, 0, imageWidth, imageHeight);
于 2010-07-20T02:58:29.093 回答
2

使用 BufferedImage 创建一个 ImageIcon 并将该图标添加到 JLabel。然后你可以在标签上添加一个边框来获得你想要的填充。

于 2010-07-20T01:55:00.883 回答
1

为了将居中推迟到渲染,我喜欢这种方法,因为finnw,其中this是一个合适的组件:

private BufferedImage image;
....
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
    g2d.translate(-image.getWidth() / 2, -image.getHeight() / 2);
    g2d.drawImage(image, 0, 0, null);
}
于 2010-07-20T00:42:13.073 回答