代码之家  ›  专栏  ›  技术社区  ›  m0s

Java缓冲区图像填充

  •  3
  • m0s  · 技术社区  · 15 年前

    有没有比在更大的BufferedImage上画中心更快的方法来实现对BufferedImage的像素填充?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Mike    15 年前

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

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

    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(最后一个参数)。

    另一个更简单的方法是使用BuffereImage的getSubimage方法。

    BufferedImage fullImage = new BufferedImage(dataImageWidth, imageHeight);
    BufferedImage subImage = fullImage.getSubimage(0, 0, imageWidth, imageHeight);
    
        2
  •  2
  •   camickr    15 年前

        3
  •  1
  •   Community CDub    8 年前

    为了推迟到渲染中心,我喜欢这样 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);
    }