- 已编辑
根据四叶tg群与 @Wien 的讨论结果:
n0099 我没设过,flarum又不是我写的
结合flarum有关源码 https://github.com/flarum/framework/blob/main/framework/core/src/User/AvatarValidator.php
我的总结是提前v吧前前吧主BSDS集团阁下将您无法上传的图片原图以任意途径渠道发给我以便彻查其背后的原因
[right]本站更新记录与bug反馈[/right]
根据四叶tg群与 @Wien 的讨论结果:
n0099 我没设过,flarum又不是我写的
结合flarum有关源码 https://github.com/flarum/framework/blob/main/framework/core/src/User/AvatarValidator.php
我的总结是提前v吧前前吧主BSDS集团阁下将您无法上传的图片原图以任意途径渠道发给我以便彻查其背后的原因
[right]本站更新记录与bug反馈[/right]
Wien 他只要上传到本坛了就行了
我可以去拿到转webp之前他上传的图片文件
Wien 以及您的图片应该也不是最原始的图
一般来说数位板绘制的原图产出至少都是几M
现在问题的核心是获得
n0099 您无法上传的图片原图
这样我才有可能复现问题,而不是获得画师的原图
[right]本站更新记录与bug反馈[/right]
Wien 图片目前大小为106Kb
事实核查:他上传的原图也只有
$ file 1667113773-811898-1666748230997.jpg
1667113773-811898-1666748230997.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 96x96, segment length 16, comment: "CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90", baseline, precision 8, 1696x1718, components 3
[right]本站更新记录与bug反馈[/right]
Wien qq头像表面上是圆形 实际上还是方形吧
大多数圆形头像都是在显示的地方做裁剪,而不是服务端实际存储的头像图片是圆形(至于圆之外的图片边界框之内的像素是纯白还是纯黑还是png的alpha通道255(全透明)是实现细节)
Wien 那像素点这么多肯定不满足啊
满足什么?
[right]本站更新记录与bug反馈[/right]
Wien 您说的很对,但事实是这个由js实现的裁剪选区窗口输出的图片是高度原始的png,然后再把裁剪了的png传给flarum服务端
而当对于这张jpg,选区拖到最外面后其产生的png大小是2409795字节
正好超过了flarum服务端硬编码的的2048kib的文件字节限制:
https://github.com/flarum/framework/blob/201d7430feaaace581a07b15fd1161179da441ff/framework/core/src/User/AvatarValidator.php#L100
[right]本站更新记录与bug反馈[/right]
进一步的事实核查:
n0099 由js实现的裁剪选区窗口
具体是指的扩展 https://github.com/FriendsOfFlarum/profile-image-crop
追溯上传网络请求的callstack我们可以找到
在这里可以看见上传网络请求的multipart/form-data
的第一个文件的二进制内容来自blob变量,而blob变量又来自L90的canvas.toBlob()
的返回值,根据其文档 https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob 可知由于这里没有额外参数指定使用jpg或webp压缩并提供压缩quality值导致其会直接返回没有压缩的png,这也解释了此前
为什么能够指png为jpg
事实是这问题在扩展用户之中早有预言:
https://discuss.flarum.org/d/18286/28
https://github.com/FriendsOfFlarum/profile-image-crop/issues/15
并早已有人修复了这个问题并在3个月前其pr被merge
https://github.com/FriendsOfFlarum/profile-image-crop/pull/17
但不幸地
由浏览器扩展 https://github.com/refined-github/refined-github 向我提醒的
The merge commit doesn’t appear in any tags
意味着截止2022年11月,这个pr所造成的更改仍未反映在任何github tags及对应的packagist包版本之中
目前这个扩展的最新版本是去年11月发布的1.0.1,其对应的github tags和commit是 https://github.com/FriendsOfFlarum/profile-image-crop/commits/master#:~:text=Remove%20Bazaar%20reference
对于此问题我已致电该扩展repo的有关人士催促其进行一个包流程的发布: https://github.com/FriendsOfFlarum/profile-image-crop/pull/17#issuecomment-1296220944
[right]本站更新记录与bug反馈[/right]
Wien 所以像素点字节数量的上限亦是2 048 000 字节
1个图片文件有多少字节跟他有多少像素点(也就是分辨率的长乘宽)毫无关系
irol此前于zulip对此早有预言:建议一张1G大的图片只表达了一个像素
Wien 一张图片256彩色
什么经典gif的限制一张gif中的调色板只能有256色(也就是8bit color depth)带来的刻板印象; https://en.wikipedia.org/wiki/Palette_(computing)
令人想起了截止2022年都还在给gif图片采用像素抖动模拟比8bit更多的色彩像素(同时在显示器领域也有8bit抖10bit,那个10bit本质上是30bit color depth https://en.wikipedia.org/wiki/Color_depth#Deep_color_(30-bit))
https://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processing
比gif新的那些图片格式都早已提升至24bit color depth: https://en.wikipedia.org/wiki/Color_depth
Wien 原色纯白重复像素点上传
因为即便是无损的png他本身也有deflate压缩(zip格式也是defalte算法) https://en.wikipedia.org/wiki/Portable_Network_Graphics#Compression
所以如果一张png是纯色那即便他的分辨率很大最终的png文件也没有以bmp表达的纯色大(假设您的这张bmp没有optin任何压缩 https://en.wikipedia.org/wiki/BMP_file_format#Compression)
Wien 少了一个压缩流程(裁剪后仍大于2m字节的图像进行压缩)
所以那个pr https://github.com/FriendsOfFlarum/profile-image-crop/pull/17 的做法就是直接在裁剪选区图片后再把裁剪结果压到500x500px分辨率,这样可以降低触发后端的2048kib限制的概率
Wien 最终压缩只包含小于2m字节的图像然后产出为100×100图像
您说的这个最终压缩
发生于flarum服务端对经由头像上传网络请求携带的图片文件进行处理
[right]本站更新记录与bug反馈[/right]