在java中显示来自2D数组数据的图像

时间:2011-10-27 08:01:30

标签: java arrays bufferedimage

我有一些数据是从与我的图像文件对应的文本文件中加载的。此数据现在是2D数组。我想要显示这张图片。显然,图像显示的格式为bufferedimage。但我的只是简单的2D双格式。 如何调整图像大小,意味着使图像变大两倍(当然需要插值)

换句话说,我们怎样才能在java中实现“imshow”和“imresize”Matlab等价?

2 个答案:

答案 0 :(得分:3)

没有简单的方法可以在基于数组的强度矩阵和Java中的可渲染图像之间进行转换,至少不是我所知道的。也没有任何简单的单行方法在屏幕上显示图像等。

然而,在这种情况下,BufferedImage是可行的解决方案是正确的。您需要做的是创建所需大小的BufferedImage,然后遍历2D强度矩阵并填充结果图像中的颜色。

获得BufferedImage形式的数据后,您可以直接使用它进行渲染。例如,您可以创建一个带有自定义JPanel组件的JFrame来显示图像。下面的示例代码说明了该过程:(请注意,这假设您在2D数组中的图像数据被缩放以适应区间[0,1]。如果不是则则必须在填充之前重新缩放在BufferedImage中。)

public class ImageTest {

    private static final int HEIGHT = 250;
    private static final int WIDTH = 250;

    public static void main(String[] args) {
        double[][] data = new double[WIDTH][HEIGHT];
        Random r = new Random();
        for(int i = 0; i < WIDTH; i++) {
            for(int j = 0; j < HEIGHT; j++) {
                data[i][j] = r.nextDouble();
            }
        }

        final BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = (Graphics2D)img.getGraphics();
        for(int i = 0; i < WIDTH; i++) {
            for(int j = 0; j < HEIGHT; j++) {
                float c = (float) data[i][j];
                g.setColor(new Color(c, c, c));
                g.fillRect(i, j, 1, 1);
                data[i][j] = r.nextDouble();
            }
        }

        JFrame frame = new JFrame("Image test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                Graphics2D g2d = (Graphics2D)g;
                g2d.clearRect(0, 0, getWidth(), getHeight());
                g2d.setRenderingHint(
                        RenderingHints.KEY_INTERPOLATION,
                        RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                        // Or _BICUBIC
                g2d.scale(2, 2);
                g2d.drawImage(img, 0, 0, this);
            }
        };
        panel.setPreferredSize(new Dimension(WIDTH*2, HEIGHT*2));
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

如果您对在生成的输出图像中调整大小和插值感到满意,那么您可以通过简单地缩放图形上下文并在其上启用插值渲染提示来实现它,如上例中显示/渲染图像时所示。 (这当然可以直接在BufferedImage中以类似的方式完成。

答案 1 :(得分:1)

看看MemoryImageSource。它可能不会完全符合您的要求(因为Java倾向于使用int / byte作为图像数据),但它至少会向您发送正确的路径。

http://www.javaworld.com/javatips/jw-javatip16.html