Java BufferedImage 填充

发布于 2024-09-10 12:32:25 字数 66 浏览 2 评论 0原文

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

Is there any faster way to achieve padding of pixels to a BufferedImage than drawing it centered on larger BufferedImage?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

看轻我的陪伴 2024-09-17 12:32:25

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 has a constructor where you get to specify a WriteableRaster.

Picking at the a default buffered image, storing each pixel in an int, it uses an IntegerInterleavedRaster.

The ColorModel you can use ColorModel.getRGBDefault().

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);

Notice the scanlineStride in SinglePixelPackedSampleModel (second last parameter).

Another much simpler approach is to use BufferedImage's getSubimage method.

BufferedImage fullImage = new BufferedImage(dataImageWidth, imageHeight);
BufferedImage subImage = fullImage.getSubimage(0, 0, imageWidth, imageHeight);
一百个冬季 2024-09-17 12:32:25

使用 BufferedImage 创建 ImageIcon 并将该图标添加到 JLabel。然后,您只需向标签添加边框即可获得所需的填充。

Create an ImageIcon using the BufferedImage and add the Icon to a JLabel. Then you can just add a Border to the label to get your desired padding.

习ぎ惯性依靠 2024-09-17 12:32:25

为了推迟居中直到渲染,我喜欢这种方法,因为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);
}

To defer centering until rendering, I like this approach due to finnw, where this is a suitable component:

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文