问题描述:excel导出图片使用ImageIO.read()加载部分图片会蒙上一层红色(应该是png格式手动
改为jpg的图片),所以换成了Toolkit.getDefaultToolkit().getImage()方法,但会导致特殊格式如webp图片无法加载,请问如何解决?
借鉴自:
https://zhidao.baidu.com/question/410085233.html
//写入图片
private static void writeImg(Workbook workbook, Sheet sheet, Row currentRow, String imgPath, int currentColumnIndex, XSSFDrawing drawing) {
try {
logger.info("========Excel写入图片 ,开始。========");
URL url = new URL(imgPath);
// BufferedImage image = ImageIO.read(url);
Image img = Toolkit.getDefaultToolkit().getImage(url);
BufferedImage image = toBufferedImage(img);
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
ImageIO.write(image, imgPath.substring(imgPath.lastIndexOf(".") + 1), byteArrayOut);
//判断图片后缀
int addPicture;
String hz = imgPath.substring(imgPath.lastIndexOf(".") + 1);
if("jpg".equals(hz)){
addPicture = workbook.addPicture(byteArrayOut.toByteArray(), workbook.PICTURE_TYPE_JPEG);
} else {
addPicture = workbook.addPicture(byteArrayOut.toByteArray(), workbook.PICTURE_TYPE_PNG);
}
// ClientAnchor anchor = drawing.createAnchor( 50, 50, 50, 50, currentColumnIndex, currentRow.getRowNum(), currentColumnIndex + 1, currentRow.getRowNum() + 1);
//图片位置
XSSFClientAnchor anchor = new XSSFClientAnchor(100, 100, 100, 100, currentColumnIndex, currentRow.getRowNum(), currentColumnIndex + 1,currentRow.getRowNum() + 1);
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
drawing.createPicture(anchor, addPicture);
logger.info("========Excel写入图片 ,结束。========");
} catch (Exception e) {
e.printStackTrace();
}
}
private static BufferedImage toBufferedImage(Image image) {
if (image instanceof BufferedImage) {
return (BufferedImage) image;
}
// This code ensures that all the pixels in the image are loaded
image = new ImageIcon(image).getImage();
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try {
int transparency = Transparency.OPAQUE;
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
} catch (HeadlessException e) {
//此处会抛异常,但代码功能正常
}
if (bimage == null) {
// Create a buffered image using the default color model
int type = BufferedImage.TYPE_INT_RGB;
bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
}
// Copy image to buffered image
Graphics g = bimage.createGraphics();
// Paint the image onto the buffered image
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
图片红色详图: