setIconImages是否改变图标尺寸?排查图标放大及质量丢失问题
问题原因分析及解决方案
核心问题:提取逻辑优先获取了系统自动放大的32x32图标
你的提取代码getIconHandle中,首先尝试获取ICON_BIG(对应32x32尺寸的图标),而Windows系统在发现你只提供了16x16的图标时,会自动对其进行插值放大生成32x32版本的ICON_BIG,这就是你得到模糊32x32图标的直接原因。
Swing的setIconImages本身并没有修改原始16x16图片,而是Windows系统为了满足不同场景的图标尺寸需求,自动补充了放大版本的图标资源。
验证及修复方案
修改getIconHandle的逻辑,优先请求ICON_SMALL或ICON_SMALL2(对应16x16尺寸),而不是先请求ICON_BIG,这样就能拿到原始的16x16图标,避免质量损失。调整后的逻辑顺序建议为:
- 先尝试
ICON_SMALL2(任务栏小图标,通常16x16) - 再尝试
ICON_SMALL(标题栏小图标) - 最后才尝试
ICON_BIG
额外代码问题修正
在toImage函数中,gdi32.DeleteObject(hicon)这行代码存在错误:HICON是从系统窗口获取的句柄,你无权直接删除它,这会导致原窗口的图标资源被非法释放,引发异常。需移除这行代码,仅保留对bitmapHandle的删除操作。
内容的提问来源于stack exchange,提问作者Cardinal System
相关产品推荐
相关产品推荐

