众所周知,jpeg 的图片不能有透明背景色
那我要是将一张透明背景色的 png,修改为 jpeg 后缀,打开仍然是透明的,它算什么格式呢?
1
dzdh 2020-10-11 18:58:42 +08:00 2
emmmm.....
你用记事本打开,看前几个字符 。。 后缀本身就没什么意义 |
2
rmb1222 2020-10-11 18:58:45 +08:00 via Android 10
png,能打开是因为图片浏览器并不是依靠文件后缀名来区别格式
|
3
xiri 2020-10-11 19:01:23 +08:00 via Android
后缀只是为了方便人区分才加上去的,是文件名的一部分,并不决定文件类型
|
4
xiri 2020-10-11 19:03:51 +08:00 via Android
@xiri 都是被 windows 惯的,用过 linux 或者其他类 unix 系统的话就不会问出这种问题了
|
5
waterThing 2020-10-11 19:05:39 +08:00
改名不能算`转`吧,就像一个男人改名字改成秋香,听起来是女的,本质上还是男的,所以算是后缀错误的 png 图片。
|
6
felixcode 2020-10-11 19:26:01 +08:00 via Android 29
后缀改成 mp4,看看能不能动起来
|
7
ho121 2020-10-11 19:26:38 +08:00 via Android
你把 png 改成 mp4,就能动了?
|
8
littlewing 2020-10-11 19:27:59 +08:00 2
JavaScript 版居然还有人问这种问题
|
9
intellectual 2020-10-11 19:31:45 +08:00
本身都是位图。
png 默认不压缩画质,jpg 默认可压缩画质。 当然,你也可以把压缩后的 jpg 转成 png,但损伤的过程是不可逆的。。。 你就老老实实根据人家原理干,别强制把 png 后缀改成 jpg 后缀,虽然软件容错可以打开且透明,但意义何在? |
10
Mutoo 2020-10-11 19:31:46 +08:00 1
$ file wallpaper.jpg
wallpaper.png: PNG image data, 1280 x 1024, 8-bit/color RGBA, non-interlaced |
11
px920906 2020-10-11 19:33:08 +08:00 8
想起了另一个神操作:通过拷贝快捷方式安装程序
不知道是真小白还是钓鱼 |
12
vhysug01 2020-10-11 19:47:54 +08:00
每种文件类型都有自己的编码格式呀,图片查看软件应该做了一层兼容
|
13
user8341 2020-10-11 19:48:19 +08:00 1
是操作系统功能太不人性化,不能领会用户改文件后缀就是要转换文件类型。
|
14
hello2060 2020-10-11 19:49:17 +08:00 via iPhone
@waterThing 😂我服了你了
|
15
watzds 2020-10-11 19:50:07 +08:00 via Android 1
我考考你,.js 文件改成.java,会怎么样?
|
16
microka 2020-10-11 20:02:15 +08:00
看楼主也算是位「程序员」吧?把文件后缀改改就等于格式转换? excuse me?
|
17
AX5N 2020-10-11 20:19:17 +08:00
这是一个有趣的知识点,有趣的地方在于恰好有一部分人懂,又有一部分人不懂。大多数人都不知道打开一个文件所经历的过程,但有的人就是能强行猜出背后逻辑的大概,有的人就一脸懵逼。还有一个有趣的地方就是,这类知识从来没人教。
|
18
AX5N 2020-10-11 20:20:20 +08:00 6
这是一个有趣的知识点,有趣的地方在于这类知识从来没人教,但恰好有一部分人懂,又有一部分人不懂。大多数人都不知道打开一个文件所经历的过程,但有的人就是能强行猜出背后逻辑的大概,有的人就一脸懵逼。
改了下行文 |
19
em70 2020-10-11 20:24:59 +08:00
好的图像软件都会不信任后缀,会根据文件头来判断文件格式,早期的 PS 如果把 PNG 改成 jpg 就打不开,就因为那时候 PS 按后缀去解析当然出错了,现在已经不这样了
|
20
xupefei 2020-10-11 21:01:00 +08:00 via iPhone 1
|
21
ETiV 2020-10-11 21:18:09 +08:00
应该是被使用 Windows 的惯性带下来的?
文件扩展名 != 文件数据的表达 |
22
JerryCha 2020-10-11 21:40:58 +08:00
你不会以为 jpeg 存的是 rgb 数据吧
|
23
deplives 2020-10-11 21:58:49 +08:00
所以你以为改个文件后缀就能发明一个新的文件格式了
|
24
ysc3839 2020-10-12 00:34:12 +08:00 3
@xiri 后缀不仅仅是给人看的也是给部分程序看的。
除了 Windows,一些 Linux 的桌面环境,以及 Android 、macOS 也会通过文件后缀来区分文件类型,不见得所有类 Unix 系统都是通过读取文件内容来区分文件类型的。 而且读取文件内容来区分文件类型并不是一个很好的设计。设想一下你在网络不好的情况下挂载了个远程文件系统,然后文件管理器给你把每个文件都读一遍来显示文件类型,你必须等半天等它读完,这是个好设计吗? |
26
vk42 2020-10-12 01:54:09 +08:00
lz 重新定义了“转格式”
|
27
crab 2020-10-12 02:50:19 +08:00
文件类型,文件扩展名的区别。这种拉入看下 16 进制头部。
|
28
KasuganoSoras 2020-10-12 04:14:23 +08:00 1
|
29
xiadong1994 2020-10-12 04:26:21 +08:00
@ysc3839 所以文件类型是写在文件最开始的……
|
30
vmebeh 2020-10-12 07:53:45 +08:00 via iPhone
|
31
jinliming2 2020-10-12 08:36:32 +08:00 1
@ysc3839
> 除了 Windows,一些 Linux 的桌面环境,以及 Android 、macOS 也会通过文件后缀来区分文件类型,不见得所有类 Unix 系统都是通过读取文件内容来区分文件类型的。 这句不对,这些系统并不是根据后缀拓展名来区分文件类型的,而是根据扩展名来决定 [使用什么程序来处理这个文件] ,相当于给文件进行一个不强制的分类而已。比如看到 .aaa 后缀就交给 A 程序处理,看到 .bbb 后缀就交给 B 程序处理。 windows 下也是如此,正如 @AX5N #17 #18 说的那样,这类知识没人教,所以很多人认为 Windows 下是通过扩展名来识别文件类型的。其实不是,Windows 也仅仅是根据扩展名来决定使用哪个程序来处理这类文件而已。 > 而且读取文件内容来区分文件类型并不是一个很好的设计。 是不是一个好的设计我不知道,但至少现在几乎所有程序都是根据文件内容来区分文件类型的,区分的方法是判断“文件头”,也就是文件开头的几个字节是什么。 而通过文件扩展名来识别文件类型却并不可靠,比如 @em70 #19 说的早期 PS 如果图片扩展名不对就打不开。并且现在网上有好多的图片文件扩展名也都不对,网络上一般通过 Content-Type 中的 MIME 信息来标识文件的处理方式,比如是图片还是视频,还是要求下载。所以网络上的图片很大一部分都是没有扩展名的,这就导致你右键另存为之后文件没有后缀而打不开。 (当然,这里很多人会不管图片具体是什么格式而直接将扩展名改成 .jpg 或者 .png ,告诉系统这是张图片,用图片查看器打开就行,图片查看器通常不会管你的拓展名是啥,而是根据文件内容的前几个字节来判断文件类型进行解析渲染) |
32
HenryWang0723 2020-10-12 09:21:07 +08:00
改后缀不算转格式吧
|
33
idtaanlcoe 2020-10-12 09:38:09 +08:00 via Android
依然是 png 格式,改后缀不会影响编码,打开的时候依然是 png 编码解析出来
|
34
12101111 2020-10-12 09:40:46 +08:00
有一些格式具有相同的扩展名,但是却有不同的版本(比如 rar 和 rar5)
有一些格式具有相同的扩展名,但是扩展名只是对应一个容器,具体的编码方式存储在容器内部(比如 mp4 和 webp 是容器格式, H.264 H.265 vp9 是编码方式) |
35
azcvcza 2020-10-12 09:45:42 +08:00
小时候我看电脑里一大堆莫名其妙的后缀,就猜要根据前几个位置的标志来做区分读写。.jpeg 和.png 如果标志位都一样,那读取器应该不会读取失败,顶多是某些格式必要信息是空的
|
36
guochao 2020-10-12 09:48:27 +08:00 1
拓展名只是为了方便人阅读,以及一部分程序员偷懒,所创作出的文件命名方式,本身并不决定文件的类型。改名并不会影响文件本身的格式,格式和协议是说数据构成的方式,但是可能会改变一些程序默认的处理文件的方式。
换个说法,你有一本射雕英雄传.武侠小说,包了个书皮上面写数学.学习资料,那么这份资料究竟是武侠小说呢,还是学习资料呢?显然换了个名字并不影响本身的内容,但是会让管理员本来要把小说放到小说区,结果一看书皮是学习资料就放到了教辅区。但是同学打开这本书,如果认得是武侠小说,就会在看小说的时候打开,如果不认识这本小说,轻则扔到一遍重则走火入魔 |
37
ccbikai 2020-10-12 09:52:06 +08:00
后缀只是给人读的,机器读的时候不关注后缀
|
39
crella 2020-10-12 09:55:54 +08:00 via Android
这样用 irfanview 打开的时候就会提示是使用了错误后缀的 png 文件了
|
40
zhuweiyou 2020-10-12 10:06:29 +08:00
改后缀 不等于改格式
|
41
Leonard 2020-10-12 10:07:40 +08:00
直接改名不算转
|
42
guochao 2020-10-12 10:12:46 +08:00
发烧了隔离着,脑子不大好使,丢三落四的。重发一下
拓展名只是为了方便人阅读,以及一部分程序员和程序偷懒,所创作出的文件命名方式,本身并不决定文件的类型。改名并不会影响文件本身的格式,格式和协议是说数据构成的方式,但是改文件名可能会改变一些程序默认的处理文件的方式。偷懒并不是说有什么不好,而是各种因素限制我们不得不用简单的办法处理。 换个说法,你有一本射雕英雄传.武侠小说,包了个书皮上面写数学.学习资料,那么这份资料究竟是武侠小说呢,还是学习资料呢?显然换了个名字并不影响本身的内容,但是会让管理员本来要把小说放到小说区,结果一看书皮是学习资料就放到了教辅区。但是同学打开这本书,如果认得是武侠小说,就会在看小说的时候打开,如果不认识这本小说,轻则扔到一遍重则走火入魔 |
43
geelaw 2020-10-12 10:18:28 +08:00 7
区分三个概念:
- 识别文件处理程序的机制 - 文件格式 - 文件类型 “机制”在 Windows 世界里即 MIME 类型和扩展名,“格式”是通用、良定义概念,即所有有效文件内容构成的集合,楼主的问题在于不理解或者不能形成“类型”的良定义,且会混淆“格式”和“类型”的概念。 可以如此定义:文件是“A 类型”当且仅当它是 A 格式且具有正确识别 A 的处理程序的机制。 那么在 Windows 里,把磁盘上有效的 PNG 类型文件的扩展名改为 .jpg ,那么该文件仍然是 PNG 格式,但不再具有正确的识别机制,从而不是有效的 PNG 类型的文件,由于 PNG 格式和 JPEG 格式不相交,也可以推断该文件不是有效的 JPEG 格式的文件,从而也不可能是有效的 JPEG 类型的文件。 再举一个例子:考虑修改有效的 C++ 源代码类型的文件的扩展名为 .txt ,由于文本格式是 C++ 源代码格式的超集,可以判断修改后的文件仍然是有效的文本类型的文件,且仍然是有效的 C++ 源代码格式的文件,但不再是有效的 C++ 源代码类型的文件。 再举一个例子:考虑一个不使用扩展名和 MIME 类型的系统,在这个系统里修改扩展名不会对格式和类型产生任何影响。 @jinliming2 #31 在几乎所有现实的系统中,读取文件名比文件内容的前几个字节效率都要高很多倍。如果文件类型需要在 UI 上有所反映(例如不同类型的文件可以有不同的操作,而不仅仅是“打开”一个操作,或者不同类型的文件需要使用不同的图标等),那么通过文件内容识别绝对是糟糕透顶的设计。 另外几乎所有值得使用的浏览器都会在另存为的时候自动识别 MIME 类型并通过文件关联查询 MIME 类型对应的扩展名,然后帮用户加上。 |
44
XingWu OP 感谢各位大大给的回应
其实是因为一个需求引发的我这个问题。一张图片转的 base64,不带头,我不知道原格式。但是 img 标签我加上任意头的格式都能展示这个图片并下载为对应格式,因此引发了我这个问题。 大概了解了,拓展名只是为了方便人阅读,改名并不会影响文件本身的格式,格式和协议是说数据构成的方式。 @guochao 感谢各位老哥 |
46
NoirStrike 2020-10-12 10:31:17 +08:00
@px920906 #11 别说了, 小学的时候干过
|
47
est 2020-10-12 10:33:35 +08:00
你这光改后缀还不算,还得改 content-type 的 mime
|
48
XingWu OP @jinliming2 非常感谢层主的解答
|
49
lff0305 2020-10-12 10:36:50 +08:00
以前遇到过一个 bug,一些图片( png)在 PORD 上打不开 404,但是开发测试环境都没事
后来发现,这些 PNG 实际上是 JPG PROD 上的防火墙 /负载均衡发现该资源的 mime type 和真实的 type 不一致,直接 404 |
50
vcode 2020-10-12 10:48:52 +08:00
哦豁,涨姿势了嘿嘿
|
51
no1xsyzy 2020-10-12 11:08:32 +08:00 2
楼主用 Irfanview 的话就不会这个问题,因为 Irfanview 会提示类似 “看上去像是一个 .jpg 后缀的 PNG 文件,是否要自动把后缀名改成 .png ?”
@geelaw #43 应该算是 nominal / structural 的区分(最近翻译 Python 3.9 文档,library--typing 第 52 段,Nominal vs structural subtyping,目前是翻译成 “名义性子类型 区别于 结构性子类型”) @ysc3839 @jinliming2 @geelaw 承上述, 主要是,大部分情况下文件浏览器并不需要区分文件的结构类型,只需要简单区分文件的名义类型,知道靠什么东西进行后续处理即可。那么对于文件浏览器来说只需要读个文件名比较方便。 相对地,对于图片查看器而言,反正已经读取文件整体了,根据文件头来判断的话额外开销=0 ;反而如果强制根据后缀名会导致打开一次不成功改后缀再打开一次,相当于这个文件被读取两遍,最差条件下就是两倍的开销(还不包括重命名的开销),那显然应当根据文件头来判断。 不过,文件浏览器有时需要读取文件内容,比如缩略图、 .exe 的自定义图标等,因为读取文件内容开销高就不要缩略图功能了吗?抱歉,人类反复打开的动作开销那是高到天边去了。至于读取文件的开销问题,解决的方法一般是将生成缩略图的功能非阻塞地实现,缩略图较慢地生成并不影响其他操作。 说到底其实是个性价比问题。 |
52
no1xsyzy 2020-10-12 11:13:35 +08:00
@px920906 说道这个,我想起来说,哪个古老的操作系统可以把软件直接放桌面,因为一个软件就是一个文件夹,这个文件夹双击会启动程序,但同时也可以 cd 进去修改内容,那复制就真的可以了,现在的 Gnome 什么的跟快捷方式一样,一个 .desktop 还是什么的文件……
|
53
zqx 2020-10-12 11:59:25 +08:00 via Android
作为学过计算机科学与技术专业的,确实没有一门课专门讲授这些知识。
操作系统课程中的文件系统,不在考试范围内,所以老师不会重点讲,书上也不会详细介绍。 考试可能就考内存管理,指令集,处理器这些东西。 |
56
zsdroid 2020-10-12 12:51:58 +08:00
原来“拷贝文件就拷了个快捷方式”不是段子啊。
|
57
wangccddaa 2020-10-12 14:27:40 +08:00
图片只有两种格式 bitmap 和矢量图,png,jpg,webp 其实都是图片采用不同的压缩算法后传输格式,最终在绘制的时候在设备上还是要回归到位图或 矢量图来展示的。有点类似快递商和快递的关系
|
58
pheyer 2020-10-12 14:39:45 +08:00
这叫不叫新时代的掩耳盗铃
|
59
lxilu 2020-10-12 14:45:59 +08:00
@no1xsyzy #52 win: desktop.ini DirectoryClass=xxx, HKCR\xxx CanUseForDirectory; ClickOnce
|
61
fiveelementgid 2020-10-12 15:23:51 +08:00 via Android
改后缀就算转格式了??????
windows 惯的.....建议用用 file 命令 |
62
linvaux 2020-10-12 15:29:13 +08:00 via iPhone
被 windows 惯坏了的楼主🌚
|
63
u6pM63mMZ34z32cE 2020-10-12 15:49:08 +08:00
png 转 jpeg 小工具: https://mebtte.com/png_to_jpeg
|
64
exiledkingcc 2020-10-12 16:22:23 +08:00
@no1xsyzy 非常同意
通过后缀名判断文件类型才是大有问题的操作。 文件名本质上并不属于文件本身,而是属于文件系统。 历史上对于文本文件没有文件头的设计真是太糟糕了。 要是重新设计这一套东西,所有文件使用统一的可扩展的文件头才是最好的。 |
65
krixaar 2020-10-12 16:48:22 +08:00 2
@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 ),这又意味着什么呢? |
66
no1xsyzy 2020-10-12 18:24:18 +08:00
|
69
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++ 编译器进去,这就有点像停机问题了 ... 再说到底“文件“这个东西本身就是个主要考虑地球人类整体水平和智商兼容的设计,必然会遇到这种问题,本贴只是冰山一角罢了。 |
70
dany813 2020-10-13 09:39:14 +08:00
有意思的话题啊
|
71
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 一直往上数 —— 并且必须接着前一个人的来。 不要说数据和解析数据的方式分离,同一份数据甚至本身就可以有多种解析方式。 |