Подтема 2 из 5
Изображение
Сколько места занимает снимок, сколько цветов можно позволить при ограничении памяти и сколько снимков поместится на карту.
Пиксели и глубина цвета
Снимок задачи темы — 1024 × 768 пикселей. Сколько места занимает один такой снимок?
Изображение хранится как сетка пикселей, и в каждом записан код его цвета. Размер 1024 × 768 значит: 1024 пикселя в строке и 768 строк, всего 1024 · 768 = 786 432 пикселя. Складывать 1024 + 768 нельзя — нужно число клеток, а не длина сторон.
Длину кода одного пикселя называют глубиной цвета. Вот крошечное изображение 8 × 4 с четырьмя оттенками: каждому хватает двух битов.
Объём изображения
Объём изображения — число пикселей, умноженное на глубину цвета: V = w · h · i бит.
У снимка задачи темы 3000 цветов, глубина 12 бит (подтема 1). Объём 1024 · 768 · 12 = 9 437 184 бит, в Кбайтах — 9 437 184 / 8192 = 1152 Кбайт.
print(1024 * 768 * bits(3000) / 8192)Глубина не обязана быть кратной восьми: 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.
i = 1024 * 8192 // (1024 * 768)print(i, 2 ** i)Цвета и объём
Объём растёт вместе с глубиной, а не с числом цветов. Если палитру увеличить с 32 до 1024 цветов при тех же размерах, цветов станет в 32 раза больше, а глубина вырастет с 5 до 10 бит — объём увеличится только вдвое.
Сканирование в dpi
Если сканировать тот же лист с вдвое большим разрешением в dpi, пикселей станет вчетверо больше: удваиваются обе стороны. Dpi — число точек на дюйм. Лист 2 × 3 дюйма при 100 dpi даёт 200 × 300 = 60 000 пикселей, при 200 dpi — 400 × 600 = 240 000.
Тонкости:формула для пересканирования
Объём меняется в (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 карты.
В задачах 2025 года спрашивают, сколько снимков на всех картах, кроме последней. Эти карты заполнены одинаково: (карт − 1) · снимков на карте. Здесь 2 · 4 = 8.
from math import ceilprint(1000 // 240, ceil(10 / 4))// округляет вниз, — вверх.
Итого
- Пикселиw · h, а не w + h
- ОбъёмV = w · h · i бит
- Наибольшая глубинапамять / пиксели, вниз; цветов 2ⁱ
- Цвета ×32объём ×2: важна глубина
- Карты памятиснимков на карту — вниз, карт — вверх
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Изображение 256 × 128
Изображение имеет размеры 256 × 128 пикселей и палитру из 200 цветов. Найди объём в Кбайтах.
Введите число.
Подсказка
Объём — число пикселей, умноженное на глубину цвета.
Решение
Для 200 цветов нужно 8 бит: 2⁷ = 128 мало, 2⁸ = 256 хватает. Объём 256 · 128 · 8 бит, в Кбайтах 256 · 128 · 8 / 8192 = 32.
Решение программой
i = 1while 2 ** i < 200: i += 1print(256 * 128 * i // 8192)Ответ: 32
Изображение 1024 × 768, 24 бита
Изображение 1024 × 768 пикселей хранится с глубиной цвета 24 бита. Сколько Мбайт оно занимает?
Введите число; дробную часть можно отделить запятой или точкой.
Подсказка
В одном Мбайте 2²³ бит.
Решение
Объём 1024 · 768 · 24 = 18 874 368 бит. В Мбайте 2²³ = 8 388 608 бит, поэтому изображение занимает 18 874 368 / 8 388 608 = 2,25 Мбайт.
Решение программой
print(1024 * 768 * 24 / 2 ** 23)Ответ: 2,25
Палитра из 6000 цветов
Изображение 640 × 400 пикселей использует палитру из 6000 цветов. Сколько Кбайт оно занимает?
Введите число; дробную часть можно отделить запятой или точкой.
Подсказка
Для 6000 цветов нужно 13 бит.
Решение
Для 6000 цветов нужно 13 бит: 2¹² = 4096 мало, 2¹³ = 8192 хватает. Объём 640 · 400 · 13 / 8192 = 406,25 Кбайт.
Решение программой
i = 1while 2 ** i < 6000: i += 1print(640 * 400 * i / 8192)Ответ: 406,25
Наибольшая палитра для 80 Кбайт
Для изображения 320 × 200 выделено не более 80 Кбайт. Каково максимальное количество цветов?
Введите число.
Подсказка
Целая глубина — наибольшая, при которой объём помещается.
Решение
Доступно 80 · 8192 = 655 360 бит на 320 · 200 = 64 000 пикселей, то есть 10,24 бита на пиксель. Целая глубина — 10 бит, цветов 2¹⁰ = 1024.
Решение программой
i = 80 * 8192 // (320 * 200)print(2 ** i)Ответ: 1024
Наибольшее число цветов для 300 Кбайт
Изображение размером 1000 × 750 пикселей хранится без сжатия; на него отведено не более 300 Кбайт без учёта заголовка файла. Все пиксели кодируются одинаковым количеством бит и записываются подряд. Какое наибольшее количество цветов можно использовать в изображении?
Введите число.
Подсказка
Глубина — целая часть допустимого числа битов на пиксель.
Решение
Доступно 300 · 8192 = 2 457 600 бит на 750 000 пикселей — 3,27… бита на пиксель. Целая глубина 3 бита, цветов 2³ = 8.
Решение программой
i = 300 * 8192 // (1000 * 750)print(2 ** i)Ответ: 8
16 цветов → 32 цвета
Размеры изображения не изменились. Палитру увеличили с 16 до 32 цветов. Во сколько раз увеличился объём?
Введите число; дробную часть можно отделить запятой или точкой.
Подсказка
Количество цветов удвоилось, а длина кода выросла на один бит.
Решение
Для 16 цветов нужно 4 бита на пиксель, для 32 — 5 бит. Цветов стало вдвое больше, а код вырос только на один бит, поэтому объём увеличился в 5 / 4 = 1,25 раза.
Решение программой
print(5 / 4)Ответ: 1,25
Скан 200 → 300 dpi
Скан занимал 8 Мбайт при 200 dpi. Тот же документ пересканировали при 300 dpi с прежней глубиной цвета. Каков новый объём?
Введите число.
Подсказка
При вдвое большем разрешении удваиваются обе стороны сетки пикселей.
Решение
Разрешение выросло в 300 / 200 = 1,5 раза по каждой стороне, поэтому пикселей стало в 1,5² = 2,25 раза больше. Объём 8 · 2,25 = 18 Мбайт.
Решение программой
print(int(8 * (300 / 200) ** 2))Ответ: 18
Скан 400 → 200 dpi и 65 536 цветов
Документ отсканировали с разрешением 400 dpi и глубиной цвета 24 бита, без сжатия; файл занял 36 Мбайт. Тот же документ пересканировали с разрешением 200 dpi и палитрой из 65 536 цветов. Сколько Мбайт займёт новый файл?
Введите число.
Подсказка
Перемножь множители разрешения и глубины.
Решение
Разрешение уменьшилось вдвое по каждой стороне — пикселей стало в 4 раза меньше. Для 65 536 цветов нужно 16 бит вместо 24 — множитель 2/3. Новый объём 36 · 1/4 · 2/3 = 6 Мбайт.
Решение программой
print(int(36 * (200 / 400) ** 2 * 16 / 24))Ответ: 6
Файлы на 1 Мбайт
Один файл занимает 90 Кбайт. Сколько целых файлов поместится в 1 Мбайт?
Введите число.
Подсказка
Целое число файлов — округление вниз.
Решение
1 Мбайт = 1024 Кбайт, 1024 / 90 = 11,37…. Помещаются 11 целых файлов: двенадцать заняли бы 1080 Кбайт.
Решение программой
print(1024 // 90)Ответ: 11
Носители для 50 файлов
Носитель вмещает 700 Мбайт, файл занимает 64 Мбайт, файлы нельзя делить между носителями. Сколько носителей нужно для 50 файлов?
Введите число.
Подсказка
Сначала найди, сколько целых файлов помещается на один носитель.
Решение
На носитель помещается 700 / 64 = 10,9…, то есть 10 целых файлов. Для 50 файлов нужно 50 / 10 = 5 носителей.
Решение программой
from math import ceil per = 700 // 64print(ceil(50 / per))Ответ: 5
Снимки на заполненных картах
Фотограф делает снимки 3000 × 2000 пикселей с палитрой из 10 000 000 цветов без сжатия. Карта памяти вмещает не более 32 Гбайт; когда на карте не хватает места для следующего снимка, фотограф ставит новую. Сделано 5000 снимков. Сколько снимков оказалось на всех картах, кроме последней использованной?
Введите число.
Подсказка
Снимков на заполненных картах — (карт − 1) · снимков на карте.
Решение
10 000 000 цветов требуют 24 бита, снимок занимает 3000 · 2000 · 3 = 18 000 000 байт. На карту 32 · 2³⁰ / 18 000 000 = 1908,8…, то есть 1908 снимков. Для 5000 снимков нужно 3 карты, и на первых двух 2 · 1908 = 3816 снимков.
Решение программой
from math import ceil i = 1while 2 ** i < 10_000_000: i += 1shot = 3000 * 2000 * i // 8per = 32 * 2 ** 30 // shotcards = ceil(5000 / per)print((cards - 1) * per)Ответ: 3816