use*_*048 5 java arrays bufferedimage
我有一些数据是从与我的图像文件对应的文本文件中加载的.此数据现在是2D数组.我想要显示这张图片.显然,图像显示的格式为bufferedimage.但我的只是简单的2D双格式.如何调整图像的大小,意味着使图像变大两倍(当然需要插值)
换句话说,我们怎样才能在java中实现"imshow"和"imresize"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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您对在生成的输出图像中调整大小和插值感到满意,那么您可以通过简单地缩放图形上下文并在其上启用插值渲染提示来实现它,如上面的示例在显示/渲染图像时所示。(当然,这也可以以类似的方式直接在 BufferedImage 中完成。