Формула объёма картинки уже знакома. Новая трудность — понять, что сделали с файлом.
Сжали на 25 %
Было 100 %, осталось 75 %.
сжатый = исходный × 75 / 100
Сжали в 4 раза
Новый файл стал в 4 раза меньше.
сжатый = исходный / 4
Сжатый = 75 % исходного
За 100 % взят исходный файл.
Исходный больше сжатого на 35 %
Здесь за 100 % взят сжатый.
исходный = сжатый × 135 / 100
Сжали на 35 %
Исходный файл — 100 %. После сжатия осталось 65 %.
сжатый = исходный × 65 / 100
Сжатый файл — 100 %. Исходный тогда составляет 135 %.
Фразы похожи, но означают разные действия. Поэтому сначала ищем, от какого файла считаются проценты.
Заголовок файла, служебные данные и дополнительная информация не изменяют файл во столько-то раз. Они просто занимают ещё немного памяти.
Сжатие
Меняет размер файла.
умножаем или делим
Служебные данные
Добавляются к файлу отдельно.
прибавляем
1. Найди место под файл
Если есть заголовок, вычти его из общего лимита.
2. Разберись со сжатием
Определи, какой файл принят за 100 %.
3. Найди исходный объём
Именно он связан с количеством пикселей и глубиной цвета.
4. Найди глубину цвета
Делим допустимый объём в битах на количество пикселей.
Для хранения сжатого произвольного растрового изображения размером 640 на 256 пикселей отведено 170 Кбайт памяти без учёта размера заголовка файла. Исходный файл изображения больше, чем сжатый, на 35 %. Для кодирования цвета каждого пикселя используется одинаковое количество бит, коды пикселей записываются в файл один за другим без промежутков. Какое максимальное количество цветов можно использовать в изображении?
1. Что здесь 100 %?
Сказано: исходный больше сжатого на 35 %.
Значит:
сжатый = 100 % исходный = 135 %
2. Восстанавливаем исходный файл
\(170 \cdot \frac{135}{100}=229{,}5\) Кбайт
3. Переводим в биты
\(229{,}5\cdot1024\cdot8=1880064\) бит
4. Считаем пиксели
\(640\cdot256=163840\)
5. Сколько бит можно дать одному пикселю?
\(\frac{1880064}{163840}=11{,}475\)
На каждый пиксель можно выделить только целое количество бит.
Значит, максимум — 11 бит.
6. Сколько это цветов?
\(N=2^{11}=2048\)
Ответ: 2048.
Потому что тогда файл станет слишком большим. Это полезная проверка для слова «максимальное».
Если взять 12 бит
\(640\cdot256\cdot12\)
исходный файл = 240 Кбайт
После сжатия
\(240 \cdot \frac{100}{135}\approx177{,}8\) Кбайт
А можно только 170 Кбайт.
Можно написать 1.35, но надёжнее вообще не использовать десятичную дробь.
1.35
Лучше так
original = compressed * 135 / 100
Почему?
Сразу видно смысл: сжатый файл — 100 %, исходный — 135 %.
Вывод программы:
11 2048
«Больше на 35 %» превратили в ×0,65
Сначала посмотри, что принято за 100 %. Если за 100 % взят сжатый файл, то исходный составляет 135 %:
Служебные данные тоже «сжали»
Заголовок и другая служебная информация обычно не входят в сжимаемые данные.
Если дан общий лимит:
лимит − заголовок = место под данные
Лимит отнесли не к тому файлу
Читай буквально: «для хранения сжатого изображения отведено 170 Кбайт» означает, что 170 Кбайт — это ограничение именно для сжатого файла.
Исходный файл до сжатия мог быть больше.
Забыли, что изображений несколько
Если весь объём памяти дан, например, для 32 снимков, нельзя сразу применять его к одному изображению.
сначала находим объём одного снимка
Использовали десятичную дробь
В Python некоторые десятичные дроби хранятся неточно.
170 * 1.35 # 229.50000000000003
Поэтому в таких задачах надёжнее считать процент целыми числами:
170 * 135 / 100
Файл сжали на 40 %. На какой множитель нужно умножить исходный размер, чтобы получить сжатый?
Исходный файл больше сжатого на 25 %. Сжатый занимает 200 Кбайт. Сколько Кбайт занимает исходный файл? В ответе запишите целое число.
Сопоставьте формулировку из условия и действие со сжатым размером.
Отметьте верные утверждения.
Изображение 800 × 600 пикселей. После сжатия файл стал на 20 % меньше исходного и занял ровно 100 Кбайт. Какое максимальное количество цветов можно использовать в палитре? В ответе запишите целое число.