java水印蒙层

编程入门 行业动态 更新时间:2024-10-25 16:25:14

java<a href=https://www.elefans.com/category/jswz/34/1769835.html style=水印蒙层"/>

java水印蒙层

项目中有导出excel的功能,excel中包含图片,之前做的时候有些图片被蒙上了一层红色(当时发现内存大一点的图片会被蒙上红色,所以错误的以为这是图片大小的问题,想从压缩图片大小的方向上去解决)

最近项目准备上线了,这个问题又被抛出来了,经查阅资料发现,原来是在图片加载的时候出了问题 ,      之前的代码:                                                                                                                                                      // 读取本地图片,指定图片类型为jpg

public void setPicture(HSSFWorkbook wb, HSSFPatriarch patriarch, String pic, int iRowStart, int iColStart, int iRowStop, int iColStop) throws IOException {

// 判断文件是否存在

File imgFile = new File(pic);

if (imgFile.exists()) {

// 图片处理

ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

BufferedImage bufferImg = ImageIO.read(imgFile);

ImageIO.write(bufferImg, "jpg", byteArrayOut);

// 左,上(0-255),右(0-1023),下

HSSFClientAnchor anchor = new HSSFClientAnchor(20, 1, 1018, 0, (short) (iColStart), iRowStart, (short) (iColStop), iRowStop);

patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));

}

}

这是导出excel中,读取本地图片并指定图片格式为jpg的代码,后来查阅资料发现ImageIO.read(imgFile)方法读取图片时可能存在不正确处理图片ICC信息的问题,ICC为JPEG图片格式中的一种头部信息,导致渲染图片前景色时蒙上一层红色。

解决方案:

使用JDK中提供的Image src=Toolkit.getDefaultToolkit().getImage                                                       将BufferedImage bufferImg = ImageIO.read(imgFile);改为

Image src=Toolkit.getDefaultToolkit().getImage(imgFile.getPath());

BufferedImage bufferImg=BufferedImageBuilder.toBufferedImage(src);//我用的就是这方法,亲测可行,网上还有另一种方法

Image imageTookit = Toolkit.getDefaultToolkit().createImage(bytes);

BufferedImage cutImage = BufferedImageBuilder.toBufferedImage(imageTookit);

另附上BufferedImageBuilder源码(直接从网上copy的,感谢大神):

public class BufferedImageBuilder {

public 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) {

// The system does not have a screen

}

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;

}

}

至此,java处理图片时蒙上红色的问题已经解决!!!

更多推荐

java水印蒙层

本文发布于:2024-03-05 20:39:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1713359.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:水印   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!