relsoul 发表于 2023-6-18 15:53

为了能在chiphell上发大图,我写了一款图床软件

本帖最后由 relsoul 于 2023-6-18 15:53 编辑

# 前言

萌新发的第一篇游记的时候发现chiphell只支持500kb的图片,但是我拍出来的图片基本上都是10M往上,并且懒得再用软件批量压缩了,常用的图片压缩软件不清楚最后压出来的尺寸是否会小于500kb,而且一个一个看太麻烦了,后面发现discuz(chiphell 论坛程序)支持网络图片,也正好我有一台闲置的服务器(每个月1T流量,不限带宽),那为啥不把闲置的服务器利用起来呢?

# 调研

免费图床/自建图床 已经不是什么新鲜事了 目前图床可以有多种选择
1. (阿里云/腾讯云/七牛云)Oss
2.自有服务器
3. 公开的存储仓库 如github(没错 他也可以用来做图床)

其中oss是按照存储和流量付费的,看了一下价格并不便宜,公开图床 如github的话网络访问也是一个问题,主要的还是上传的时候不支持压缩,对外输出的还是10M的原图....这个尺寸量多了肯定影响访问,于是结合前言 还是把闲置的服务器利用起来(国外服务器 每个月大概12美元)。

# 自有服务器

如果你有一台服务器你可以做很多很酷的事情,比如搭建一个私有图床,调研了一下目前自建图床的开源,已经有很多很优秀的产品了,基本上功能都是比较完善丰富的 还带web ui可以管理上传过的图片等等。

虽然但是.... 自己看了一下还是想有一款非常轻量级的上传程序,调研了一下 发现客户端有一款名为 `picgo`的神器程序


https://cdn.relsoul.com/public/uploads/soul/2023-06-17/676723ea-acd2-4497-8802-5a41e41d375e.png?f=webp

完全开源的https://github.com/Molunerfinn/PicGo
初步看了一下目前picgo已经支持阿里云等私有/公开图床了... 搜索插件搜了半天没找到自由主机 也就是 self-host的整套服务(包括客户端和服务端),于是打算自己写一款轻量级的图床服务

# minify-upload

说干就干,想起来几年前自己写过一个chrome插件版本的上传程序,不过由于之前后端的版本写的比较早,这次也趁机会重构一下。

预想写出来的图床服务应该要支持

1. 简单易用,能快速部署,不包含任何数据库服务
2. 支持压缩图片和转化图片格式
3. 支持已有的图片批量压缩
4. 能多一点配置项服务
5. docker一键构建部署
6. 兼容picgo和原有的chrome插件


画了一两天时间折腾折腾就出来了


# minify-upload 后端服务


https://github.com/Relsoul/minify-ts-node

基于nodejs+nest+typescript的船新版本,想要的功能都支持成功了。

[*]基于文件目录化的用户文件保存与查看
[*]文件大小等后端校验与过滤
[*] 支持user认证
[*] 文件上传与保存
[*] 静态服务器
[*] picgo插件支持
[*] 上传压缩/转换图片
[*] 读取图片支持调整宽高&输出格式
[*] 支持批量压缩/转码原有图片


# minify-upload 客户端服务

picgo已经开发的很不错了~ 站在巨人肩膀上会更加轻松,于是我开发了一款picgo的插件: https://github.com/Relsoul/minify-picgo-host

https://cdn.relsoul.com/public/uploads/soul/2023-06-16/38c5c5e8-9b4c-4a04-ae73-67e8dc894abd.png

并且兼容了之前自己开发的chrome插件:https://github.com/Relsoul/minify-upload-chrome-extension

https://cdn.relsoul.com/public/uploads/image-1542643868775.png?f=webp


# 上传完图片如何使用?


上传完图片后会得到一个url地址比如这个
https://cdn.relsoul.com/public/uploads/soul/2023-06-16/38c5c5e8-9b4c-4a04-ae73-67e8dc894abd.png
上面的这串地址是原图,原图是png格式的 一般来说质量比较好,尺寸比较大,那有没有一种格式能保证质量差不多的前提还能缩小尺寸呢? 答案是有的 那就是谷歌推出的webp格式

摘录至维基百科
WebP(发音:weppy)是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式。

WebP最初在2010年9月发布,其支持库于2018年4月发布1.0版本。截至2021年5月,已有94%的浏览器支持此格式。

WebP的设计目标是在减少文件大小的同时,达到和JPEG、PNG、GIF格式相同的图片质量,并希望借此能够减少图片档在网络上的发送时间。根据Google较早的测试,WebP的无损压缩比网络上找到的PNG档少了45%的文件大小,即使这些PNG档在使用pngcrush和PNGOUT处理过,WebP还是可以减少28%的文件大小。

WebP支持的像素最大数量是16383x16383。有损压缩的WebP仅支持8-bit的YUV 4:2:0格式。而无损压缩(可逆压缩)的WebP支持VP8L编码与8-bit之RGBA色彩空间。而无论是有损或无损压缩皆支持Alpha透明通道、ICC色彩配置、XMP诠释资料。

WebP有静态与动态两种模式。动态WebP(Animated WebP)支持有损与无损压缩、ICC色彩配置、XMP诠释资料、Alpha透明通道。

那么浏览器/设备的兼容性如何呢?

https://cdn.relsoul.com/public/uploads/soul/2023-06-17/b3839bb7-78c7-4ec3-add9-23fc23333c88.png

从上图可以看出大部分现代浏览器和设备都已经支持了,如果不考虑古早设备的话,可以放心大胆的用起来了。

# webp实际效果如何?

拿一张尺寸比较大的图片为例吧

https://cdn.relsoul.com/public/uploads/soul/2023-06-15/ba0555b8-127c-442f-90c4-891089999c05.jpg

https://cdn.relsoul.com/public/uploads/soul/2023-06-17/ebde4999-fecb-4415-84ff-25fa74797872.png

可以看到原图的大小为4000x2999,尺寸为2.2MB,那么转为webp格式后的尺寸是多少呢?
https://cdn.relsoul.com/public/uploads/soul/2023-06-15/ba0555b8-127c-442f-90c4-891089999c05.jpg?f=webp
复制上面的代码浏览器打开即是webp格式

https://cdn.relsoul.com/public/uploads/soul/2023-06-17/8a5b136e-5054-40bc-9640-44d375b16598.png

转化为webp后,尺寸减少了500kb 也就是22%的压缩率。质量的话可以对比两个图片均无太大区别。


# minify的格式转化支持
https://cdn.relsoul.com/public/uploads/soul/2023-06-15/ba0555b8-127c-442f-90c4-891089999c05.jpg?f=webp
可以看到通过minify的服务在图片的路径后面加了一个`?f=webp`,这个的意思就是转化当前图片为webp格式,那么当然也可以`?f=png`,`?f=jpeg`的形式


# minify的尺寸转化支持
https://cdn.relsoul.com/public/uploads/soul/2023-06-15/ba0555b8-127c-442f-90c4-891089999c05.jpg?f=webp

还是以上图为例,某些场景下并不需要那么大的一个尺寸输出,通过minify可以快速的等比调整图片尺寸

https://cdn.relsoul.com/public/uploads/soul/2023-06-15/ba0555b8-127c-442f-90c4-891089999c05.jpg?f=webp&w=1920

通过添加`w=1920`即可实现图片转化操作,在不指定高度的前提会自动进行高度适应裁剪。那么同理 通过添加`h=600` 会自动根据高度裁剪
https://cdn.relsoul.com/public/uploads/soul/2023-06-17/084b2c2e-d5b8-45a3-8049-da8595a9c8ed.png?f=webp&h=600


# 难道没有缺点么?

有,并且不止一个,阿里云等云服务商的oss服务也提供了上述的尺寸转化支持,只不过需要付费,并且云厂商提供的转化效率更高,并且还有缓存技术,minify依赖于本身服务器的算力,上述用的服务器配置为1核,2g内存,目前来看压力负债还好。
通过cloudflare提供的cdn及缓存加速服务,重复的图片实际上流量并没有打到实际服务器上。

本文仅供有一定动手能力,自有服务器的玩家进行尝试,毕竟代替方案还是挺多的。

看到这里不点个赞咩?





xsdianeht 发表于 2023-6-18 16:00

本帖最后由 xsdianeht 于 2023-6-18 16:02 编辑

可以上avif把,现在浏览器和系统都支持了
https://www.bilibili.com/read/cv22543150

relsoul 发表于 2023-6-18 16:03

xsdianeht 发表于 2023-6-18 16:00
可以上avif把,现在浏览器和系统都支持了
https://www.bilibili.com/read/cv22543150

底层框架也是支持的,只是在format的allow格式没有开放出来,配置一下json就👌了

ref: https://sharp.pixelplumbing.com/api-output#toformat

relsoul 发表于 2023-6-18 16:04

xsdianeht 发表于 2023-6-18 16:00
可以上avif把,现在浏览器和系统都支持了
https://www.bilibili.com/read/cv22543150

avif的兼容性基本上还是有点新的
https://cdn.relsoul.com/public/uploads/soul/2023-06-18/7fcda91f-6fbc-47da-a846-a76ed4c7b739.png?f=webp

xsdianeht 发表于 2023-6-18 16:10

relsoul 发表于 2023-6-18 16:03
底层框架也是支持的,只是在format的allow格式没有开放出来,配置一下json就👌了

ref: https://sharp.p ...

[可爱]感谢,picgo的压缩真不好用,经常抽风,还是服务器端压缩靠谱

BFG9K 发表于 2023-6-18 16:15

我之前图都是传z4a上的,太累了,久而久之就不怎么带图发帖了

可以抱的萝卜 发表于 2023-6-18 16:16

牛逼,虽然看不太懂,还是要支持下,另外我一直用的是https://imgse.com/

qy680ty 发表于 2023-6-18 16:26

本帖最后由 qy680ty 于 2023-6-18 16:28 编辑

支持一下!!


提供一个透明背景的本站logo,分辨率256x256

自取链接(⬅可点击)


如下图有水印,可点上面链接自取原图,否则右键保存即可



.

xsdianeht 发表于 2023-6-18 16:58

CAVIF默认,1.24MB
http://imgbed1212.test.upcdn.net/CAVIF.avif
AVIFENC CQ36,616KB
http://imgbed1212.test.upcdn.net/CQ36.avif

Narumi 发表于 2023-6-18 17:23

我只希望这个贴能让轮子把签名档恢复回来。

kkyaaaa 发表于 2023-6-18 17:25

6,楼主牛皮

阿诺德施瓦辛格 发表于 2023-6-18 17:32

我直接牛逼

endlessbest 发表于 2023-6-18 17:38

牛啊!!!!!自己家里DDNS出来的服务器可以用吗?

relsoul 发表于 2023-6-18 17:50

endlessbest 发表于 2023-6-18 17:38
牛啊!!!!!自己家里DDNS出来的服务器可以用吗?

可以,本身监听的是本地10244的http 端口,通过nginx反向代理即可,等下周我把docker部署和nginx部署的文档再完善一下,后面部署就简单很多了

relsoul 发表于 2023-6-18 17:51

qy680ty 发表于 2023-6-18 16:26
支持一下!!




后面的版本我觉得可以加个上传水印功能

relsoul 发表于 2023-6-18 17:56

可以抱的萝卜 发表于 2023-6-18 16:16
牛逼,虽然看不太懂,还是要支持下,另外我一直用的是https://imgse.com/

对,公开的图床也是一种解决方案,有些公开的图床不会保存上传的文件太久,也有一些没办法输出原始图都会压缩一下,同时裁剪功能可能也是缺失的

relsoul 发表于 2023-6-18 17:57

xsdianeht 发表于 2023-6-18 16:58
CAVIF默认,1.24MB
http://imgbed1212.test.upcdn.net/CAVIF.avif
AVIFENC CQ36,616KB


这个压缩率可以

relsoul 发表于 2023-6-18 17:58

xsdianeht 发表于 2023-6-18 16:10
感谢,picgo的压缩真不好用,经常抽风,还是服务器端压缩靠谱

picgo本身也是一个浏览器,底层压缩也是js,实际上可以在插件中引用服务端的压缩工具,也可以实现上述的效果😃

Kotaka 发表于 2023-6-18 18:09

lznb,挺不错的,学到了

andyaldi 发表于 2023-6-18 18:13

最近也在准备重新学一下nestjs,一直在用expressjs,三年前用过一段时间nestjs,有点抽象,各种装饰器……有点不太好理解。后来大部分后端只用express,也就作罢了。

可以抱的萝卜 发表于 2023-6-18 19:32

relsoul 发表于 2023-6-18 17:56
对,公开的图床也是一种解决方案,有些公开的图床不会保存上传的文件太久,也有一些没办法输出原始图都会 ...

可以私信下这个12美元是哪的服务器吗,给下运营商,谢谢了

sad1111 发表于 2023-6-18 21:08

战马         

该ID用户不存在 发表于 2023-6-19 00:19

看不懂也支持一下

bigeblis 发表于 2023-6-19 07:54

fcs15963 发表于 2023-6-19 07:56

我一直用画图放缩,500kb的清晰度还是可以的

Sieben 发表于 2023-6-19 08:55

[生病]一直用的sm.ms,因为是之前买的终身高级会员

litccc 发表于 2023-6-19 09:04

支持一下,我记得sharex可以添加自用图床

tasagapro 发表于 2023-6-19 09:11

膜拜高手[可爱]

relsoul 发表于 2023-6-19 18:10

litccc 发表于 2023-6-19 09:04
支持一下,我记得sharex可以添加自用图床

right,不过每个服务端的上传接口和定义都不一样,这个估计得额外处理

relsoul 发表于 2023-6-19 18:10

bigeblis 发表于 2023-6-19 07:54
门槛好高!闲置服务器这玩意一般人没有吧?

哈哈,这倒是,我的这台吃灰太久了,每个月流量都剩下900多G,正好图床利用起来
页: [1] 2
查看完整版本: 为了能在chiphell上发大图,我写了一款图床软件