找回密码
 加入我们
搜索
      
查看: 9180|回复: 35

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

[复制链接]
发表于 2023-6-18 15:53 | 显示全部楼层 |阅读模式
本帖最后由 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://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



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




# 上传完图片如何使用?


上传完图片后会得到一个url地址比如这个
  1. https://cdn.relsoul.com/public/uploads/soul/2023-06-16/38c5c5e8-9b4c-4a04-ae73-67e8dc894abd.png
复制代码

上面的这串地址是原图,原图是png格式的 一般来说质量比较好,尺寸比较大,那有没有一种格式能保证质量差不多的前提还能缩小尺寸呢? 答案是有的 那就是谷歌推出的webp格式

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

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

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

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

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


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



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

# webp实际效果如何?

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

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




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

复制上面的代码浏览器打开即是webp格式



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


# minify的格式转化支持
  1. 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的尺寸转化支持
  1. https://cdn.relsoul.com/public/uploads/soul/2023-06-15/ba0555b8-127c-442f-90c4-891089999c05.jpg?f=webp
复制代码


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

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


通过添加`w=1920`即可实现图片转化操作,在不指定高度的前提会自动进行高度适应裁剪。那么同理 通过添加`h=600` 会自动根据高度裁剪



# 难道没有缺点么?

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

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

看到这里不点个赞咩?





评分

参与人数 8邪恶指数 +115 收起 理由
skanlife + 30
两只大狗 + 10 就是NB
迷彩在褪色 + 10
狐妹是我的 + 20
醉酒棕熊 + 20
gaojian520 + 10
summerq + 5
bluesky1234 + 10

查看全部评分

发表于 2023-6-18 16:00 | 显示全部楼层
本帖最后由 xsdianeht 于 2023-6-18 16:02 编辑

可以上avif把,现在浏览器和系统都支持了
https://www.bilibili.com/read/cv22543150
 楼主| 发表于 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
 楼主| 发表于 2023-6-18 16:04 | 显示全部楼层
xsdianeht 发表于 2023-6-18 16:00
可以上avif把,现在浏览器和系统都支持了
https://www.bilibili.com/read/cv22543150

avif的兼容性基本上还是有点新的
发表于 2023-6-18 16:10 | 显示全部楼层
relsoul 发表于 2023-6-18 16:03
底层框架也是支持的,只是在format的allow格式没有开放出来,配置一下json就👌了

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

感谢,picgo的压缩真不好用,经常抽风,还是服务器端压缩靠谱
发表于 2023-6-18 16:15 来自手机 | 显示全部楼层
我之前图都是传z4a上的,太累了,久而久之就不怎么带图发帖了
发表于 2023-6-18 16:16 | 显示全部楼层
牛逼,虽然看不太懂,还是要支持下,另外我一直用的是https://imgse.com/
发表于 2023-6-18 16:26 | 显示全部楼层
本帖最后由 qy680ty 于 2023-6-18 16:28 编辑

支持一下!!


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

自取链接⬅可点击


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


.
发表于 2023-6-18 16:58 | 显示全部楼层
发表于 2023-6-18 17:23 | 显示全部楼层
我只希望这个贴能让轮子把签名档恢复回来。
发表于 2023-6-18 17:25 | 显示全部楼层
6,楼主牛皮
发表于 2023-6-18 17:32 | 显示全部楼层
我直接牛逼
发表于 2023-6-18 17:38 | 显示全部楼层
牛啊!!!!!自己家里DDNS出来的服务器可以用吗?
 楼主| 发表于 2023-6-18 17:50 | 显示全部楼层
endlessbest 发表于 2023-6-18 17:38
牛啊!!!!!自己家里DDNS出来的服务器可以用吗?

可以,本身监听的是本地10244的http 端口,通过nginx反向代理即可,等下周我把docker部署和nginx部署的文档再完善一下,后面部署就简单很多了
 楼主| 发表于 2023-6-18 17:51 来自手机 | 显示全部楼层
qy680ty 发表于 2023-6-18 16:26
支持一下!!



后面的版本我觉得可以加个上传水印功能
 楼主| 发表于 2023-6-18 17:56 来自手机 | 显示全部楼层
可以抱的萝卜 发表于 2023-6-18 16:16
牛逼,虽然看不太懂,还是要支持下,另外我一直用的是https://imgse.com/

对,公开的图床也是一种解决方案,有些公开的图床不会保存上传的文件太久,也有一些没办法输出原始图都会压缩一下,同时裁剪功能可能也是缺失的
 楼主| 发表于 2023-6-18 17:57 来自手机 | 显示全部楼层
xsdianeht 发表于 2023-6-18 16:58
CAVIF默认,1.24MB
http://imgbed1212.test.upcdn.net/CAVIF.avif
AVIFENC CQ36,616KB

这个压缩率可以
 楼主| 发表于 2023-6-18 17:58 来自手机 | 显示全部楼层
xsdianeht 发表于 2023-6-18 16:10
感谢,picgo的压缩真不好用,经常抽风,还是服务器端压缩靠谱

picgo本身也是一个浏览器,底层压缩也是js,实际上可以在插件中引用服务端的压缩工具,也可以实现上述的效果😃
发表于 2023-6-18 18:09 | 显示全部楼层
lznb,挺不错的,学到了
发表于 2023-6-18 18:13 | 显示全部楼层
最近也在准备重新学一下nestjs,一直在用expressjs,三年前用过一段时间nestjs,有点抽象,各种装饰器……有点不太好理解。后来大部分后端只用express,也就作罢了。
发表于 2023-6-18 19:32 | 显示全部楼层
relsoul 发表于 2023-6-18 17:56
对,公开的图床也是一种解决方案,有些公开的图床不会保存上传的文件太久,也有一些没办法输出原始图都会 ...


可以私信下这个12美元是哪的服务器吗,给下运营商,谢谢了
发表于 2023-6-18 21:08 | 显示全部楼层
战马         
发表于 2023-6-19 00:19 | 显示全部楼层
看不懂也支持一下
发表于 2023-6-19 07:54 | 显示全部楼层
门槛好高!闲置服务器这玩意一般人没有吧?
发表于 2023-6-19 07:56 | 显示全部楼层
我一直用画图放缩,500kb的清晰度还是可以的
发表于 2023-6-19 08:55 | 显示全部楼层
一直用的sm.ms,因为是之前买的终身高级会员
发表于 2023-6-19 09:04 | 显示全部楼层
支持一下,我记得sharex可以添加自用图床
发表于 2023-6-19 09:11 | 显示全部楼层
膜拜高手
 楼主| 发表于 2023-6-19 18:10 | 显示全部楼层
litccc 发表于 2023-6-19 09:04
支持一下,我记得sharex可以添加自用图床

right,不过每个服务端的上传接口和定义都不一样,这个估计得额外处理
 楼主| 发表于 2023-6-19 18:10 | 显示全部楼层
bigeblis 发表于 2023-6-19 07:54
门槛好高!闲置服务器这玩意一般人没有吧?

哈哈,这倒是,我的这台吃灰太久了,每个月流量都剩下900多G,正好图床利用起来
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-2-4 13:50 , Processed in 0.014989 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

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