一个去水印思路以及代码片段

2023-06-28 11:02:05 浏览数 (2)

起因是在某鱼上买了个某付费网站的N手知识点总结, 是截图形式而且其中夹杂着购买人的姓名和身份证号,以及灰色的底子,导致打印出来不太好看,并且不容易进行图像转文字,无法进一步做成音频所以我就大概折腾了一下先放一张原图

思路:“众所周知” 图片其实就是一个数组,就是形如[255,255,255,0,0,0],这标识着第一个像素点的rgb是(255,255,255), 显示为白色,第二个点rgb(0,0,0),显示为黑色, 大抵如此先去网上扒拉个解析png的代码,然后就是对色值进一步分析,例如原图最底下的灰色,用取色工具(大部分截图工具都可以)看到色值(f3,f3,f3) ,f3转为10进制是243, 而且我发现这个原图的各处r,g,b三者都是相等的,就是说当我遇到243的时候都给转成255最后就是白色了, 一步步解析水印处的色值, 最后发现水印色值大部分处于200和243之间

代码语言:javascript复制
const changeFunc = (val) => val <= 243 && val >= 200 ? 255 : val;
const fs = require("fs");
const PNG = require("pngjs").PNG;
const pngFile = process.argv[2];
const outDir = pngFile.replace(".png", ".no.png");
 
function getImgData(p) {
    return new Promise((resolve, reject) => {
        fs.createReadStream(p)
            .pipe(new PNG({
                filterType: 4
            }))
            .on('parsed', function () {
                var data = new Buffer.alloc(4 * this.width * this.height);
                this.data.copy(data);
                resolve({
                    data: data,
                    width: this.width,
                    height: this.height
                });
            }
            );
    })
}
function ImgDataToSave(imgData) {
    let { width, height, data } = imgData;
    var newPng = new PNG({
        filterType: 4,
        width: width,
        height: height
    });
    newPng.data = data;
    var dst = fs.createWriteStream(outDir);
    newPng.pack().pipe(dst);
}
getImgData(pngFile).then((res) => {
    let { width, height, data } = res;
    for (let i = 0; i < height; i  ) {
        for (let j = 0; j < width; j  ) {
            var idx = (width * i   j) << 2;
            data[idx] = changeFunc(data[idx])
            data[idx   1] = changeFunc(data[idx   1])
            data[idx   2] = changeFunc(data[idx   2])
        }
    }
    ImgDataToSave({
        width,
        height,
        data
    });
});

以上代码保存为 a.js用npm/cnpm 安装一下依赖npm install pngjsnode a.js image1.png就得到一个imge1.no.png 如下图

干净了不少 但是还有最上边最下边两条多余的内容,使用convert进行切割convert-crop 1530x1830 0 125 image1.no.png image1.yes.png以上表示从文件image1.no.png 的(0,125)开始切,切一个1530*1830下来 保存为image1.yes.png最终得到一个尺寸刚好且没有水印的版本如下

以上文章只是提供了思路,素材来源于网络。侵权联系删之。

0 人点赞