我有一些数据是从对应于我的图像文件的文本文件中加载的。这些数据现在在2D数组中。我想展示这张图片。显然该图像显示为格式bufferedimage。但我的只是简单的2D双格式。 也有可能调整图像的大小,意思是使它变大两倍(当然需要插值)从java中的二维数组数据显示图像
换句话说,我们该如何做到“imshow”和“imresize”在Java中平等的Matlab?
我有一些数据是从对应于我的图像文件的文本文件中加载的。这些数据现在在2D数组中。我想展示这张图片。显然该图像显示为格式bufferedimage。但我的只是简单的2D双格式。 也有可能调整图像的大小,意思是使它变大两倍(当然需要插值)从java中的二维数组数据显示图像
换句话说,我们该如何做到“imshow”和“imresize”在Java中平等的Matlab?
没有简单的方法在基于数组的强度矩阵之间转换为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中以类似的方式完成)
看看MemoryImageSource。它可能不是你想要的(因为Java倾向于使用int/byte作为图像数据),但是它至少会送你沿着正确的路线
澄清越来越张贴一些代码 –
这里是我想将其更改到Java的Matlab代码:。 A = IMPORTDATA('d:\ manuch \ file.dat'); b = A.data'; image_arr =零(9 * 2 * 32,6 * 4); %img_arr =零(576,24); arr_index = 1; 为(模块= 0:32-1) 为(block_row = 0:4-1) 为(block_col = 0:2-1) 为(xtal_row = 0:6-1) \t为(xtal_col = 0:9-1) \t \t x = 2 * 9 * module + 9 * block_col + xtal_col + 1; \t y = 6 * block_row + xtal_row + 1; \t img_arr(x,y)= b(arr_index); \t arr_index = arr_index + 1; end end end end end – user1016048
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') – user1016048