不懂就问: png 格式图片转成 jpeg,到底算什么类型的图片

2020-10-11 18:56:23 +08:00
 XingWu

众所周知,jpeg 的图片不能有透明背景色

那我要是将一张透明背景色的 png,修改为 jpeg 后缀,打开仍然是透明的,它算什么格式呢?

8870 次点击
所在节点    JavaScript
73 条回复
fiveelementgid
2020-10-12 15:23:51 +08:00
改后缀就算转格式了??????

windows 惯的.....建议用用 file 命令
linvaux
2020-10-12 15:29:13 +08:00
被 windows 惯坏了的楼主🌚
u6pM63mMZ34z32cE
2020-10-12 15:49:08 +08:00
png 转 jpeg 小工具: https://mebtte.com/png_to_jpeg
exiledkingcc
2020-10-12 16:22:23 +08:00
@no1xsyzy 非常同意
通过后缀名判断文件类型才是大有问题的操作。
文件名本质上并不属于文件本身,而是属于文件系统。
历史上对于文本文件没有文件头的设计真是太糟糕了。
要是重新设计这一套东西,所有文件使用统一的可扩展的文件头才是最好的。
krixaar
2020-10-12 16:48:22 +08:00
@XingWu #44 实际上你看多了图片 base64 会发觉总有那么一些图片开头永远是“/9j/”,又有一部分图片开头永远是“iVBORw0KGgo”,当你产生这个疑虑的时候,你这个问题就解决了,并不是不带头,而是你还没发觉。
因为.jpg 文件开头一般都是 FF D8 FF,base64 就是“/9j/”,而.png 文件开头必然是 89 50 4E 47 0D 0A 1A 0A,base64 就是“iVBORw0KGgo”,尤其是 50 4E 47 实际上就是 ASCII 的“PNG”,你用记事本打开.png 文件一定会在开头看到这三个字母。
再闲着无聊的话,把.zip 和.docx .xlsx .pptx 用记事本打开,开头都是奇特而统一的“PK”两个字母( Phil Katz ),这又意味着什么呢?
no1xsyzy
2020-10-12 18:24:18 +08:00
@exiledkingcc 不过一个好处是可以在图片后面嵌压缩包隐写互不干扰。
至于统一文件头,HTTP 可不就是(
甚至作为电子邮件的附件的话可以封装任何文件
Xusually
2020-10-12 18:41:29 +08:00
@no1xsyzy macOS 有话说:右键-显示包内容
lxilu
2020-10-12 23:34:52 +08:00
@krixaar #65 936 塒 NG
secondwtq
2020-10-13 02:25:23 +08:00
扩展名和文件内容都只能用来”辅助“判断文件类型。或者说都是 heuristic,再直白点说就是都是不靠谱的。

我做 3D 建模会用到 Wavefront .obj 文件,这扩展名很明显和 Windows 的 Object File 冲突了,然而它是 3D 多边形模型的一种 ASCII 表示,并不能当作 Object File 来用。这个好像还算好的,但是 Wavefront .obj 是很老的东西了,现在流行用 Alembic 格式 (.abc),这个扩展名,我查到的至少有四种用途,我显出极高兴的样子,将两个指头的长指甲敲着柜台,问楼主,这四种用途,你知道么?
而且扩展名是文件名的一部分,我每次输入文件名都得写一遍,为了简短还不得不用缩写,这不仅大大增大了冲突,而且还严重影响用户友好性——不仅是更麻烦了,每个新用户都必须学习”扩展名“这种概念,稍微 non-trivial 的用户必须学习如何 disambiguate 扩展名,我犯得着么?(顶级域名的情况貌似很类似,还得附加一条被少数实体控制垄断,甚至有人喜欢用奇葩的顶级域名凑字)
根据文件内容判断就更不用说了,C 和 C++ 头文件的扩展名都是 .h (虽然我写 C++ 会用 .hxx/.cxx ,架不住大多数 C++ 项目用 .h ),我 file 一个 C++ 头文件告诉我是 C source ... 更离谱的是就连 Standard ML 源码都会给我报成 C source ... 综合看来,如果用于程序识别,还没扩展名靠谱呢
更不用说两者都有完全无法识别的 ”any“ case

有些文件管理器会把两种 heuristic 结合起来用,但是这种事情就像一个烂剧,剧本本身就烂透了,多请两个大腕明星还是烂剧。
这个问题的根源在”数据“和”解释数据的方式“一般是分离的。比如 UNIX 下的 file 命令使用 libmagic 来实现,libmagic 有一个数据库(说是一个 DSL 库也无所谓),定义了一堆 heuristic 来判断到底是什么文件( https://github.com/file/file/tree/master/magic/Magdir )。显然这是不靠谱的,正确地判断文件类型你得给每种文件配一个 verifier,比如检查是不是 C++ 源码你得放一个 C++ 编译器进去,这就有点像停机问题了 ...

再说到底“文件“这个东西本身就是个主要考虑地球人类整体水平和智商兼容的设计,必然会遇到这种问题,本贴只是冰山一角罢了。
dany813
2020-10-13 09:39:14 +08:00
有意思的话题啊
no1xsyzy
2020-10-13 13:27:08 +08:00
@secondwtq 就是添加了 verifier 还有个奇葩在:
https://codegolf.stackexchange.com/questions/102370/add-a-language-to-a-polyglot
这个 answer-chaining 的挑战目标是:同一段程序,不接受输入,但不同的语言会产生不同的输出,从 1 、2 一直往上数 —— 并且必须接着前一个人的来。
不要说数据和解析数据的方式分离,同一份数据甚至本身就可以有多种解析方式。
XingWu
2020-10-13 14:23:47 +08:00
@krixaar 真的涨知识了,没留意过,原来这里其实标注了。谢谢科普
source
2020-11-26 18:44:22 +08:00
@krixaar #65 谢谢你,在长久的压抑中我又找回了一些因为学习到新知识而产生的短暂的快乐

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/713957

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX