Graphics2D портит доступ к буферизованным пикселям изображения - PullRequest
0 голосов
/ 27 июня 2019

У меня вопрос по графике 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());
   }
}

это работает так, как ожидается, если я не изменю размер буферизованного изображения. Однако после изменения размера происходит нечто странное: если startx = 0 и starty = 0, то все работает нормально. но поскольку они оба приближаются к большим числам, размер произведенного квадрата уменьшается. Что касается моих экспериментов с грубой силой (вручную увеличивая startx, starty), я заметил, что квадрат слишком мал, чтобы замечать его при startx = 95, starty = 95.

Я отображаю изображение, добавляя его в jlabel, который добавляется в панель содержимого jframe. с этой строкой:

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

вот реализация resize (изображение):

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

Поэтому я знаю, что это происходит из-за использования изменения размера. Может более опытный программист, пожалуйста, объясните мне, что происходит.

Спасибо!

...