起因是在某鱼上买了个某付费网站的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最终得到一个尺寸刚好且没有水印的版本如下
以上文章只是提供了思路,素材来源于网络。侵权联系删之。