有个需求是将gif格式验证码转为静态的图片,然后调用第三方识别出验证码。第三方也有识别gif图的接口 但是耗时长且准确率比较低。
所以需要先转为完全显示的静态图片,给第三方去识别。
Stirng imagePath = "j:/test.gif";
InputStream inStream = new FileInputStream(imagePath);
ImageReaderSpi readerSpi = new GIFImageReaderSpi();
GIFImageReader gifReader = (GIFImageReader) readerSpi.createReaderInstance();
//这个地方需要把InputStream转一下ImageInputStream
gifReader.setInput(ImageIO.createImageInputStream(inStream));
//获取总帧数
int num = gifReader.getNumImages(true);
log.info("gif帧数:"+num);
File newfile = new File("j:/hello.jpg");
ImageWriterSpi writerSpi = new GIFImageWriterSpi();
GIFImageWriter writer = (GIFImageWriter) writerSpi.createWriterInstance();
ImageOutputStream out = new FileImageOutputStream(newfile);
writer.setOutput(out);
// 读取最后一帧的图片 也就是gif显示完全的那一帧
BufferedImage read = gifReader.read(num-1);
writer.write(read);
//也可以转为64编码格式返回 根据需要
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, formatName, os);
return Base64.getEncoder().encodeToString(os.toByteArray());