К содержанию

Подтема 2 из 5

Изображение

Сколько места занимает снимок, сколько цветов можно позволить при ограничении памяти и сколько снимков поместится на карту.

Пиксели и глубина цвета

Снимок задачи темы — 1024 × 768 пикселей. Сколько места занимает один такой снимок?

Изображение хранится как сетка пикселей, и в каждом записан код его цвета. Размер 1024 × 768 значит: 1024 пикселя в строке и 768 строк, всего 1024 · 768 = 786 432 пикселя. Складывать 1024 + 768 нельзя — нужно число клеток, а не длина сторон.

Длину кода одного пикселя называют глубиной цвета. Вот крошечное изображение 8 × 4 с четырьмя оттенками: каждому хватает двух битов.

Каждый пиксель хранит не цвет, а его двухбитный код. Коды записываются подряд, без промежутков: 8 · 4 пикселя по 2 бита — 64 бита.

Объём изображения

Объём изображения — число пикселей, умноженное на глубину цвета: V = w · h · i бит.

У снимка задачи темы 3000 цветов, глубина 12 бит (подтема 1). Объём 1024 · 768 · 12 = 9 437 184 бит, в Кбайтах — 9 437 184 / 8192 = 1152 Кбайт.

print(1024 * 768 * bits(3000) / 8192)
1152.0

Глубина не обязана быть кратной восьми: 5, 12 или 13 бит на пиксель — обычное дело, коды просто идут подряд. Дополнительно округлять каждый пиксель до байта не нужно.

Тонкости:RGB и 24 бита

В модели RGB цвет складывается из красной, зелёной и синей составляющих. По 8 бит на каждую — 24 бита на пиксель и 2²⁴ = 16 777 216 цветов. Если в условии сразу сказано «глубина 24 бита», умножать ещё на три не нужно.

Наибольшее число цветов

Обратный вопрос: снимок 1024 × 768 должен занимать не более 1 Мбайт. Какое наибольшее число цветов можно использовать?

Память делят на число пикселей и берут целую часть: это наибольшая глубина, а цветов 2ⁱ. 1 Мбайт = 8 388 608 бит, на пиксель приходится 8 388 608 / 786 432 ≈ 10,67 бита. Пикселю нужен целый код: 10 бит помещаются, 11 — уже нет. Цветов 2¹⁰ = 1024.

При 10 битах снимок помещается в 1 Мбайт, при 11 — уже нет. Глубину округляют вниз: из смысла ограничения, а не по правилу «после пяти вверх».
i = 1024 * 8192 // (1024 * 768)print(i, 2 ** i)
10 1024

Цвета и объём

Объём растёт вместе с глубиной, а не с числом цветов. Если палитру увеличить с 32 до 1024 цветов при тех же размерах, цветов станет в 32 раза больше, а глубина вырастет с 5 до 10 бит — объём увеличится только вдвое.

Сканирование в dpi

Если сканировать тот же лист с вдвое большим разрешением в dpi, пикселей станет вчетверо больше: удваиваются обе стороны. Dpi — число точек на дюйм. Лист 2 × 3 дюйма при 100 dpi даёт 200 × 300 = 60 000 пикселей, при 200 dpi — 400 × 600 = 240 000.

Тот же лист 2 × 3 дюйма: при вдвое большей плотности вдвое длиннее и строка, и столбец сетки.
Тонкости:формула для пересканирования

Объём меняется в (r₂ / r₁)² · i₂ / i₁ раз, где r — разрешение в dpi, i — глубина. Скан 24 Мбайт при 600 dpi и 24 битах, пересканированный при 300 dpi и 8 битах, займёт 24 · (300 / 600)² · 8 / 24 = 2 Мбайт.

Снимки на картах памяти

Целых снимков на карте — округление вниз, карт для всех снимков — округление вверх. Карта вмещает 1000 Мбайт, файл занимает 240 Мбайт: 1000 / 240 = 4,17, на карту помещается 4 файла. Для 10 файлов нужно 10 / 4 = 2,5 — значит, 3 карты.

Пятый файл не помещается в оставшиеся 40 Мбайт первой карты и уходит на вторую.

В задачах 2025 года спрашивают, сколько снимков на всех картах, кроме последней. Эти карты заполнены одинаково: (карт − 1) · снимков на карте. Здесь 2 · 4 = 8.

from math import ceilprint(1000 // 240, ceil(10 / 4))
4 3

// округляет вниз, — вверх.

Итого

  • Пикселиw · h, а не w + h
  • ОбъёмV = w · h · i бит
  • Наибольшая глубинапамять / пиксели, вниз; цветов 2ⁱ
  • Цвета ×32объём ×2: важна глубина
  • Карты памятиснимков на карту — вниз, карт — вверх

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Изображение 640 × 480 пикселей с палитрой из 256 цветов. Сколько Кбайт оно занимает?
ОтветСкрыть ответ
Ответ
300: для 256 цветов нужно 8 бит, 640 · 480 · 8 / 8192 = 300.
Вопрос 2
Палитру изображения увеличили с 16 до 256 цветов, размеры те же. Во сколько раз вырос объём?
ОтветСкрыть ответ
Ответ
В 2 раза: глубина была 4 бита, стала 8. Цветов стало в 16 раз больше, а объём зависит от длины кода.
Вопрос 3
Изображение 800 × 600 должно занимать не более 300 Кбайт. Какое наибольшее число цветов в нём можно использовать?
ОтветСкрыть ответ
Ответ
32: на пиксель приходится 300 · 8192 / 480 000 = 5,12 бита, целая глубина 5, 2⁵ = 32.
Вопрос 4
Глубина цвета 24 бита. Сколько цветов это даёт? Нужно ли ещё умножать на три составляющие RGB?
ОтветСкрыть ответ
Ответ
2²⁴ = 16 777 216. Не нужно: 24 бита уже включают 8 + 8 + 8 бит трёх составляющих.
Вопрос 5
Карта вмещает 1000 Мбайт, снимок занимает 240 Мбайт. Сколько снимков поместится? Почему не 5?
ОтветСкрыть ответ
Ответ
4: 1000 / 240 = 4,17. Пять снимков заняли бы 1200 Мбайт — больше карты. Число целых снимков округляют вниз.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Изображение 256 × 128

Изображение имеет размеры 256 × 128 пикселей и палитру из 200 цветов. Найди объём в Кбайтах.

Введите число.

Изображение 1024 × 768, 24 бита

Изображение 1024 × 768 пикселей хранится с глубиной цвета 24 бита. Сколько Мбайт оно занимает?

Введите число; дробную часть можно отделить запятой или точкой.

Палитра из 6000 цветов

Изображение 640 × 400 пикселей использует палитру из 6000 цветов. Сколько Кбайт оно занимает?

Введите число; дробную часть можно отделить запятой или точкой.

Наибольшая палитра для 80 Кбайт

Для изображения 320 × 200 выделено не более 80 Кбайт. Каково максимальное количество цветов?

Введите число.

Наибольшее число цветов для 300 Кбайт

Изображение размером 1000 × 750 пикселей хранится без сжатия; на него отведено не более 300 Кбайт без учёта заголовка файла. Все пиксели кодируются одинаковым количеством бит и записываются подряд. Какое наибольшее количество цветов можно использовать в изображении?

Введите число.

16 цветов → 32 цвета

Размеры изображения не изменились. Палитру увеличили с 16 до 32 цветов. Во сколько раз увеличился объём?

Введите число; дробную часть можно отделить запятой или точкой.

Скан 200 → 300 dpi

Скан занимал 8 Мбайт при 200 dpi. Тот же документ пересканировали при 300 dpi с прежней глубиной цвета. Каков новый объём?

Введите число.

Скан 400 → 200 dpi и 65 536 цветов

Документ отсканировали с разрешением 400 dpi и глубиной цвета 24 бита, без сжатия; файл занял 36 Мбайт. Тот же документ пересканировали с разрешением 200 dpi и палитрой из 65 536 цветов. Сколько Мбайт займёт новый файл?

Введите число.

Один файл занимает 90 Кбайт. Сколько целых файлов поместится в 1 Мбайт?

Введите число.

Носители для 50 файлов

Носитель вмещает 700 Мбайт, файл занимает 64 Мбайт, файлы нельзя делить между носителями. Сколько носителей нужно для 50 файлов?

Введите число.

Снимки на заполненных картах

Фотограф делает снимки 3000 × 2000 пикселей с палитрой из 10 000 000 цветов без сжатия. Карта памяти вмещает не более 32 Гбайт; когда на карте не хватает места для следующего снимка, фотограф ставит новую. Сделано 5000 снимков. Сколько снимков оказалось на всех картах, кроме последней использованной?

Введите число.