一个去水印思路以及代码片段
本帖最后由 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
最终得到一个尺寸刚好且没有水印的版本如下
感谢分享思路,这个确实有时候在工作上也能用得上。 感谢分享,学习啦 分析得不错,学习了。 向大神学习 感谢分享,学习 学习去水印思路,谢谢分享 说实话第二次说的最上面和最下面的多余内容不知道是哪里。没看出来 学习去水印的办法 思路可行,早期我也想过,但找不到色彩代码
页:
[1]
2