ImageIO读取图片出现一层红色背景解决方案
问题展示:
在excel中插入图片,图片上像是铺了一层红色薄膜一样,效果如下图!
代码如下:
/**
*
* @param workbook
* @param sheet sheet对象
* @param file 文件
* @param row 起始行
* @param col 起始列
* @param rows 结束行
* @param cols 结束列
* @version
*/
public static void picture3(XSSFWorkbook workbook, XSSFSheet sheet, File file, int row, int col, int rows, int cols){
XSSFDrawing patriarch = sheet.createDrawingPatriarch();
BufferedImage bufferImg;
try {
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
//ImageIO.read()读取图片会出现一层红色的背景
bufferImg = ImageIO.read(new FileInputStream(file));
ImageIO.write(bufferImg, "JPEG", byteArrayOut);
bufferImg.flush();
byteArrayOut.flush();
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0,( short ) col, row, ( short ) cols, rows);
patriarch.createPicture(anchor, workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
byteArrayOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
解决方案:
用如下代码替换 bufferImg = ImageIO.read(new FileInputStream(file));
// 处理读取图片出现一层红色的背景
ImageIcon src = new ImageIcon(file.getAbsolutePath());
bufferImg = new BufferedImage(src.getIconWidth(),
src.getIconHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = bufferImg.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, src.getIconWidth(), src.getIconHeight());
g.drawImage(src.getImage(), 0, 0, null);
g.dispose();
完整代码:
/**
*
* @param workbook
* @param sheet sheet对象
* @param file 文件
* @param row 起始行
* @param col 起始列
* @param rows 结束行
* @param cols 结束列
* @version
*/
public static void picture3(XSSFWorkbook workbook, XSSFSheet sheet, File file, int row, int col, int rows, int cols){
XSSFDrawing patriarch = sheet.createDrawingPatriarch();
BufferedImage bufferImg;
try {
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
//ImageIO.read()读取图片会出现一层红色的背景
// bufferImg = ImageIO.read(new FileInputStream(file));
/*处理读取图片出现一层红色的背景-开始*/
ImageIcon src = new ImageIcon(file.getAbsolutePath());
bufferImg = new BufferedImage(src.getIconWidth(),
src.getIconHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = bufferImg.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, src.getIconWidth(), src.getIconHeight());
g.drawImage(src.getImage(), 0, 0, null);
g.dispose();
/*处理读取图片出现一层红色的背景-结束*/
ImageIO.write(bufferImg, "JPEG", byteArrayOut);
bufferImg.flush();
byteArrayOut.flush();
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0,( short ) col, row, ( short ) cols, rows);
patriarch.createPicture(anchor, workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
byteArrayOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
效果如下: