【问题标题】:Display image from 2D array data in java在java中显示二维数组数据的图像
【发布时间】:2012-11-29 18:08:44
【问题描述】:

我有一些从与我的图像文件对应的文本文件中加载的数据。该数据现在位于二维数组中。我想展示这张图片。显然图像显示格式为缓冲图像。但我的只是简单的二维双格式。 还有如何调整图像大小,这意味着将其放大两倍(当然需要在两者之间进行插值)

换句话说,我们如何在 java 中做“imshow”和“imresize”Matlab 等效?

【问题讨论】:

  • 澄清更多并发布一些代码。
  • 这是我想将其更改为 java 的 Matlab 代码: A = importdata('D:\manuch\file.dat'); b=A.数据'; image_arr=zeros(9*2*32,6*4); %img_arr=零(576,24); arr_index=1; for (module = 0:32-1) for (block_row = 0:4-1) for(block_col = 0:2-1) for (xtal_row = 0:6-1) for (xtal_col = 0:9-1) x = 2*9 * 模块 + 9 * block_col + xtal_col+1; y = 6 * block_row + xtal_row+1; img_arr(x,y) = b(arr_index); arr_index = arr_index + 1;结束结束结束结束结束
  • minlocal=min(min(img_arr)); maxlocal=max(max(img_arr)); img_arr2=(img_arr-minlocal)/(maxlocal-minlocal); img_arr4=imresize (img_arr2, [2*576,2*24]); imshow(img_arr4')
  • 请将代码编辑到问题中并使用代码格式使其可读。

标签: java arrays bufferedimage


【解决方案1】:

在基于数组的强度矩阵之间转换为 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 中以类似的方式完成。

【讨论】:

    【解决方案2】:

    看看MemoryImageSource。它可能不会完全符合您的要求(因为 Java 倾向于将 int / byte 用于图像数据),但它至少会引导您走上正确的道路。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2021-07-06
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      相关资源
      最近更新 更多