ztory 发表于 2021-3-28 22:12

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

本帖最后由 ztory 于 2021-3-28 22:14 编辑

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





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



const changeFunc = (val) => val <= 243 && val >= 200 ? 255 : val;
const fs = require("fs");
const PNG = require("pngjs").PNG;
const pngFile = process.argv;
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 = changeFunc(data)
            data = changeFunc(data)
            data = changeFunc(data)
      }
    }
    ImgDataToSave({
      width,
      height,
      data
    });
});



以上代码保存为 a.js用npm/cnpm 安装一下依赖
npm install pngjs
node 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
最终得到一个尺寸刚好且没有水印的版本如下

讲出来怕人笑 发表于 2021-3-28 22:19

感谢分享思路,这个确实有时候在工作上也能用得上。

song1663072 发表于 2021-3-28 22:41

感谢分享,学习啦

tbloy 发表于 2021-3-28 22:49

分析得不错,学习了。

blindcat 发表于 2021-3-28 23:16

向大神学习

Water.Feynman 发表于 2021-3-28 23:28

感谢分享,学习

pepete 发表于 2021-3-28 23:32

学习去水印思路,谢谢分享

king_w 发表于 2021-3-28 23:47

说实话第二次说的最上面和最下面的多余内容不知道是哪里。没看出来

afti 发表于 2021-3-28 23:52

学习去水印的办法

jori 发表于 2021-3-29 00:03

思路可行,早期我也想过,但找不到色彩代码
页: [1] 2
查看完整版本: 一个去水印思路以及代码片段