【发布时间】:2010-07-19 22:50:40
【问题描述】:
有没有比在更大的 BufferedImage 上绘制像素更快的方法来实现像素到 BufferedImage 的填充?
【问题讨论】:
-
填充只是为了显示目的还是您需要创建一个新的填充图像?
-
这主要用于生成新的填充图像,而不仅仅是渲染它。
标签: java java-2d bufferedimage
有没有比在更大的 BufferedImage 上绘制像素更快的方法来实现像素到 BufferedImage 的填充?
【问题讨论】:
标签: java java-2d bufferedimage
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);
【讨论】:
使用 BufferedImage 创建一个 ImageIcon 并将该图标添加到 JLabel。然后你可以在标签上添加一个边框来获得你想要的填充。
【讨论】:
为了延迟居中直到渲染,我喜欢这个approach,因为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);
}
【讨论】: