
武蔵野個別指導塾の特徴
【情報I】文字・画像・音のデジタル表現を図解で総まとめ—文字コード・画素・標本化と量子化|武蔵野個別指導塾

同じ文字でも保存方法でデータ量が変わる理由を、文字コードの図と計算で確かめます。画素数と階調、音の標本化と量子化を整理し、画像・録音の容量を求める例題に取り組めます。
よくあるのは、朝のホームルーム前の教室で、発表用の文字原稿、写真、録音を端末に集めながら、「写真は1枚なのに、どうして原稿より容量が大きいのですか」と手が止まる場面です。教科書には画素数や標本化周波数という言葉が並びますが、どれを掛ければよいのかが見えないと、公式を覚えても条件が少し変わるだけで迷ってしまいます。
文字、画像、音は、人にとっては異なる種類の表現です。それでも、コンピュータに保存するときには、いずれも0と1の組合せに置き換えます。違うのは、何に番号を付け、何個分の番号を並べるかです。文字なら文字に対応する符号、画像なら各画素の色、音なら一定の時刻に測った振幅の値を扱います。
この違いを押さえると、容量を求める式を自分で組み立てられます。画像を縦横2倍にしたらどうなるか、録音時間だけを半分にしたらどうなるかも、単なる暗記ではなく、記録する値の個数から説明できるようになります。
この単元で身につけること
- 文字コードの役割を説明します。ASCIIとUnicodeの位置づけを整理し、文字に割り当てる番号と、その番号をバイト列として保存する方式を区別します。
- 画像を画素の集まりとして読みます。横と縦の画素数から総画素数を求め、画像の細かさと色の段階の細かさを別々に考えます。
- 光の3原色と階調を結び付けます。RGBの各成分に使うビット数から、1画素のビット数と表せる色の組合せの数を求めます。
- 音の標本化・量子化・符号化を順に説明します。時間方向に測る間隔と、振幅方向に値を丸める細かさの役割を分けます。
- 条件に合ったデータ量を計算します。圧縮しない場合の本体部分を対象に、bitからBへ単位をそろえ、画像の縦横や音のチャネル数の数え落としを防ぎます。
前の単元で学ぶ「nビットでは2ⁿ通りを区別できる」「1 Bは8 bit」という決まりが、文字・画像・音の表現を支えています。中学校の数学で扱った比例も役立ちますが、何が一定で何が変わるかを先に確かめる必要があります。
基本の考え方
文字の番号と、保存されるバイト列
文字コードは、文字をコンピュータで扱うための対応の決まりです。たとえばASCIIでは、半角の大文字Aに10進数の65が対応します。ASCIIは7ビットの符号で、制御用の符号も含めて128通りを区別します。7ビットだから日常のあらゆる文字を扱えるわけではなく、日本語の漢字やひらがなはASCIIの範囲に入りません。
一方、Unicodeは多くの言語の文字や記号に共通の番号を割り当てるための規格です。その番号をコードポイントといいます。AのコードポイントはU+0041で、0041は16進数の表記です。同じ番号を10進数で書くと65になります。U+という接頭辞を含む表記そのものが、ファイルにそのまま保存されるわけではありません。
実際にコードポイントをバイト列へ変換する代表的な符号化方式がUTF-8です。UTF-8では、コードポイントによって1〜4バイトを使い分けます。ASCIIに含まれる文字は1文字につき1バイトですが、ひらがなの「あ」は3バイトです。「Unicodeはすべての文字を2バイトで保存する」と覚えると、番号の体系と保存方式を取り違えます。
図1のように、文字、番号、保存時のビット列を段階に分けて読むと混乱を減らせます。AをUTF-8で保存した1バイトは01000001です。これは8桁の0と1であり、10進数の65を8ビットで表したものです。ASCIIの符号が7ビットであることと、UTF-8のAが8ビットの1バイトで保存されることは両立します。

読み出すときは、保存されたバイト列を指定の方式で文字に戻します。書いた側と読む側で符号化方式の解釈が食い違うと、意図しない文字が表示される文字化けの原因になります。また、文字の番号が正しくても、表示に必要な字体のデータがなければ文字の形を表示できないことがあります。符号の解釈と、字形を描く処理は別です。
文章の容量を考えるときは、見た目の文字数だけで決めないようにします。改行や空白も保存対象になり、保存方式によってバイト数が変わります。さらに、見た目では1文字に見えても、複数のコードポイントを組み合わせて表す場合があります。この単元の計算では、扱う文字と保存方式を具体的に指定し、与えられた条件の範囲で数えます。
画像は、位置ごとの色を並べたもの
画素は、画像を格子状に分けたときの1つ1つの要素です。画素ごとに色を記録する形式の画像をラスタ画像、またはビットマップ画像と呼びます。横が640画素、縦が480画素なら、記録する画素の個数は640 × 480 = 307,200個です。線や図形を数式などで表すベクタ画像とは表現方法が異なり、以後の画像の容量計算はラスタ画像を対象にします。
解像度という語は、画像の細かさに関わりますが、場面によって使い方が違います。「横640 × 縦480画素」のような画像全体の画素数を指す場合もあれば、表示や印刷の長さ当たりの密度を指す場合もあります。ppiは1インチ当たりの画素数です。dpiは1インチ当たりのドット数を表し、印刷装置の点の細かさなどで使います。問題では数値に付いた単位を読み、総画素数なのか密度なのかを確かめます。
画素数が多ければ、同じ範囲をより細かく分けて記録できます。ただし、少ない画素の画像を単に拡大しても、撮影時に得られなかった細部が正確に戻るわけではありません。また、同じ画素数の画像を大きく印刷すると、同じ長さに並ぶ画素が少なくなります。ファイルの画素数と、紙の上での見え方を区別して考えます。
色の記録では、光の3原色である赤R、緑G、青Bを使うRGB方式が基本です。光を重ねる加法混色では、3成分をすべて最大にすると白、すべて0にすると黒になります。絵の具やインクの混色と同じつもりで考えると、白と黒の扱いを誤りやすくなります。
階調とは、明るさや色の強さを何段階で表すかということです。ある成分を8ビットで記録するなら、2⁸ = 256段階を区別できます。値を0から付ける場合は0〜255です。RGBをそれぞれ8ビットにすると、1画素は8 + 8 + 8 = 24ビットで、色の組合せは256 × 256 × 256 = 16,777,216通りです。ビット数は足し、独立に選べる組合せの数は掛けます。
白黒2値画像なら1画素を1ビットで表せます。白から黒までの濃淡を256段階で表すグレースケール画像なら、1画素を8ビットで表せます。「白黒」という日常語だけでは2値なのか濃淡を含むのかが曖昧なので、問題文の階調数を確かめます。透過の情報などを加える場合もありますが、条件に書かれていなければ勝手に追加しません。
音は、時刻ごとの振幅を並べたもの
空気の圧力変化として伝わる音を、マイクなどで電気信号に変えて記録することを考えます。連続的に変わる波形をデジタル化するときには、標本化、量子化、符号化の順に整理します。標本化は時間を区切る処理、量子化は測った振幅を有限個の値に対応させる処理です。
標本化は、一定の時間間隔で信号の値を取り出すことです。1秒当たりに取り出す回数を標本化周波数、またはサンプリング周波数と呼び、単位にはHzを使います。8,000 Hzなら1秒に8,000回測るため、標本化間隔は1 ÷ 8,000秒です。周波数を大きくすると、時間方向に細かく値を取り出します。
量子化は、取り出した振幅を、あらかじめ用意した段階の値に対応させることです。量子化ビット数が8ビットなら256段階、16ビットなら65,536段階を区別できます。元の振幅と対応させた値の差は量子化誤差です。同じ振幅の範囲を等間隔で分けるなら、ビット数を増やすほど段階の間隔を細かくできます。
符号化では、量子化で選んだ値を0と1の符号に置き換えます。たとえば4段階を区別するなら2ビットを使えます。音のデータ量を計算する基本問題では、各標本を固定のビット数で記録するPCM方式を考えます。後から圧縮した録音ファイルには、同じ式をそのまま当てはめられないことがあります。
モノラルは1チャネル、ステレオは通常左右の2チャネルを記録します。同じ標本化周波数と量子化ビット数なら、ステレオは各時刻に2つの値を持つため、モノラルの2倍のデータ量です。音の高さを表す周波数と、値を取り出す回数である標本化周波数も別です。標本化周波数が高いから、その録音の音程も高い、という関係にはなりません。
例題で解き方を確かめる
例題1 文字の個数とバイト数を分ける
文字列「AあB」をUTF-8で保存します。ここでは各英字は1バイト、「あ」は3バイトとし、かぎ括弧、改行、付加情報は保存しません。データ量は何B、何bitでしょうか。
- 保存する文字をA、あ、Bに分けます。文字ごとに必要なバイト数が異なるため、見た目の3文字という数だけでは計算できません。
- 必要なバイト数を足します。1 + 3 + 1 = 5 Bです。文字列を順番に並べたデータなので、各文字の長さの合計を取ります。
- 1 B = 8 bitで換算します。5 × 8 = 40 bitです。単位をbitにすると、同じ量をより小さい単位で数えるので数値が8倍になります。
答え:5 B、40 bitです。
Pythonでも、文字列をUTF-8のバイト列に変えて長さを確かめられます。lenは要素の個数を求める関数で、encodeは文字列を指定した方式で符号化します。この文字列のlenは3ですが、encode後のlenはバイト数の5です。
text = "AあB"
data = text.encode("utf-8")
print(len(text))
print(len(data))
print(len(data) * 8)
出力は次のとおりです。
3
5
40
この差は、文字が大きく表示されるから生じるのではありません。同じ文字列の表示サイズを変えても、この条件で保存する文字データのバイト数は変わりません。文字を画像として保存した場合とは区別します。
例題2 カラー画像のデータ量と拡大の倍率
横640画素、縦480画素で、RGBの各成分を8ビットで記録した画像があります。圧縮や付加情報を考えない場合のデータ量をBで求めます。また、縦横の画素数をそれぞれ2倍にして同じ形式で記録すると、データ量は何倍でしょうか。
- 1画素のビット数を決めます。RGBの3成分を持つので、8 × 3 = 24 bitです。8ビットが1画素全体の値ではない点に注意します。
- 横と縦を掛けて総画素数を求めます。640 × 480 = 307,200画素です。画像の各行に640画素あり、その行が480本あるためです。
- 総画素数に1画素のビット数を掛けます。307,200 × 24 = 7,372,800 bitです。最後に8で割ると、921,600 Bになります。
- 縦横をそれぞれ2倍にした場合を比べます。画素の個数は2 × 2 = 4倍です。1画素のビット数は同じなので、データ量も4倍の3,686,400 Bです。
答え:元の画像は921,600 Bで、縦横の画素数をそれぞれ2倍にすると4倍です。
図2は、この倍率を小さい格子で確かめたものです。左は横4 × 縦3で12画素、右は横8 × 縦6で48画素です。同じ大きさの枠を細かく分けているので、右の1画素は小さく見えますが、記録する色の値の個数は4倍になります。

Pythonでは、掛け算を順に書くと計算対象を見失いにくくなります。ここではバイト数が整数になるため、整数の商を求める記号を使っています。一般には、端数があるのに無条件で切り捨ててよいわけではありません。
width = 640
height = 480
bits_per_pixel = 8 * 3
bits = width * height * bits_per_pixel
print(bits)
print(bits // 8)
print((width * 2) * (height * 2) * bits_per_pixel // 8)
出力は次のとおりです。
7372800
921600
3686400
画像のデータ量の基本形は「横の画素数 × 縦の画素数 × 1画素のビット数」です。この段階の単位はbitです。式に8で割る操作を入れるかどうかは、問題が求める単位で決めます。また、色の種類が少ない写真でも、全画素を固定24ビットで記録する条件なら、画素数が同じ画像の本体部分は同じデータ量です。
例題3 ステレオ録音のデータ量
標本化周波数44,100 Hz、量子化ビット数16ビット、ステレオ2チャネルで10秒間録音します。圧縮しないPCMの音声データ本体は何Bでしょうか。MBで答える場合は、この問題では1 MB = 1,000,000 Bとします。
- 1チャネル分の標本数を求めます。44,100 × 10 = 441,000個です。標本化周波数は1秒当たりの個数なので、録音時間を掛けます。
- 1チャネル分のビット数を求めます。441,000 × 16 = 7,056,000 bitです。標本1個を16ビットで記録するからです。
- チャネル数を掛けます。7,056,000 × 2 = 14,112,000 bitです。左右それぞれの波形を記録するため、ここで2倍にします。
- BとMBへ換算します。14,112,000 ÷ 8 = 1,764,000 Bで、さらに1,000,000で割ると1.764 MBです。
答え:1,764,000 B、指定の換算では1.764 MBです。
式全体は「標本化周波数 × 量子化ビット数 × チャネル数 × 時間」です。標本化周波数からは時間方向の個数、ビット数からは1個当たりの長さ、チャネル数からは並行して記録する波形の数がわかります。Pythonでもこの対応のまま計算できます。
rate = 44100
depth = 16
channels = 2
seconds = 10
bits = rate * depth * channels * seconds
print(bits)
print(bits // 8)
print(bits / 8 / 1000000)
出力は次のとおりです。
14112000
1764000
1.764
時間を掛ける前の44,100 × 16 × 2 = 1,411,200という値は、1秒当たりのビット数です。これをビットレートと呼び、bit/sなどで表します。録音全体のデータ量と、1秒当たりの量を分けると、時間を掛け忘れた式にも気付きやすくなります。実際のファイルには形式を示す情報などが加わるため、ここで求めた値とファイル全体の大きさが必ず一致するとは限りません。
例題4 量子化してから符号化する
ある信号を標本化して、0.2、0.8、1.7、2.6という4個の値を得ました。量子化では最も近い0、1、2、3のいずれかに対応させ、順に00、01、10、11の2ビットの符号を割り当てます。符号列と、符号列全体のビット数を求めましょう。ここでは同じ距離になる値はありません。
- 各値を最も近い段階へ対応させます。0.2は0、0.8は1、1.7は2、2.6は3です。これは振幅方向の値を有限個の候補から選ぶ量子化です。
- 選んだ値を指定の符号へ置き換えます。順番に00、01、10、11です。符号化は量子化後の値を記録する処理なので、元の小数を直接並べる操作ではありません。
- 標本の個数に1個当たりのビット数を掛けます。4 × 2 = 8 bitです。4段階を使うことと、1標本を4ビットで記録することは同じではありません。
答え:符号列は00 01 10 11で、全体は8 bitです。
量子化前後の差を大きさで見ると、順に0.2、0.2、0.3、0.4です。細かい値を同じ段階へ対応させると、符号から元の小数を一意に取り戻すことはできません。デジタル化は測った値をそのまま無限の精度で残す処理ではない、という点がこの例から見えてきます。
つまずきやすいところと直し方
文字数と保存する量を同一視する
誤った書き方は「Unicodeだから1文字は必ず2 B、3文字なら6 B」です。どこが違うかというと、Unicodeのコードポイントと、その保存に使う符号化方式をひとまとめにしています。番号だけから、特定のファイルの1文字当たりのバイト数を固定することはできません。
正しい書き方は「UTF-8でAあBを保存するという条件なら、1 + 3 + 1 = 5 B」です。手元のメモにも、文字列、符号化方式、数える範囲を並べて書きます。改行を含むか、かぎ括弧そのものを含むかも計算条件です。すべての問題で1文字ずつ数える必要はありませんが、固定長と指定されていないときに、文字数だけに定数を掛けることは避けます。
画素数と階調数を取り違える
誤った書き方は「RGB各8ビットだから8 × 8 × 8 = 512色」です。どこが違うかというと、8は段階の数ではなく、それを表すビットの数です。また「横も縦も2倍なら、容量は2倍」という式では、縦方向に記録する行数の増加を落としています。
正しい書き方は「各成分は2⁸ = 256段階だから256 × 256 × 256色、1画素は24 bit」です。図2のように、個数を数える格子と、各格子に入る符号の長さを分けます。グレースケールならRGBの3倍を機械的に掛けず、問題に与えられた1画素当たりの条件を使います。
標本化と量子化を逆に覚える
誤った書き方は「量子化ビット数を増やすと、1秒に測る回数が増える」です。どこが違うかというと、時間方向の細かさと振幅方向の細かさが逆になっています。正しい書き方は「標本化周波数を増やすと測る回数が増え、同じ振幅範囲なら量子化ビット数を増やすと振幅の段階が細かくなる」です。
図3のように、横軸を時刻、縦軸を振幅として、時間を選ぶ操作と値を丸める操作を別々に追いましょう。青い線は連続的な信号、赤い丸は時刻0から8まで等間隔で取り出した値、緑の四角はその値を最も近い整数の段階へ対応させた結果です。縦軸の0〜3は計算用の振幅の尺度で、音の波形一般が正の値だけを取るという意味ではありません。

赤い丸と緑の四角は同じ時刻にあります。縦に離れている分が量子化誤差で、四角の位置を変えても時刻の間隔は変わりません。逆に、測る時刻を増やしても振幅の候補が0、1、2、3のままなら、量子化の段階は細かくなりません。図3ではこの2つの操作を同じ座標上で見比べられます。
標本化を粗くしすぎると、速く変化する信号を別のゆっくりした変化と区別できなくなることもあります。適切に帯域を制限した信号を理想的に復元するには、標本化周波数を信号に含まれる最高周波数の2倍より高くすることが基本です。ただし、この条件だけで録音の品質がすべて決まるわけではありません。マイクや雑音の影響もあるため、容量の大きさだけで音の良し悪しを断定しないようにします。
練習問題
練習1
文字列「ABあい」をUTF-8で保存します。AとBはそれぞれ1 B、「あ」と「い」はそれぞれ3 Bです。保存するのはかぎ括弧の内側だけで、改行や付加情報は含めません。何B、何bitになるでしょうか。文字ごとの量を足した式も書きましょう。
練習2
横320画素、縦240画素のグレースケール画像を、1画素当たり8ビットで記録します。圧縮や付加情報を除いたデータ量は何Bでしょうか。また、同じ画素数でRGB各8ビットに変えると何Bになるでしょうか。どちらも1画素のビット数を先に書きます。
練習3
標本化周波数8,000 Hz、量子化ビット数8ビット、モノラルの音声を5秒間記録します。圧縮や付加情報を除いたデータ量をBで求めましょう。さらに、時間とビット数を変えず、標本化周波数を2倍、チャネル数を2にすると何倍になるでしょうか。
練習4
0〜3の整数4段階へ最も近い値を選ぶ量子化を行います。標本化後の値が0.4、1.2、1.8、2.7のとき、量子化後の値と、例題4と同じ対応を使った符号列を書きましょう。また、段階数を8に増やすなら、最低何ビット必要でしょうか。
答えと解説
練習1の答えは8 B、64 bitです。1 + 1 + 3 + 3 = 8 Bとなり、8 × 8 = 64 bitへ換算します。見た目の4文字をそのまま4 Bとせず、問題で与えられた各文字のバイト数を合計します。
練習2の答えは、グレースケールが76,800 B、RGBが230,400 Bです。320 × 240 × 8 ÷ 8 = 76,800 Bで、RGBなら1画素が24ビットになるため3倍です。画素の個数はどちらも76,800個で変わらず、色を表すための記録の長さが変わっています。
練習3の答えは40,000 Bで、条件を変えると4倍の160,000 Bです。元の量は8,000 × 8 × 1 × 5 ÷ 8 = 40,000 Bです。標本化周波数で2倍、チャネル数でも2倍になるので、全体は2 × 2 = 4倍になります。8ビットだから8段階という意味ではないことも確かめておきます。
練習4の答えは、量子化後の値が0、1、2、3、符号列が00 01 10 11です。8段階には最低3ビット必要で、2³ = 8が根拠です。標本が4個あることは記録の個数であり、1個の標本を何ビットで表すかとは別に数えます。
次の単元へのつながりと家庭での確かめ方
ここで求めたのは、条件をそろえた未圧縮のデータ量です。次に圧縮を学ぶと、同じ値が繰り返される部分をまとめたり、人の知覚に合わせて情報を減らしたりする理由が見えてきます。また、通信の学習では、データ量を通信速度で割って時間を見積もります。その前提として、Bとbit、全体の量と1秒当たりの量を区別する力が必要です。
家庭で5分ほどでできる確認の1つは、画像の情報画面を開き、横と縦の画素数を紙に書くことです。1画素を24ビットとした場合の未圧縮の量を計算し、表示されたファイルサイズと比べます。違いがあってもすぐに計算ミスとせず、圧縮の有無や記録形式が計算の条件と同じかを考えます。
もう1つは、紙に短い波を描き、等間隔の縦線と、振幅の段階を示す横線を加えることです。縦線だけを増やす場合と、横線だけを増やす場合を比べ、どちらが標本化でどちらが量子化かを声に出して説明します。個別指導では、式の答えだけで判断せず、1画素や1標本が何を記録するのかまで戻って確かめます。そこがつながらない場合には、2ビットで4通りを区別する小さな表から組み直します。
まとめ
「写真1枚」「録音1本」という人の数え方から、画素や標本という記録の単位に視点を移すと、容量の式に意味が生まれます。文字では保存方式、画像では位置ごとの色、音では時刻ごとの振幅という条件が、並べる符号の長さを決めます。
答えにたどり着いたら、どの数が記録の個数で、どの数が1個分の長さなのかを説明してみましょう。数字だけが合っていても、この対応が逆なら条件を変えた問題で崩れます。データ量の式は、記録するものを1個ずつ数えた結果です。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。




