使用node对图像进行压缩,我选用的是resize-optimize-images,能知道这个包还是非常巧合,网上的博客,适合node图片压缩的包有两个: gm和images, images在win10中有很大的兼容性问题,而gm在electron中编译一直失败. 所以我在github上以images和resize为关键字,搜索结果中排名前三十的包全部试用了一遍,大部分在electron都存在问题,node-OpenCV是一个万能的图形库, 但是十分臃肿, 正当我准备手撸插值压缩算法的时候,忽然发现了resize-optimize-images这个包非常小巧,而且正好能够满足要求
压缩的基本思路是在图片中找到相对比较短的边, 以他为基准压缩到一个比较小的比例(如640*480),然后将原始图片复制出来,再将压缩后的图片写进去即可. 图像的大小最终取决于三个因素:图片像素、编码质量和位深度,图形像素在执行完这条个函数之后就达到一个比较小的范围了,一般不会超过100k,而编码质量是一种类似于PS中表面模糊的效果,使用的是插值算法,一般编程80-90区间内可以对图像进行进一步的压缩,但是不建议压的太多,会失真。真彩色的位深度一般是四个字节
const fs = require('fs');
const getPixels = require("get-pixels") // 这是一个获取图片像素的node包
const resizeOptimizeImages = require('resize-optimize-images');
getPixels(fileAbPath, function (err, pixels) {
if (err) {
return
}
let compressRio = 0.9;
let [imageWidth, imageHeight] = pixels.shape
//找到比较小的边
let loopVar = imageWidth > imageHeight ? imageHeight : imageWidth;
while (loopVar >= 480) {
loopVar = loopVar * compressRio;
imageWidth = imageWidth * compressRio;
imageHeight = imageHeight * compressRio;
}
imageWidth = Math.floor(imageWidth)
imageHeight = Math.floor(imageHeight)
const content = pixels.data
fs.writeFile(outPath, content, async function (err) {
const options = {
images: [outPath],
width: imageWidth,
height: imageHeight,
quality: 85
};
// 执行压缩.
await resizeOptimizeImages(options);
});
})
网友评论