AutoJs6 icon indicating copy to clipboard operation
AutoJs6 copied to clipboard

images.save(pic,..... 30);减小图片质量,但是文件大小没减小?

Open wengzhenquan opened this issue 8 months ago • 2 comments

我有个图片截图,需要上传服务器,但网络传输时间比较长。 想着在不改变图片分辨率的前提下,牺牲一点图片质量,缩小文件大小,能否减少点时间。 于是乎:

var pic = images.read("./tmp/pic2.png");
 images.save(pic, "./tmp/pic4.png", "png", 30);

就是做了个转换,减小图片质量。 但是最终发现pic4.png跟pic2.png文件大小还是一样。 我这是牺牲了质量,没得到任何好处?

wengzhenquan avatar Apr 22 '25 23:04 wengzhenquan

要存成jpg才能压缩 images.save(clip, filePath, "jpg", 80);

cheerwold avatar Jul 21 '25 02:07 cheerwold

AutoJs6 的 images.save 内部会调用 Bitmap#compress 方法:

try (FileOutputStream fos = new FileOutputStream(path)) {
    return bitmap.compress(compressFormat, quality, fos);
}

Bitmap#compress 而言, quality 参数只有在 JPEG / WebP (有损) 等 有损压缩 的图形格式下才会生效. 由维基百科可知, 便携式网络图形 (Portable Network Graphics, PNG) 是一种支持 无损压缩 的位图图形格式, 支持 [ 索引/灰度/RGB ] 三种颜色方案以及 Alpha 通道等特性. 可见 PNG 属于无损压缩, Android 的实现会直接忽略 quality, 因此文件大小几乎不会改变; 如需在 "分辨率不变" 的前提下减小体积, 需更换为 JPG / JPEG / WebP (有损) 并降低 quality; 或者, 使用一些针对 PNG 压缩的扩展库做特殊处理, 仅靠 Bitmap#compress 无法达到效果.

为此, AutoJs6 6.6.3 特意引入了 libimagequantlibpng 两个库, 用以压缩 PNG 图形格式. 详见 https://github.com/SuperMonster003/AutoJs6/commit/676dde9632eac90e10cd4d483fa9e2580bbb241e.

需特别留意, PNG 的压缩耗时相对较大, 编写效率敏感的脚本时需慎重考虑 (此时通常建议使用其他有损格式作为压缩源).

SuperMonster003 avatar Jul 27 '25 11:07 SuperMonster003