【问题标题】:Java BufferedImage paddingJava BufferedImage 填充
【发布时间】:2010-07-19 22:50:40
【问题描述】:

有没有比在更大的 BufferedImage 上绘制像素更快的方法来实现像素到 BufferedImage 的填充?

【问题讨论】:

  • 填充只是为了显示目的还是您需要创建一个新的填充图像?
  • 这主要用于生成新的填充图像,而不仅仅是渲染它。

标签: java java-2d bufferedimage


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      为了延迟居中直到渲染,我喜欢这个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);
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-06
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-15
        • 2015-08-14
        • 2015-09-24
        相关资源
        最近更新 更多