记录第一次驯服deepseek写代码的经历

首先声明,我还是更喜欢老版本印象笔记。最喜欢的点就是他的数据库设计,笔记所有的内容都装进一个exb格式的sql3数据库,名字:name#app.yinxiang.com.exb数据库,这样迁移数据的时候直接备份一个文件即可,而不是joplin那样附件和数据库是分开的设计,虽然可以导出jex,但是不知道为啥就是不喜欢,为啥做不到印象笔记这样的设计呢,毕竟你当成抄的也是evernote(听说),难道是因为做不到数据库增量备份?

而最近发现一个问题,网页上剪藏的图片无法显示,原来是webp图片的原因,当然最新版的印象笔记软件应该是支持了,不过新版软件的数据库大小明显小于旧版的,明显不是完整版的数据库,所以我就弃用了。

因为无法显示webp的原因,有了昨天的帖子:

解决答案就是我帖子里提到的那个js脚本,但是稳定性不行,有时候明明开了脚本,还是无法转换,反复开关几次才能转换。

刚好今天发现,直接把网页源码里图片的webp后缀改为jpg,图片在网页里还是能正常显示,剪藏之后印象笔记也是能正常显示,而不是看到webp的格式文件,刚好昨天找解决方案的时候,看到论坛米老鼠写的webp回退帖子,我昨天试了反正是不行。今天因为手动修改webp格式成功的缘故,又动起了了心思,能不能修改下这个代码让把webp转换为jpg。

然后把这串代码喂给deepseek,让它帮忙解读解读,得到如下回复:

这段代码是一个用于将网页中所有WebP格式图片转换为PNG格式的浏览器书签工具(也称为书签小工具或Bookmarklet)。以下是详细分析:

功能说明

检测WebP图片:查找页面中所有src属性以.webp结尾的标签

转换为PNG:通过Canvas将每张WebP图片转换为PNG格式

替换原图:将转换后的PNG数据替换回原图片元素

代码执行流程

收集页面中所有WebP格式的图片元素

使用Canvas绘制每张图片(这会自动将WebP转换为可绘制格式)

通过canvas.toDataURL(“image/png”)将画布内容导出为PNG格式的Data URL

用转换后的PNG数据替换原图片的src属性,

递归处理所有收集到的图片,完成后显示提示

原来是这样的工作流畅,然后我直接让他写个代码:

能不能帮我修改一下代码,我需要你查找页面中所有src属性以.webp结尾的标签,然后直接把图片的webp后缀直接改为jpg

然后这货竟然不懂了,写了一个html的代码。

我再三提示结合上面的js代码,终于写出来一个可用的js书签代码了,测试,成功了,太激动了,哈哈。

顺便问下论坛里懂代码的,如何让这个js代码继续改进,放进纂改猴里面,以后网页内的所有webp格式图片自动替换后缀为jpg啊,而不需要我手动点击去替换呢。

这里感谢 @dms 帖子的源代码,我测试过程中就第一个图片转换为下载.png,后面还是webp。

webp图片测试网址-豆瓣日出爱好者小组:日出前的朝霞

// ==UserScript==
// @name         webp2jpg
// @version      2025-09-07
// @description  改图片后缀
// @author       dxsc
// @match        *://*/*
// @match        https://*
// @icon         https://wdcdn.qpic.cn/MTMxMDI2NjEzNzM4MDczNDg_25385_j1AdmJ2sjGxuwHNU_1757234241
// ==/UserScript==
(function() {
    document.querySelectorAll("img[src$='.webp']").forEach(img => {img.src = img.src.replace(/\.webp$/i,".jpg");});
})();

借助deekseek已经写出来了。
原来改后缀是以这个格式从新发起请求,然后服务器给你数据。
现在遇到的问题是,尤其是知乎的图片,后缀是pic(导致无法提交请求),而实际返回图片内容类型是webp,导致还是有无法显示的问题。
即使我用了不支持webp的火狐旧浏览器,知乎也不对图片进行调整,仍然响应webp的图片。
只能想新办法了,所有的图片提取连接后重新进行格式转换。

也是奇怪,这个图片在代码里显示的是jpg,但是另存为就是webp,包括火狐查看图片类型也说是webp。

昨天的疑问终于想通了。

问题的关键这是一个文件名为jpg的webp文件,所以保存的时候浏览器自动选择了正确后缀.

为了确认这一点,你可以安装mediainfo来看图片到底是什么编码格式

文件实际格式与后缀名不一致大多数情况没有影响,小部分软件会打不开文件(比如ps).

上图我测试了,即使是jpg的后缀,本质还是webp图片,文件浏览器【内容类型】即可看到,还有这种图片用文本编辑器打开,看到的是riffwebp开头(ds教我的),而jfif就是jpg图片。

解决方案三个办法:
1,js脚本对于本页的所有图片进行二次转换生成jpg图片(替换掉网址)。
2,数据库里图片格式转换
3,升级支持webp的版本,我试试第三个方案吧

@tiger 我借地插一句,好像Zotero也是这么设计的。

我更喜欢一个数据库文件直接搬走那种方式,这样看来只能定死在印象笔记了。唯一的遗憾是不支持webp图片,从6.17,6.18,6.21,6.24,6.25,都试验了一遍,都不能显示webp图片,最新版本虽然支持但不是数据库存放形式,只能弃用。
这些版本真是垃圾,还不如更早的5.91.8742版本,pdf一放大,其他笔记的字体也跟着变大变小。

你要不说,我也没留意到这个问题,这样确实被软件绑死了。
不过关于印象笔记,迁移的人不少,应该有解决方案吧。

我说的定死,我是指所有这些笔记软件中,只有印象笔记的老版本是完全的数据库存储,所以就拿他当离线笔记软件。即使哪天倒闭了也不怕。

是的,这样做的好处就是不会产生过多的碎片文件,反面例子是为知笔记。而将数据库与附件集中存储的弊端则在于一个庞大的存储库文件,在读取速度、同步速度上都很慢啦,例子就是 myBase 了

1 个赞

joplin是文字放进数据库,附件没放进数据库,太可惜了,否则我就转这个软件了。
随着电脑的性能越来越强,弊端这些这些都不是问题吧。

是不是目前还在开发的笔记软件中,没有此种结构的?
不过你楼下 @tiger 说的myBase也是这种结构。

你的碎片文件指的是什么?我Zotero之前用的是为知,没注意到有什么碎片。
不过速度确实会成为问题,但是附件独立迁移就是问题,最后的折中方案可能就是Obsidian了 :sweat_smile:

是指受到磁盘存储技术限制,而导致同一个文件可能会分布在磁盘的不同位置,在读取时需要更多的时间才能完整读取。

1 个赞

我怎么觉得这个问题和文件系统原理有关,和文件存储模式关系不大?

有没有什么js函数,可以将网页上的图片进行格式转换为jpg啊,这种替换的方法有的网站不起作用,主要还是看服务器是否接受这种申请。

我也不太懂,我让AI帮忙写了一段代码,可在浏览器控制台中执行
另外可能需要安装cors解除封锁相关浏览器扩展

async function convertWebpToJpg(imgElement) {
    return new Promise((resolve, reject) => {
        const canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');

        // 设置 crossOrigin 属性
        imgElement.crossOrigin = "Anonymous";

        imgElement.onload = () => {
            canvas.width = imgElement.naturalWidth;
            canvas.height = imgElement.naturalHeight;
            ctx.drawImage(imgElement, 0, 0);
            const dataUrl = canvas.toDataURL('image/jpeg', 0.9);
            resolve(dataUrl);
        };

        imgElement.onerror = (err) => {
            reject(err);
        };

        // 重新触发加载,确保 crossOrigin 生效
        imgElement.src = imgElement.src;
    });
}

async function main() {
    const images = document.querySelectorAll('img[src$=".webp"]');
    for (const img of images) {
        try {
            const jpgDataUrl = await convertWebpToJpg(img);
            img.src = jpgDataUrl;
            console.log('转换成功:', img.src);
        } catch (err) {
            console.error('转换失败:', img.src, err);
        }
    }
}

main();