java 读取图片显示红色

Java使用ImageIo.read()方法从Word文档中读取图片时,可能出现图片显示红色的问题,原因是该方法可能不正确处理图片的ICC信息。解决方法是替换为 Toolkit.getDefaultToolkit().getImage。此外,还有在Linux上安装额外软件的解决方案,但因繁琐未采纳。


原图片正常,图片转成二进制字符串放入word文档中部分图片就显示不正常了,查询资料后发现,是因为使用java自带的工具类 ImageIo.read() 方法的问题,经过查阅得知ImageIo.read()方法读取图片时可能存在不正确处理图片ICC信息的问题,ICC为JPEG图片格式中的一种头部信息,导致渲染图片前景色时蒙上一层红色。

解决方法:

替换 ImageIo.read 方法

使用java 另一个工具类 Toolkit.getDefaultToolkit().getImage

Image src=Toolkit.getDefaultToolkit().getImage(file.getPath());  
BufferedImage image=BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage 

或者

Image imageTookit = Toolkit.getDefaultToolkit().createImage(bytes);  
BufferedImage cutImage = BufferedImageBuilder.toBufferedImage(imageTookit);  
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;  
    }  
经测试后发现图片显示正常了

感谢这个博主的文章:点击打开链接

网上还有人说在linux 上安装其他软件解决此问题,后来想想太麻烦了,就没采用此方法。


MATLAB-Simulink协同并行仿真计算程序 本资源提供完整的仿真计算程序包,包含全部源代码与预设数据文件。该程序经过系统化调试,具备开箱即用的执行特性,用户可直接部署运行以验证并行仿真流程。 程序核心采用模块化架构设计,实现了Simulink仿真模型与MATLAB计算脚本的高效协同。通过分布式计算工具箱构建并行任务调度机制,显著提升复杂动力学系统的仿真运算效率。数据交互接口采用标准化封装,确保各子系统间参数传递的精确性与实时性。 资源包内包含三个关键组成部分: 1. 主控调度脚本 - 负责初始化并行计算环境、分配仿真子任务及结果汇总 2. Simulink模型库 - 提供已验证的电机控制、信号处理等典型仿真模块 3. 基准测试数据集 - 包含多组标定参数及对应的预期输出结果 技术特性方面,程序实现了动态负载均衡算法,可根据计算节点性能自动调整任务粒度。同时内置异常处理模块,能够捕获仿真过程中的数值溢出及收敛异常,并生成详细诊断日志。所有计算模块均通过单元测试验证,关键算法附有理论推导文档。 运行环境需满足MATLAB R2020a及以上版本,并安装Parallel Computing Toolbox及Simulink基础模块库。执行过程无需手动配置,启动主程序后将自动完成环境检测、资源分配及仿真验证全流程。最终输出包含时序对比图、误差统计分析表及计算效率评估报告。 该实现方案特别适用于需要多次参数迭代的仿真场景,通过并行化改造可使传统串行仿真任务的执行时间缩短60%-85%。程序代码遵循工程化编码规范,关键节点配有详细注释,便于后续功能扩展与性能优化。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值