吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2234|回复: 11
收起左侧

[其他原创] 一个去水印思路以及代码片段

[复制链接]
ztory 发表于 2021-3-28 22:12
本帖最后由 ztory 于 2021-3-28 22:14 编辑

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

image1.png



思路:
“众所周知” 图片其实就是一个数组,就是形如[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 pngjs
node a.js image1.png
就得到一个imge1.no.png 如下图

图片1.no.png

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

image1.png

免费评分

参与人数 7吾爱币 +8 热心值 +6 收起 理由
hanxiao666 + 1 我很赞同!
秋意浓6 + 1 + 1 我很赞同!
Carrot-Chou + 3 + 1 我很赞同!
pepete + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Va1 + 1 + 1 我很赞同!
blindcat + 1 + 1 谢谢@Thanks!
xingyie9909 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

讲出来怕人笑 发表于 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
思路可行,早期我也想过,但找不到色彩代码
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 17:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表