1.环境配置参考上篇文章https://blog.csdn.net/qq_30374237/article/details/119793446
2.将base64图片码转化为Mat
/**
* @Author bjiang
* @Description //TODO 将base64图片码转化为Mat
* @Date 15:01 2021/8/16
* @Version 1.0
* @Param [base64]
* @return org.opencv.core.Mat
*/
private Mat base64ToBufferedImage(String base64) {
String[] baseStrs = base64.split(",");
BASE64Decoder decoder = new sun.misc.BASE64Decoder();
try {
byte[] bytes1 = decoder.decodeBuffer(baseStrs[1]);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
BufferedImage bufferedImage= ImageIO.read(bais);
return bufImg2Mat(bufferedImage,BufferedImage.TYPE_3BYTE_BGR, Imgproc.THRESH_BINARY);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
2.BufferedImage转换成Mat
/**
* BufferedImage转换成Mat
*
* @param original 要转换的BufferedImage
* @param imgType bufferedImage的类型 如 BufferedImage.TYPE_3BYTE_BGR
* @param matType 转换成mat的type 如 CvType.CV_8UC3
*/
public static Mat bufImg2Mat(BufferedImage original, int imgType, int matType) {
if (original == null) {
throw new IllegalArgumentException("original == null");
}
if (original.getType() != imgType) {
BufferedImage image = new BufferedImage(original.getWidth(), original.getHeight(), imgType);
Graphics2D g = image.createGraphics();
try {
g.setComposite(AlphaComposite.Src);
g.drawImage(original, 0, 0, null);
original = image;
}catch (Exception e){
e.printStackTrace();
}finally {
g.dispose();
}
}
byte[] pixels = ((DataBufferByte) original.getRaster().getDataBuffer()).getData();
try {
Mat mat = Mat.eye(original.getHeight(), original.getWidth(), matType);
mat.put(0, 0, pixels);
return mat;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
3.对buffimage进行操作
public WritableImage loadAndConvert(String base64Pic) throws Exception {
Mat src=base64ToBufferedImage(base64Pic);
Mat dst = new Mat();
Imgproc.threshold(src, dst, 200, 500, Imgproc.THRESH_BINARY);
byte[] data1 = new byte[dst.rows() * dst.cols() * (int)(dst.elemSize())];
dst.get(0, 0, data1);
BufferedImage bufImage = new BufferedImage(dst.cols(),dst.rows(),
BufferedImage.TYPE_BYTE_GRAY);
bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data1);
WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
return writableImage;
}
4.生成二值化图片
File uploadFile = new File(uploadTemp+fileName);//备份目录
ImageIO.write(SwingFXUtils.fromFXImage(writableImage, null), "png", uploadFile);