美文网首页
electron中使用node对图片进行压缩

electron中使用node对图片进行压缩

作者: 千茉紫依 | 来源:发表于2020-06-18 15:57 被阅读0次

    使用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);
            });
        })
    

    相关文章

      网友评论

          本文标题:electron中使用node对图片进行压缩

          本文链接:https://www.haomeiwen.com/subject/ornyxktx.html