一次线上图片打印失败问题排查

Glide图片加载失败排查与修复实战 本文针对Android开发中Glide图片加载失败的常见问题,提供了从配置错误监听器、分析日志到排查网络、URL、上下文及缓存问题的完整实战指南。通过启用详细日志、使用网络调试工具等进阶技巧,并结合统一的封装与URL预处理等最佳实践,帮助开发者高效定位并修复图片显示异常。 阅读详情

01 问题由来

昨天产品在测试系统的时候,提了个bug,有个功能打印图片时,图片无法显示。为了重现这个bug,特意去测试环境看了下,还真存在,于是去看错误日志,发现报异常了。

在某个类的某一行,有这个java.lang.ClassNotFoundException: com.sun.image.codec.jpeg.JPEGCodec报错信息,于是启动开发环境,打好断点,开始调试。

JPEGCodec是com.sun.image.codec.jpeg包下面的,在jdk1.6及以前的版本中都可以正常使用,但是在jdk1.7以上的版本中,就被移除了,但是在jre中的rt.jar包中,还是保留着。

由于本地开发环境配置项目的依赖库时,用的时jre1.8的库,所以在开始调试的时候,一切正常,但是把依赖库切换到Java-SE-1.8的时候,直接编译报错了。

02 旧的方法

/**
 * 对图片进行压缩
 * @param filePath 图片文件路径
 * @param bufferedImg BufferedImage对象
 */
public static void compressImage(String filePath, BufferedImage bufferedImg) {
	FileOutputStream out = null;
	try {
		if (bufferedImg == null) {
			return ;
		}
		out = new FileOutputStream(filePath);

		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(bufferedImg);
		jep.setQuality(0.8f, true);
		encoder.encode(bufferedImg, jep);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		try {
			if (out != null) {
				out.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

03 使用ImageIO

Image的getScaledInstance(int width, int height, int hints)方法中,参数width是压缩图片的宽,参数height是压缩图片的高,参数hints是选择不同的压缩算法,有五种:SCALE_DEFAULT、SCALE_FAST、SCALE_SMOOTH、SCALE_REPLICATE、SCALE_AREA_AVERAGING。

width、height都为负数时,就使用原始图像尺寸,如果为正数且大小小于原始图片尺寸,就会在原图左上角部分覆盖。

Image.SCALE_SMOOTH的缩略算法,生成缩略图片的平滑度的优先级比缩放速度高,生成的图片质量比较好,但速度慢。

/**
 * 对图片进行压缩
 * @param filePath 图片文件路径
 * @param bufferedImg BufferedImage对象
 */
public static void compressImage2(String filePath, BufferedImage bufferedImg) {
	FileOutputStream out = null;
	try {
		if (bufferedImg == null) {
			return ;
		}
		bufferedImg.getGraphics().drawImage(bufferedImg.getScaledInstance(-60, -60, bufferedImg.SCALE_SMOOTH), 0, 0, null);
		out = new FileOutputStream(filePath);
		ImageIO.write(bufferedImg, "jpeg", out);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		try {
			if (out != null) {
				out.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

04 新旧方法测试

编写main方法,找一张图片来测试下。

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * java.lang.ClassNotFoundException: com.sun.image.codec.jpeg.JPEGCodec
 * 
 * @author 小川
 * @date 2019-07-31 20:37:25
 */
public class ImageIO_2019_07_31 {

    /**
     * 对图片进行压缩
     * 
     * @param filePath    图片文件路径
     * @param bufferedImg BufferedImage对象
     */
    public static void compressImage(String filePath, BufferedImage bufferedImg) {
        FileOutputStream out = null;
        try {
            if (bufferedImg == null) {
                return;
            }
            out = new FileOutputStream(filePath);

            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(bufferedImg);
            jep.setQuality(0.8f, true);
            encoder.encode(bufferedImg, jep);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 对图片进行压缩
     * 
     * @param filePath    图片文件路径
     * @param bufferedImg BufferedImage对象
     */
    public static void compressImage2(String filePath, BufferedImage bufferedImg) {
        FileOutputStream out = null;
        try {
            if (bufferedImg == null) {
                return;
            }
            /**
             * Image.getScaledInstance(int width, int height, int hints)
             * width、height都为负数,就使用原始图像尺寸,如果为正数且大小小于原始图片尺寸,就会在原图左上角部分覆盖
             * Image.SCALE_SMOOTH的缩略算法,生成缩略图片的平滑度的优先级比缩放速度高,生成的图片质量比较好,但速度慢
             */
            bufferedImg.getGraphics().drawImage(bufferedImg.getScaledInstance(-60, -60, bufferedImg.SCALE_SMOOTH), 0, 0, null);
            out = new FileOutputStream(filePath);
            ImageIO.write(bufferedImg, "jpeg", out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 根据本地文件得到BufferedImage对象
     * 
     * @param filePath 图片文件路径
     * @return
     */
    public static BufferedImage getBufferedImageByExistFile(File file) {
        BufferedImage image = null;
        try {
            image = ImageIO.read(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return image;
    }

    public static void main(String[] args) {
        // 原图196kb
        String filePath = "E:\\jumao.jpg";
        // 创建File对象
        File file = new File(filePath);

        // 获取BufferedImage对象
        BufferedImage bufferedImg = getBufferedImageByExistFile(file);

        // 原来的方法 143kb
        compressImage("E:\\jumao01.jpg", bufferedImg);

        // 调用升级后的方法 107kb
        compressImage2("E:\\jumao02.jpg", bufferedImg);

    }

}

在E盘中,生成了两张压缩后的图片,从图片的大小上来看,新方法是完胜旧方法的。

如果你也有遇到过此问题,也可以使用上面的新方法,兼容性更好。

微信小程序线上接口请求失败排查指南:从域名配置到HTTPS证书 在Web开发中,网络请求是应用与服务器交互的核心。其基本原理是通过HTTP/HTTPS协议,在客户端与服务器之间传输数据。为确保安全可控,现代平台普遍采用域名白名单、HTTPS强制等安全策略。这些策略在微信小程序中体现得尤为严格,其技术价值在于保护用户数据安全、防止恶意请求,是构建可信应用生态的基石。典型的应用场景是开发者在测试环境一切正常,但发布线上后接口却调用失败。这通常涉及**域名校验**与**HTTPS/TLS证书**两大核心机制。本文将深入剖析微信小程序网络请求的“白名单”机制,解释测试环境与线上 阅读详情

相关推荐

前端图片加载失败排查指南:从路径到跨域的完整解决方案

在Web开发中,静态资源加载是基础且关键的技术环节。其核心原理涉及浏览器解析、HTTP请求响应、服务器文件系统与安全策略的协同。理解这一流程的技术价值在于,它能确保用户体验的流畅性,并直接影响网站性能与SEO表现。常见的应用场景包括网页图片展示、图标渲染、媒体内容加载等。当资源加载失败时,开发者需要系统性地排查路径、服务器配置、网络策略及跨域问题。本文聚焦于图片加载失败这一典型场景,结合浏览器开发者工具的使用与服务器端配置,提供一套从现象到根源的完整诊断思路,帮助开发者高效解决常见的404、403及CORS

优快云头条 916

win10图片打印提示出现了一个内部错误

如果 Windows 10 中出现了图片打印时的内部错误,可能是由于以下几个原因导致的: 打印机驱动程序问题: 如果你的打印机驱动程序过时或者损坏,可能会导致打印错误。 打印机硬件问题: 打印机硬件可能出现故障,导致打印错误。 Windows 操作系统问题: Windows 系统的一些更新或者设置可能导致打印错误。 图片问题:如果图片格式不支持或损坏,可能会导致打印错误 建议你尝试以下...

weixin_35751412的博客 7990

小程序图片上传失败排查指南:从原理到实战解决环境差异问题

文件上传是Web和移动应用开发中的基础功能,其核心原理涉及客户端文件选择、网络传输与服务器端处理三个关键环节。在微信小程序生态中,这一流程通过 `wx.chooseImage` 和 `wx.uploadFile` 等API实现,但开发者常因环境差异导致功能在真机失效。理解其背后的网络策略与安全机制至关重要,例如,小程序在真实环境强制校验服务器域名,并要求HTTPS连接,这直接关系到功能的可用性与安全性。掌握这些原理,能帮助开发者构建稳定可靠的上传功能,提升用户体验。本文聚焦于小程序图片上传的常见故障,特别是

weixin_33836874的博客 473

右键打印图片-可用内存不足,无法打印你的图片~

wps打印图片一切正常,右键打印图片时,提示内存不足,无法打印的问题解决

rainsghost的博客 6777

线上邮件发送失败的一次排查

最近老大安排了一个任务让我去完成:监控公司每天生成报表里面的图片是否生成,如果没生成则记录相应的位置,图片名称等信息,然后发邮件提示。接到这个任务,经过排期,分析需求,然后开始编码,完成,测试ok,让QA测试,上线等流程后,任务搞定,小case! 由于这个任务是一个定时job,每天都会调度,因此应该是每天都会发送邮件给我和老大(因为报表中图片的丢失率比较高)。前几天还好,都会定时发送邮件过来!结果...

飞越蓝天的专栏 945

保姆级教程:用VESTA软件5分钟搞定纳米颗粒Wulff Construction建模(以Au金为例)

本文提供了一份详细的VESTA软件教程,指导用户如何在5分钟内完成纳米颗粒Wulff Construction建模,特别以金(Au)为例。从环境搭建、基础晶体结构创建到Wulff Construction设置和可视化优化,涵盖了全流程操作步骤和常见问题解决方案,适合科研新手快速上手。

weixin_29311017的博客 436

ImageIO 实现图片缩放

图片的缩放是在内存中进行完成的,用到了BufferedImage中的方法(以上就完成了图片缩略图的生成。

Mointor 1684

【OpenCV】复杂场景下的高精度圆检测实战(附完整代码)

本文针对OpenCV霍夫圆检测在复杂场景下易失效的问题,提出了一套基于轮廓分析的高精度圆检测实战方案。通过图像预处理、轮廓发现及多轮几何筛选(面积、周长、椭圆拟合、多边形逼近),有效排除噪声和类圆干扰物,显著提升复杂场景下的检测鲁棒性,并附完整可调参的Python代码实现。

weixin_29095587的博客 201

基于java的五子棋博弈系统

基于java的五子棋博弈系统 前言 本文是以学校Java面向对象程序设计课程设计要求为背景,利用了Java语言、人工智能算法知识和Eclipse IDE开发平台,开发了五子棋小游戏,本论文论述了五子棋小游戏的概念、结构、基本思路和方法,全文共分为绪论、设计分析、详细分析、设计结果及分析、总结和展望、参考文献以及附录(代码)等。 设计目的 巩固加深对java语言课程基本知识的理解和掌握; 掌握java语言编程和调试的基本技能; 掌握javaGUI编程的基本能力; 掌握JDK、WindowBuilder等开发

敷衍zgf的博客 4529

Codesys—Modbus RTU称重变送器通讯案例

Codesys控制器使用标准的Modbus库,与支持ModbusRTU的称重变送器进行通讯的案例

原来你也__的博客 2741

[华中科技计组实验]logisim完成单周期5级流水MIPS CPU

[华中科技计组实验]logisim完成单周期5级流水MIPS32 CPU hu~,终于完成了,真是费劲呐 支持24条指令,5级流水线,可以对分支指令处理,寄存器冲突处理,指令ROM为1K,数据RAM为1M,32位MIPS指令集CPU 但是… 大量使用比较器造成硬件开销巨大,测试一下发现这尼玛真是个老爷车还没单周期跑的快,自己电脑cpu占百分之八九十只能跑到20多赫兹,一个走马灯跑了半天,可优化空间太大了,写了那么多天造成这个破样,有点悲剧。。。 先放个图大伙参考就行了,要是有人想听思路的话接下来再更 .

zrc的博客 1万+

记一次灰度发版打印背景图片无法加载的处理过程

记一次灰度发版打印背景图片无法加载的处理过程 前言 需求为给订单加上新的打印模板,测试环境正常,灰度环境打印不出来图片。请求服务器路径可以展示图片,使用lodop设置背景图或打印图片都无法展示 解决过程 1. 初步怀疑是图片文件有问题,将图片格式变换为服务器上已存在且正常的图片的格式,失败 2. 更改原始图片(服务器上已存在且正常)文件名为新的图片文件名,失败 3. 直接请求服务器路径,图片正常显示。将此绝对路径设置到打印中,失败 4. 更改原始图片名为新的图片文件名,将新图片名更改为旧图片名

qq_35546153的博客 1080

Tera Term介绍和使用指南

Tera Term 是一个用于 Windows 操作系统的免费终端模拟器和串口通信软件。它主要用于在计算机和其他设备之间建立串口通信连接,例如通过串行线缆连接到设备如路由器、开发板或嵌入式系统。Tera Term 支持多种通信协议和功能,包括 Telnet、SSH 和串口通信。提供了一个终端窗口,模拟了常见的终端类型,如VT100。支持通过串口与设备进行通信,可用于与嵌入式系统、微控制器等设备进行连接。提供 Telnet 和 SSH 功能,可用于通过网络连接到远程主机。

weixin_49423593的博客 1万+

线上问题怎么排查

看监控日志(如 Sentry / LogRocket / 阿里 ARMS);在错误日志中关联用户行为(比如“用户点击了购买按钮 → 页面报错”)异常 → 告警通知 → 定位修复 → 验证恢复 → 报告复盘。聚合相同错误、统计趋势、发送告警(钉钉/飞书/Slack)Network → HTML/JS 是否加载失败;(是否携带 cookie、OPTIONS 返回);:接口 4xx/5xx、超时、CORS 问题。输出问题报告(错误堆栈、影响用户数、解决方案)哪些阶段耗时长(DNS、脚本解析、渲染);

2501_90225904的博客 878

深度学习|卷积神经网络

介绍卷积神经网络基本理论,包括卷积层、池化层和全连接层,并阐述LeNet卷积神经网络的构建过程。

weixin_58243219的博客 5728

PY32F406K1CU6 FLASH模拟EEPROM

摘要:本文介绍了基于STM32 FLASH模拟EEPROM的实现方法。头文件flash.h定义了FLASH页大小(256字节)、用户存储区域(4页)及地址范围,提供了等待周期配置和地址校验宏,声明了EEPROM初始化、读写操作等函数接口。源文件flash.c实现了具体功能:配置FLASH等待周期(144MHz需3WS)、页读写擦除操作,以及EEPROM初始化(解锁-擦除-验证-锁定)和缓冲区读写功能。其中写操作采用"读页→更新→擦除→编程"的流程,确保数据安全写入。该方案适用于需要非易失

sam的博客 195

HP M154nw彩色打印机 打印WORD故障排查过程

HP M154nw彩色打印机 打印WORD故障排查过程 问题描述: 用户打印某WORD文档(文档主要内容为文字及图片),打印失败,且WORD呈现无响应假死状态,更换公司其他电脑均出现该问题,office与WPS 均产生该问题。 常规判断: 常规打印测试页,打印正常, 转为PDF打印正常, 判断为用户文档故障,用户要求深究原...

zt19820204的博客 998

TIA Portal (博图) -两台不同网段S7-1200通信(上)

因为不同网段意味着它们默认不在同一个广播域,并且没有网关设备来处理路由,所以标准的 TCP/IP 通信(如 `TSEND_C`/`TRCV_C`)无法直接建立连接。S7 通信 (PUT/GET): 最简单,配置好连接后,在客户端 PLC 使用 `PUT` 指令发送数据到服务器 PLC,使用 `GET` 指令从服务器 PLC 读取数据。* 在地址详细信息中,确保 本地连接端点是客户端 PLC 的接口,远程连接端点是服务器 PLC 的接口和 IP (`192.168.2.20`)。

电工 2685

干货!一次 kafka 卡顿事故排查过程

「点击图片获取最近两年爆款好文」来源:等你归去来 ,www.cnblogs.com/yougewe/p/8975550.html由于一次功能上线后,导致某数据量急剧下滑,给我们紧张的...

民工哥的博客 1162

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

从中文文件名缩略图失败到内存溢出:一次“意外修复”的排查之旅!!!

阶段问题描述排查步骤发现/日志解决方案/下一步初始中文名图片缩略图生成失败 (线上)检查编码、Locale、依赖、/tmp空间/权限/tmp空间紧张 (92%) 但权限 OK怀疑代码逻辑,增加日志代码修改(同上)增强日志 (, 过滤, 存在检查),移除批次等待循环(无)部署修改后的代码反转中文名图片成功生成!🥳观察日志返回中文 Key,检查中文 Key 正常,任务提交并成功执行问题似乎解决?但…新问题大量💥观察日志。

小丁的博客 1239

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SDWebImage问题排查:图片不显示常见原因分析

iOS开发中,图片加载失败是常见且棘手的问题。作为最流行的图片加载框架,SDWebImage(图像缓存和加载库)拥有强大的缓存机制和异步处理能力,但开发者仍会遇到"图片不显示"的情况。本文将系统梳理12类常见故障原因,提供可直接复用的诊断代码和解决方案,帮助你在5分钟内定位问题根源。 读完本文你将掌握: - 12个核心故障点的排查流程 - 基于错误码的精准诊断方法 - 缓存/编码/网络层的深度调...

gitblog_00666的博客 1352

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

线上版本微信小程序保存图片失败?排查一整天,竟是这个“隐私配置”没填对!

微信小程序线上版本保存图片失败?可能是隐私协议未配置!排查发现线上正式版调用 saveImageToPhotosAlbum 接口报错 privacy permission is not authorized。解决方法:进入微信公众平台后台,在隐私保护指引中完善"相册(仅写入)"权限的用途说明,同时补全手机号、剪切板等接口用途。提交审核通过后无需发版即可恢复功能。关键提示:微信会自动检测代码中的隐私API,必须完整填写用途说明,线上版本才会正常调用。

小丁的博客 982

记录一个上传文件失败问题

非代码问题导致系统服务上传操作失败,记录问题排查与处理过程。后续可以修改调整上传操作的数据保存

优快云_JAVA_CC的博客 320

imread函数读取图片失败

查阅imread函数的正确使用案例,确保函数没有使用出错这个函数最重要的就是,进行路径排查,确定文件路径是否有问题。

weixin_52351870的博客 954

记一次ssh连接失败的问题

前言 最近在做ci和cd,cd的时候使用ssh连接到服务器的时候,出现问题 ssh read: Connection reset by peer,这是咋回事前几分钟都是ok的,之后就出现这样的问题了 解题思路 检查服务器是否能ping通 ping 192.186.2.33 ping是通的,因为ping是底3层网络协议,这只能证明底3层网络协议是ok的,ssh是应用层协议,问题需要往上找 查日志 用ssh -v连接有问题的服务器,会有详细信息输出到屏幕上,如果是客户端出了问题,在log中会打印,如果l

死磕音视频 1385
上一篇: LeetCode.1128-等价多米诺骨牌对的数量(Number of Equivalent Domino Pairs)
下一篇: LeetCode.1137-第N个泰波那契数(N-th Tribonacci Number)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值