文字、颜色和图片 · 计算机入门
如果计算机只能存数字,那它怎么存一条消息、一张照片、一首歌?
课程目录为什么需要它
你发的每条消息、拍的每张照片、放的每首歌,都会变成数字,再变成比特。
知道这是怎么做到的,就能解释很多日常现象:为什么视频文件比一条短信大那么多,为什么文字有时会变成一堆怪符号,MB 和 GB 到底量的是什么。
直觉理解
诀窍是一份约定:大家事先说好,哪个数字代表什么。
文字。每个字符对应一个数字。在叫 Unicode 的这份约定里,A 是 65,B 是 66,a 是 97,! 是 33,「你」是 20320。一条消息就是一串这样的数字。如果一个程序用错了约定去读这些数字,就会出现 浣犲ソ 这样的乱码。
颜色。屏幕由很多很小的点组成,叫像素 Pixel。每个像素混合红、绿、蓝三种光,每种从 0(不亮)到 255(最亮):
| 红、绿、蓝 | 颜色 |
|---|---|
| 255, 0, 0 | 红 |
| 255, 255, 0 | 黄(红光 + 绿光) |
| 0, 0, 0 | 黑(全都不亮) |
| 255, 255, 255 | 白(全都最亮) |
图片。一张照片就是像素排成的网格,所以就是一长串颜色数字。一张 1200 万像素的手机照片,有 1200 万个像素点。
声音。麦克风每秒把声波测量几万次,每测一次就得到一个数字。
大小。因为一切最后都是字节,所以大小也按字节来算:
| 单位 | 大小 | 大约能放 |
|---|---|---|
| 1 字节 | 8 比特 | 一个英文字母 |
| 1 KB(千字节) | 1000 字节 | 一封短邮件 |
| 1 MB(兆字节) | 1000 KB | 一张手机照片有几 MB |
| 1 GB(吉字节) | 1000 MB | 几百张照片,或者大约一小时的普通视频 |
| 1 TB(太字节) | 1000 GB | 一块大硬盘 |
有些系统每一级按 1024 而不是 1000 来算,所以标着「256 GB」的手机,显示出来的可用空间会少一点。
定义
字符编码 Character encoding
A character encoding is an agreed table that maps each character to a number, so that text can be stored as bits.字符编码是一张大家约定好的表,把每个字符对应到一个数字,这样文字就能用比特存下来。
Unicode 是如今几乎到处都在用的编码,英文、中文、表情符号和几乎所有文字都包括在内。
像素 Pixel
A pixel is the smallest dot of colour on a screen or in a digital image.像素是屏幕上或数字图片里最小的一个色点。
RGB 颜色
RGB describes a colour by how much red, green and blue light it contains, each usually from 0 to 255.RGB 用红、绿、蓝三种光各有多少来描述一种颜色,每种通常从 0 到 255。
示例
文字就是数字
动手试试每个字符和它的 Unicode 编号。把引号里换成你自己的名字,或者试试 你好。
message = "Hi!" # change me 改这里
for ch in message:
print(ch, "->", ord(ch))- L1输入:三个字符。
message = "Hi!" - L3H 在 Unicode 里是 72。
H -> 72 - L3小写的 i 有自己的编号:105。
i -> 105 - L3标点符号也是数字。
! -> 33
一张很小的图片
动手试试黑白图片可以每个像素只用一个比特:1 是黑,0 是白。改改这些 0 和 1,画一张你自己的。彩色照片则是每个像素存三个数。
picture = [
"01010",
"11111",
"11111",
"01110",
"00100",
]
for row in picture:
line = ""
for bit in row:
if bit == "1":
line = line + "#"
else:
line = line + "."
print(line)- L1五行,每行五个比特:25 个像素。
5 × 5 - L8一行一行地处理。
row = "01010" - L121 变成黑点。
# - L140 变成白点。
. - L15打印画好的这一行。
.#.#.
一张照片有多大?
动手试试一张 1200 万像素的照片,每个像素 3 个字节(红、绿、蓝)。手机会用聪明的办法把它压到几 MB,这叫压缩 Compression。
width = 4000
height = 3000
pixels = width * height
size = pixels * 3 # red, green and blue: 3 bytes each pixel
print(pixels, "pixels")
print(size // 1000000, "MB before compression")- L34000 × 3000 个像素。
pixels = 12000000 - L4每个像素三个字节。
size = 36000000 - L63600 万字节就是 36 MB。
36 MB before compression
常见错误
大写和小写是不同的字符
A 是 65,a 是 97。对计算机来说,它们就像 A 和 Z 一样不同。所以密码要区分大小写。
字符「7」不是数字 7
作为文字,字符 7 存的是 55。只有程序把它当成数字时,它才表示七。学 Python 时你还会遇到这一点。
乱码不等于数据坏了
文字变成怪符号时,字节一般没坏,只是被用错的编码读了。换成正确的编码打开(几乎总是 UTF-8,也就是最常用的 Unicode 存法),文字就回来了。
小测验
1. 一个像素是 (255, 255, 255):红、绿、蓝都是最亮。它是什么颜色?
查看答案
答案:B
三种光都开到最亮,混出来是白色。三种都是 0 才是黑色,就像关掉的屏幕。
2. 在 Unicode 里,A 是 65,B 是 66,C 是 67。E 是多少?
查看答案
答案:B
大写字母按顺序编号:D 是 68,E 是 69。
3. 下面哪个文件可能最大?
查看答案
答案:C
视频是每秒很多张图片再加上声音,所以比一张照片大得多。文字很小:一个英文字母大约一个字节。
要点
- 文字、图片和声音都靠约定变成数字:字符用 Unicode,颜色用 RGB。
- 图片是像素排成的网格,每个像素就是几个数字。
- 大小按字节来算:KB、MB、GB、TB,每一级大约是上一级的 1000 倍。
动手练习
3 道小练习:先想一想,再动手改一改看看结果,最后自己来一次。提交马上告诉你对不对。
- 想一想混一混光
一个像素是 (255, 0, 0),另一个像素是 (0, 0, 255)。它们各是什么颜色?
- 改一改拼一个词
这台机器把 Unicode 编号变回文字,现在它打印的是
Cat。改列表里的数字,让它打印 **
Dog**。会用到的编号:D o g 68 111 103 - 自己来用比特画画
这是一张 3 × 3 的图片,
#是黑像素,.是白像素:#.# .#. #.#从上往下一行一行地,把它写成 9 个比特:黑是 1,白是 0。
提示:可以把答案放进右边「很小的图片」机器里检查。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Character encoding | 字符编码 | An agreed table that gives every character a number. |
| Unicode | Unicode 统一码 | The character encoding used almost everywhere, covering nearly every writing system and emoji. |
| Pixel | 像素 | One dot of colour on a screen or in a digital image. |
| RGB | RGB 红绿蓝 | A colour written as amounts of red, green and blue light, each 0 to 255. |
| Megabyte (MB) | 兆字节 | About a million bytes; a phone photo is usually a few MB. |
| Compression | 压缩 | Storing data in fewer bytes by encoding it cleverly. |