Статья Автор: Деникина Н.В., Деникин А.В.

Сжатие: проценты и разы

Самое сложное здесь — правильно прочитать фразу

Формула объёма картинки уже знакома. Новая трудность — понять, что сделали с файлом.

Перед вычислениями задай себе один вопрос: какой файл здесь принят за 100 %?

Как переводить слова в действие

Сжали на 25 %

Было 100 %, осталось 75 %.

сжатый = исходный × 75 / 100

Сжали в 4 раза

Новый файл стал в 4 раза меньше.

сжатый = исходный / 4

Сжатый = 75 % исходного

За 100 % взят исходный файл.

сжатый = исходный × 75 / 100

Исходный больше сжатого на 35 %

Здесь за 100 % взят сжатый.

исходный = сжатый × 135 / 100

Не запоминай десятичные дроби. Проще думать процентами: 75 % → ×75/100, 135 % → ×135/100.

Самая частая ошибка

Сжали на 35 %

Исходный файл — 100 %.
После сжатия осталось 65 %.

сжатый = исходный × 65 / 100

Исходный больше сжатого на 35 %

Сжатый файл — 100 %.
Исходный тогда составляет 135 %.

исходный = сжатый × 135 / 100

Фразы похожи, но означают разные действия. Поэтому сначала ищем, от какого файла считаются проценты.

А служебная информация — это совсем другое

Заголовок файла, служебные данные и дополнительная информация не изменяют файл во столько-то раз. Они просто занимают ещё немного памяти.

Сжатие

Меняет размер файла.

умножаем или делим

Служебные данные

Добавляются к файлу отдельно.

прибавляем

Запомни: сжатие меняет размер умножением или делением, служебная информация прибавляется.

В каком порядке считать

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 бит?

Потому что тогда файл станет слишком большим. Это полезная проверка для слова «максимальное».

Если взять 12 бит

\(640\cdot256\cdot12\)

исходный файл = 240 Кбайт

После сжатия

\(240 \cdot \frac{100}{135}\approx177{,}8\) Кбайт

А можно только 170 Кбайт.

12 бит уже не помещаются. Значит, 11 бит действительно максимум.

Как считать проценты в программе

Можно написать 1.35, но надёжнее вообще не использовать десятичную дробь.

Лучше так

original = compressed * 135 / 100

Почему?

Сразу видно смысл: сжатый файл — 100 %, исходный — 135 %.

Что запомнить

Найди, что принято за 100 %
Проценты превращай в множитель
Служебные данные прибавляются
Для максимума проверь следующее значение, убедись, что оно не подходит


Вывод программы:

11
2048

 


Ловушки сжатия

«Больше на 35 %» превратили в ×0,65

Сначала посмотри, что принято за 100 %. Если за 100 % взят сжатый файл, то исходный составляет 135 %:

исходный = сжатый × 135 / 100

Служебные данные тоже «сжали»

Заголовок и другая служебная информация обычно не входят в сжимаемые данные.

Если дан общий лимит:

лимит − заголовок = место под данные

Лимит отнесли не к тому файлу

Читай буквально: «для хранения сжатого изображения отведено 170 Кбайт» означает, что 170 Кбайт — это ограничение именно для сжатого файла.

Исходный файл до сжатия мог быть больше.

Забыли, что изображений несколько

Если весь объём памяти дан, например, для 32 снимков, нельзя сразу применять его к одному изображению.

сначала находим объём одного снимка

Использовали десятичную дробь

В Python некоторые десятичные дроби хранятся неточно.

170 * 1.35
# 229.50000000000003

Поэтому в таких задачах надёжнее считать процент целыми числами:

170 * 135 / 100
Перед вычислениями проверь четыре вещи: что принято за 100 %, к какому файлу относится лимит, есть ли служебные данные и сколько изображений хранится.

Проверь себя


Файл сжали на 40 %. На какой множитель нужно умножить исходный размер, чтобы получить сжатый?


Исходный файл больше сжатого на 25 %. Сжатый занимает 200 Кбайт. Сколько Кбайт занимает исходный файл? В ответе запишите целое число.


Сопоставьте формулировку из условия и действие со сжатым размером.


Отметьте верные утверждения.


Изображение 800 × 600 пикселей. После сжатия файл стал на 20 % меньше исходного и занял ровно 100 Кбайт. Какое максимальное количество цветов можно использовать в палитре? В ответе запишите целое число.

Печать