【问题标题】:Manually constructed BufferedImage doesn't draw onto JFrame手动构造的 BufferedImage 不会绘制到 JFrame
【发布时间】:2014-03-07 01:08:02
【问题描述】:

我正在尝试编写一些 Java 代码来将 BufferedImage 绘制到 JFrame 上。

BufferedImage 是使用构造函数创建的。图像未正确绘制到 JFrame 上。它应该是蓝色和绿色的棋子,但结果都是蓝色的。仅渲染第一个像素。如果我从文件中加载图像,它可以工作。

这是 Image 类:

public class Image {
    public int width;
    public int height;
    public Color[] pixels;
    public BufferedImage bufferedImage;
    public Image() {
        width = 2;
        height = 2;
        pixels = new Color[4];
        pixels[0] = new Color(0, 0, 255);
        pixels[1] = new Color(0, 255, 0);
        pixels[2] = new Color(0, 255, 0);
        pixels[3] = new Color(0, 0, 255);
        createBufferedImage();
    }

    private void createBufferedImage() {
        BufferedImage img;
        IndexColorModel colorModel;

        byte[] red = new byte[pixels.length];
        byte[] green = new byte[pixels.length];
        byte[] blue = new byte[pixels.length];
        byte[] alpha = new byte[pixels.length];

        for(int i = 0; i < pixels.length; i++) {
            red[i] = (byte) pixels[i].getRed();
            green[i] = (byte) pixels[i].getGreen();
            blue[i] = (byte) pixels[i].getBlue();
            alpha[i] = (byte) pixels[i].getAlpha();

            System.out.println("The image at pixel " + i + " has RGBA: " + red[i] + ", " + green[i] + ", " + blue[i] + ", " + alpha[i]);
        }

        colorModel = new IndexColorModel(3, pixels.length, red, green, blue);
        img = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_INDEXED, colorModel);

        bufferedImage = img;
    }

    public void printImageData() {
        String string;
        String[] strings;
        string = new String();
        strings = new String[width * height];
        ColorModel colorModel = bufferedImage.getColorModel();

        System.out.println(
                new String("Number of pixels: " + pixels.length + "; image width: " + width + "; image height: " + height + "."));

        for(int i = 0; i < strings.length; i++) {
            strings[i] = new String("pixel=" + i + ";r=" + colorModel.getRed(i) + ";b=" + colorModel.getBlue(i) + ";g=" + colorModel.getGreen(i) + ";;");
        }

        for(int i = 0; i < strings.length; i++) {
            string = string + strings[i];
        }
        System.out.println(string);
    }

}

主类和 ScreenPanel 类:

public class Main {


    public static JFrame frame;
    public static JPanel screenPanel;
    public static Image checkers;
    public static Dimension windowDimensions;
    public static int pixelSize;


    public static void main(String[] arg0) {
        windowDimensions = new Dimension(750, 630);
        pixelSize = 50;

        checkers = new Image();
        checkers.printImageData();

        screenPanel = new ScreenPanel();
        createWindow();

        while(true) {
            frame.repaint();
        }
    }

    private static void createWindow() {
        JLabel emptyLabel = new JLabel();

        frame = new JFrame("3D Game Library Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(0, 0, (int) windowDimensions.getWidth(), (int) windowDimensions.getHeight());
        frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);
        frame.add(screenPanel);
        frame.setSize(windowDimensions);
        frame.pack();
        frame.setVisible(true);
    }

    }


    class ScreenPanel extends JPanel {

    private static final long serialVersionUID = 978983962098385882L;

    public ScreenPanel() {

    }

    @Override
    public Dimension getPreferredSize() {
        return Main.windowDimensions;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.BLACK);

        g.drawImage(Main.checkers.bufferedImage, 0, 0, Main.checkers.width * Main.pixelSize, Main.checkers.height * Main.pixelSize, null);
    }
}

【问题讨论】:

  • 您已经创建了颜色模型,但没有为图像设置任何像素信息...
  • 顺便说一下,摆脱不断重绘框架的循环。这是不必要的,会导致响应问题。
  • @camickr 我有这个循环的原因是因为这只是在 Java 中玩耍,看看我可以多快在自己的代码中绘制图像。从未将它用于任何严重的事情。

标签: java swing jframe jpanel bufferedimage


【解决方案1】:

这是一个从 Array 创建纯色 BufferedImage 的示例:

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class ImageFromArray2 extends JFrame
{
    int width = 50;
    int height = 50;
    int imageSize = width * height * 3;

    public ImageFromArray2()
    {
        JPanel panel = new JPanel();
        getContentPane().add( panel );
        int[] pixels = new int[imageSize];

        //  Create Red Image

        for (int i = 0; i < imageSize; i += 3)
        {
            pixels[i] = 255;
            pixels[i+1] = 0;
            pixels[i+2] = 0;
        }

        panel.add( createImageLabel(pixels) );

        //  Create Green Image

        for (int i = 0; i < imageSize; i += 3)
        {
            pixels[i] = 0;
            pixels[i+1] = 255;
            pixels[i+2] = 0;
        }

        panel.add( createImageLabel(pixels) );

        //  Create Blue Image

        for (int i = 0; i < imageSize; i += 3)
        {
            pixels[i] = 0;
            pixels[i+1] = 0;
            pixels[i+2] = 255;
        }

        panel.add( createImageLabel(pixels) );

        //  Create Cyan Image

        for (int i = 0; i < imageSize; i += 3)
        {
            pixels[i] = 0;
            pixels[i+1] = 255;
            pixels[i+2] = 255;
        }

        panel.add( createImageLabel(pixels) );

    }

    private JLabel createImageLabel(int[] pixels)
    {
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        WritableRaster raster = image.getRaster();
        raster.setPixels(0, 0, width, height, pixels);
        JLabel label = new JLabel( new ImageIcon(image) );
        return label;
    }

    public static void main(String args[])
    {
        JFrame frame = new ImageFromArray2();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }
}

您应该能够修改它以在同一图像中创建具有四种颜色的图像。

【讨论】:

  • 我以为我最终会使用光栅,但我永远无法弄清楚。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-04-03
  • 2012-08-11
  • 1970-01-01
  • 2018-03-19
  • 2023-03-08
  • 2019-11-04
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多