人人都能学编程
English 开始学习
课程 0 · 编程之前第 4 课 / 共 8 课免费阅读

文字、颜色和图片 · 计算机入门

如果计算机只能存数字,那它怎么存一条消息、一张照片、一首歌?

课程目录

为什么需要它

你发的每条消息、拍的每张照片、放的每首歌,都会变成数字,再变成比特。

知道这是怎么做到的,就能解释很多日常现象:为什么视频文件比一条短信大那么多,为什么文字有时会变成一堆怪符号,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))
逐步执行
  1. L1输入:三个字符。message = "Hi!"
  2. L3H 在 Unicode 里是 72。H -> 72
  3. L3小写的 i 有自己的编号:105。i -> 105
  4. 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)
逐步执行
  1. L1五行,每行五个比特:25 个像素。5 × 5
  2. L8一行一行地处理。row = "01010"
  3. L121 变成黑点。#
  4. L140 变成白点。.
  5. 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")
逐步执行
  1. L34000 × 3000 个像素。pixels = 12000000
  2. L4每个像素三个字节。size = 36000000
  3. 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):红、绿、蓝都是最亮。它是什么颜色?

  1. A黑色
  2. B白色
  3. C灰色
查看答案

答案:B

三种光都开到最亮,混出来是白色。三种都是 0 才是黑色,就像关掉的屏幕。

2. 在 Unicode 里,A 是 65,B 是 66,C 是 67。E 是多少?

  1. A68
  2. B69
  3. C70
查看答案

答案:B

大写字母按顺序编号:D 是 68,E 是 69。

3. 下面哪个文件可能最大?

  1. A一页文字的消息
  2. B一张手机照片
  3. C一段 10 分钟的视频
查看答案

答案:C

视频是每秒很多张图片再加上声音,所以比一张照片大得多。文字很小:一个英文字母大约一个字节。

要点

  • 文字、图片和声音都靠约定变成数字:字符用 Unicode,颜色用 RGB。
  • 图片是像素排成的网格,每个像素就是几个数字。
  • 大小按字节来算:KB、MB、GB、TB,每一级大约是上一级的 1000 倍。

动手练习

3 道小练习:先想一想,再动手改一改看看结果,最后自己来一次。提交马上告诉你对不对。

  1. 想一想混一混光

    一个像素是 (255, 0, 0),另一个像素是 (0, 0, 255)。它们各是什么颜色?

  2. 改一改拼一个词

    这台机器把 Unicode 编号变回文字,现在它打印的是 Cat。

    改列表里的数字,让它打印 **Dog**。会用到的编号:

    Dog
    68111103
  3. 自己来用比特画画

    这是一张 3 × 3 的图片,# 是黑像素,. 是白像素:

    #.#
    .#.
    #.#

    从上往下一行一行地,把它写成 9 个比特:黑是 1,白是 0。

    提示:可以把答案放进右边「很小的图片」机器里检查。

在互动课里练这一课

打开互动课,这些例子都能直接改、直接运行,练习题提交马上判题。免费开始,不用注册。

互动课按顺序解锁:前面的课还没学,会先带你到课程地图。

本课术语

术语中文英文定义
Character encoding字符编码An agreed table that gives every character a number.
UnicodeUnicode 统一码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.
RGBRGB 红绿蓝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.