qinghuan
← 回到知识探索

计算机趣闻 / 常见误区

把文件名改成 .jpg,为什么还不是一张照片?

用一张虚构的文字便条做实验:名字变了,里面的字节可以一个也没变。

展开本文目录
  1. 文件名负责提示,格式规定怎样读内容
  2. 改完名字竟然能打开,说明了什么?
  3. 让一份新建便条穿上 .jpg 的外衣
  4. 真正转换,要让程序读懂后再重新写出
  5. 记住这三点
  6. 别把例子用过头
  7. 自己试一小步
  8. 查原始资料
  9. 找一份资料继续练
开始前,会这些就够了
  • 会运行一小段 Python,认识字符串、列表和条件判断即可
遇到不熟悉的词,先看这 1 个解释
字符编码
字符编码是把文字与可存储的数据对应起来的规则。写入时按规则产生数据,读取时按相应规则还原文字;双方使用不同规则,就可能看到乱码或替代符号。
打开完整术语小抄 ↗

朋友发来一份文件,电脑说打不开。你把末尾改成 .jpg,图标真的变成了图片,于是以为转换成功了;可双击后仍然报错。图标只是打开文件的一条线索,不能替里面的内容作保证。

可以把文件名理解成盒子外的标签,把文件内容理解成盒子里的东西。改写标签很快,重新整理里面的东西则是另一项工作。不过标签也并非毫无用处:系统和应用可能借它选择处理方式。

文件名负责提示,格式规定怎样读内容

常见的扩展名是文件名末尾的 .txt、.png、.jpg 等部分。Windows 可以用它关联默认应用和图标。单纯重命名通常改变的是名字,不会自动把文字排成像素,也不会把一种图片编码成另一种。

格式是内容如何组织的约定。例如 PNG 数据有规定的八字节开头,后面还要有图像尺寸、图像数据和结束等结构。读图片的软件需要按约定解释这些内容。只有一个看起来正确的后缀,不足以让任意字节成为合法图片。

改完名字竟然能打开,说明了什么?

有的软件会查看实际内容,不完全相信扩展名。因此一张本来就是真实 PNG 的图片,即便名字写成 .jpg,也可能被某个查看器打开。另一个程序可能按后缀挑选解码器并拒绝它,两者行为并不矛盾。

还有一种情况是文件原本命名错误:内容一直是 JPEG,扩展名却写错了。改回正确后缀相当于修正标签,并没有发生格式转换。所以“改名后能打开”只能说明这个应用此时能处理它,不能反推出改名完成了转换。

让一份新建便条穿上 .jpg 的外衣

下面只新建一行纯 ASCII 字符组成的练习便条,再把它改名。临时目录建在当前练习目录中,退出后自动清理;不会读取你的照片或现有文档。第二行比较改名前后的完整字节,不靠图标猜测。

输出中的 True 表示内容完全一致。最后一行仍然能按文字读出便条,因为程序只改了名字。这个实验没有生成 JPEG,也没有检查真正图片的全部格式规则;恰好让“更名”和“转换”的区别变得可见。

小实验 · python
from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory(prefix="rename-demo-", dir=".") as folder:
    old = Path(folder) / "note.txt"
    old.write_bytes(b"Just a note.\n")
    before = old.read_bytes()
    new = old.with_suffix(".jpg")
    old.rename(new)
    print(new.suffix)
    print(new.read_bytes() == before)
    print(new.read_text(encoding="ascii").strip())

怎样运行:保存为 rename_demo.py,在一个自己的练习目录中运行 python rename_demo.py。使用 Python 3.9 或更高版本,仅用标准库。

运行后对照结果
.jpg
True
Just a note.

真正转换,要让程序读懂后再重新写出

如果需要把 PNG 交给只接受 JPEG 的系统,应使用支持两种格式的工具打开图片,再选择相应格式导出。导出时程序会按目标格式重新组织数据;透明区域、压缩质量等也可能需要你明确选择。别只看导出框里填了什么名字。

验证时可以在接收方实际使用的软件里重新打开副本,并检查尺寸和必要内容。文件开头的标记能帮助识别类型,却不是完整合法性检测:标记之后也可能缺数据或损坏。这里讨论的是格式判断,不是在承诺“能打开的文件一定安全”。

记住这三点

  • 改扩展名主要改变文件名,转换格式需要处理内容。
  • 应用可能按后缀或内容识别文件,不能由图标判断转换是否成功。
  • 文件签名是线索,完整读取和格式校验是另一层工作。

别把例子用过头

  • 本来就命名错误的文件改回后缀,属于修正名字。
  • PNG 与 JPEG 的质量和透明度取舍另见本站图片格式文章,本篇不重复比较。

自己试一小步

怎样向朋友证明“改名成功”与“转换成功”不是同一件事?

  1. 把示例便条改成你虚构的一句话,记录改名前后的字节长度。
  2. 换两个不同后缀,比较全部内容是否一致。
  3. 给真正图片转换设计两项结果检查,只写检查方法,不操作重要原件。

做到这些,就算完成

  • 便条实验只用自己新建的临时内容。
  • 结论来自内容比较,而不是图标或文件名。
  • 说明为何仅检查开头标记仍不足以证明图片完整。

查原始资料

想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。

找一份资料继续练

先选一项,按下面的范围继续学;不必从头读完整门课程。