为便于比对OpenCV处理前后图片效果,需要将原始图片、处理后的图片、OpenCV矩阵图像显示出来。
借鉴于网上的资料,在此处给出满足上述需求的工具类。
支持:拖拽自适应图片大小,通过文件路径、Mat、Image显示图片
备注:如果不需要显示OpenCV功能,直接删除该部分代码即可
参考资料:
https://stackoverflow.com/questions/13871307/jframe-not-showing-a-picture
https://www.cnblogs.com/superbool/p/5331196.html
OpenCV依赖(版本可以不一样):
<dependency>
<groupId>org.opencv</groupId>
<artifactId>opencv</artifactId>
<version>3.3.0</version>
</dependency>
工具类:
import org.opencv.core.Mat;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
/**
* 图片显示器
* @author stonelu
* @date 2019-04-30 17:20
*/
public class ImageForm {
/**
* 显示OpenCV矩阵图像
* @param imageMat
* @param size
*/
public static void showImage(Mat imageMat, Dimension size) {
showImage(mat2BufferedImage(imageMat), size);
}
/**
* 显示指定文件路径图片
* @param imagePath
* @param size
*/
public static void showImage(String imagePath, Dimension size) {
showImage(new ImageIcon(imagePath).getImage(), size);
}
/**
* 显示Image图片元素
* @param image
* @param size
*/
public static void showImage(Image image, Dimension size) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setSize(size);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new PaintPanel(image, size));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
/**
* 将OpenCV的Mat转换为Image
* @param matrix
* @return
*/
private static Image mat2BufferedImage(Mat matrix) {
int type = BufferedImage.TYPE_BYTE_GRAY;
if (matrix.channels() > 1) {
type = BufferedImage.TYPE_3BYTE_BGR;
}
int bufferSize = matrix.channels() * matrix.cols() * matrix.rows();
byte[] buffer = new byte[bufferSize];
matrix.get(0, 0, buffer); // 获取所有的像素点
BufferedImage image = new BufferedImage(matrix.cols(), matrix.rows(), type);
final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
System.arraycopy(buffer, 0, targetPixels, 0, buffer.length);
return image;
}
/**
* 图片容器
*/
private static class PaintPanel extends JPanel {
private ImageIcon imageIcon;
private Dimension size;
public PaintPanel(Image image, Dimension size) {
imageIcon = new ImageIcon(image);
this.size = size;
}
@Override
public Dimension getPreferredSize() {
// 初识大小
return size;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 图片大小自适应,可拖拽
g.drawImage(this.imageIcon.getImage(), 0, 0, this.getWidth(), this.getHeight(), imageIcon.getImageObserver());
}
}
}