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

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

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

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

8870 次点击
所在节点    JavaScript
73 条回复
Leonard
2020-10-12 10:07:40 +08:00
直接改名不算转
guochao
2020-10-12 10:12:46 +08:00
发烧了隔离着,脑子不大好使,丢三落四的。重发一下

拓展名只是为了方便人阅读,以及一部分程序员和程序偷懒,所创作出的文件命名方式,本身并不决定文件的类型。改名并不会影响文件本身的格式,格式和协议是说数据构成的方式,但是改文件名可能会改变一些程序默认的处理文件的方式。偷懒并不是说有什么不好,而是各种因素限制我们不得不用简单的办法处理。

换个说法,你有一本射雕英雄传.武侠小说,包了个书皮上面写数学.学习资料,那么这份资料究竟是武侠小说呢,还是学习资料呢?显然换了个名字并不影响本身的内容,但是会让管理员本来要把小说放到小说区,结果一看书皮是学习资料就放到了教辅区。但是同学打开这本书,如果认得是武侠小说,就会在看小说的时候打开,如果不认识这本小说,轻则扔到一遍重则走火入魔
geelaw
2020-10-12 10:18:28 +08:00
区分三个概念:

- 识别文件处理程序的机制
- 文件格式
- 文件类型

“机制”在 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 类型对应的扩展名,然后帮用户加上。
XingWu
2020-10-12 10:28:14 +08:00
感谢各位大大给的回应

其实是因为一个需求引发的我这个问题。一张图片转的 base64,不带头,我不知道原格式。但是 img 标签我加上任意头的格式都能展示这个图片并下载为对应格式,因此引发了我这个问题。

大概了解了,拓展名只是为了方便人阅读,改名并不会影响文件本身的格式,格式和协议是说数据构成的方式。 @guochao

感谢各位老哥
XingWu
2020-10-12 10:29:30 +08:00
@Mutoo 谢谢老哥,原来可以这样查看图片格式
NoirStrike
2020-10-12 10:31:17 +08:00
@px920906 #11 别说了, 小学的时候干过
est
2020-10-12 10:33:35 +08:00
你这光改后缀还不算,还得改 content-type 的 mime
XingWu
2020-10-12 10:35:52 +08:00
@jinliming2 非常感谢层主的解答
lff0305
2020-10-12 10:36:50 +08:00
以前遇到过一个 bug,一些图片( png)在 PORD 上打不开 404,但是开发测试环境都没事
后来发现,这些 PNG 实际上是 JPG
PROD 上的防火墙 /负载均衡发现该资源的 mime type 和真实的 type 不一致,直接 404
vcode
2020-10-12 10:48:52 +08:00
哦豁,涨姿势了嘿嘿
no1xsyzy
2020-10-12 11:08:32 +08:00
楼主用 Irfanview 的话就不会这个问题,因为 Irfanview 会提示类似 “看上去像是一个 .jpg 后缀的 PNG 文件,是否要自动把后缀名改成 .png ?”

@geelaw #43 应该算是 nominal / structural 的区分(最近翻译 Python 3.9 文档,library--typing 第 52 段,Nominal vs structural subtyping,目前是翻译成 “名义性子类型 区别于 结构性子类型”)

@ysc3839 @jinliming2 @geelaw 承上述,
主要是,大部分情况下文件浏览器并不需要区分文件的结构类型,只需要简单区分文件的名义类型,知道靠什么东西进行后续处理即可。那么对于文件浏览器来说只需要读个文件名比较方便。
相对地,对于图片查看器而言,反正已经读取文件整体了,根据文件头来判断的话额外开销=0 ;反而如果强制根据后缀名会导致打开一次不成功改后缀再打开一次,相当于这个文件被读取两遍,最差条件下就是两倍的开销(还不包括重命名的开销),那显然应当根据文件头来判断。
不过,文件浏览器有时需要读取文件内容,比如缩略图、 .exe 的自定义图标等,因为读取文件内容开销高就不要缩略图功能了吗?抱歉,人类反复打开的动作开销那是高到天边去了。至于读取文件的开销问题,解决的方法一般是将生成缩略图的功能非阻塞地实现,缩略图较慢地生成并不影响其他操作。
说到底其实是个性价比问题。
no1xsyzy
2020-10-12 11:13:35 +08:00
@px920906 说道这个,我想起来说,哪个古老的操作系统可以把软件直接放桌面,因为一个软件就是一个文件夹,这个文件夹双击会启动程序,但同时也可以 cd 进去修改内容,那复制就真的可以了,现在的 Gnome 什么的跟快捷方式一样,一个 .desktop 还是什么的文件……
zqx
2020-10-12 11:59:25 +08:00
作为学过计算机科学与技术专业的,确实没有一门课专门讲授这些知识。
操作系统课程中的文件系统,不在考试范围内,所以老师不会重点讲,书上也不会详细介绍。
考试可能就考内存管理,指令集,处理器这些东西。
raaaaaar
2020-10-12 12:07:20 +08:00
@zqx #53 学 Linux 文件,目录这里时,文件类型,文件命名就会接触到
agagega
2020-10-12 12:49:39 +08:00
@no1xsyzy macOS:你在暗示我?哈哈
zsdroid
2020-10-12 12:51:58 +08:00
原来“拷贝文件就拷了个快捷方式”不是段子啊。
wangccddaa
2020-10-12 14:27:40 +08:00
图片只有两种格式 bitmap 和矢量图,png,jpg,webp 其实都是图片采用不同的压缩算法后传输格式,最终在绘制的时候在设备上还是要回归到位图或 矢量图来展示的。有点类似快递商和快递的关系
pheyer
2020-10-12 14:39:45 +08:00
这叫不叫新时代的掩耳盗铃
lxilu
2020-10-12 14:45:59 +08:00
@no1xsyzy #52 win: desktop.ini DirectoryClass=xxx, HKCR\xxx CanUseForDirectory; ClickOnce
no1xsyzy
2020-10-12 15:01:18 +08:00
@lxilu 好像确实是可以做到,不过我说的不是这个。

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

https://tanronggui.xyz/t/713957

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

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

© 2021 V2EX