Graphics2D搞乱了访问缓冲图像像素

时间:2019-06-27 05:29:13

标签: java bufferedimage graphics2d

我对2d图形有疑问。我目前正在使用它来调整缓冲图像的大小。我也有一种方法可以在图像上创建一个黄色的100x100正方形,如下所示:

BufferedImage image = ImageIO.read("filepath");
int startx = 0, starty = 0;
for (int r = 0; r < 100; r++) {
   for (int c = 0; c < 100; c++) {
       image.setRGB(startx + c, starty + r, Color.YELLOW.getRGB());
   }
}

这可以正常工作,如果我不调整bufferedimage的大小。但是,调整大小后,会发生一些奇怪的事情:如果startx = 0,而starty = 0,则它可以正常工作。但是随着它们都接近更大的数量,所产生的正方形的尺寸会缩小。就我的蛮力实验(手动增加startx,starty)而言,我已经注意到平方太小,无法在startx = 95,starty = 95时注意到。

我通过将图像添加到添加到jframe内容面板的jlabel中来显示图像。与此行:

frame.getContentPane().add(new JLabel(new ImageIcon(resize(image, width, height))));

这是resize(image)的实现:

private BufferedImage resize(BufferedImage img, int newW, int newH) {
        Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
        BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

        Graphics2D g2d = dimg.createGraphics();
        g2d.drawImage(tmp, 0, 0, null);
        g2d.dispose();

        return dimg;
    }

(我将此实现从互联网上的某个地方撤出,我不记得确切的位置,很可能是这个站点)

如果我用这条线将图像添加到框架中,则不会观察到效果:

frame.getContentPane().add(new JLabel(new ImageIcon(image)));

因此,我知道这是由于调整大小用法而发生的。有经验的程序员能否请我解释一下发生了什么。

谢谢!

0 个答案:

没有答案