К содержанию

Подтема 3 из 5

Сжатие и заголовки

Как меняется объём после сжатия, как вернуть исходный и как учесть заголовки файлов.

Сжатие

Пусть снимок задачи темы перед отправкой сжимают на 25 %. Сколько он займёт?

Сжатие умножает объём на оставшуюся долю: после сжатия на 25 % остаётся 75 %. 1152 · 0,75 = 864 Кбайт.

«На 25 %», «до 25 %» и «в 4 раза» — разные множители. Выбери формулировку, чтобы увидеть, что осталось:

Объём уменьшился на 25 %
осталось 75 %q = 0,75
Объём уменьшился до 25 % исходного
осталось 25 %q = 0,25
Объём уменьшился в 4 раза
осталась четвертьq = 1/4 = 0,25
Сжатия нет
осталось всёq = 1

Процент уменьшения считают от исходного объёма: с 80 до 20 Мбайт — это уменьшение на 60 / 80 = 75 %, а не на 60 %.

Тонкости:два сжатия подряд

Доли перемножаются: после сжатия на 20 %, а затем ещё на 25 % остаётся 0,8 · 0,75 = 0,6 исходного. Итоговое уменьшение — 40 %, а не 45 %.

Исходный объём

Если известен сжатый объём, исходный находят делением на оставшуюся долю. Сжатый снимок занимает 864 Кбайт, сжатие на 25 %: 864 / 0,75 = 1152 Кбайт.

Прибавить к 864 ещё 25 % было бы ошибкой: получилось бы 1080. Эти 25 % считались от исходного, большего объёма.

Заголовок

Заголовок — служебная часть файла: его объём прибавляют к данным. Важно, что сжимают: только данные или весь файл вместе с заголовком.

Одни и те же данные 256 Кбайт и заголовок 64 Кбайт. Заголовок добавлен после сжатия: 192 + 64 = 256 Кбайт; сжат весь файл: 0,75 · 320 = 240 Кбайт.

Слово «каждый» меняет расчёт. Если у каждого из n файлов свой заголовок H, набор занимает n · (V + H); если заголовок один на весь набор — n · V + H.

Обратный ход

Если известен только итоговый объём, действия отменяют в обратном порядке. Пусть 32 изображения 512 × 256 вместе заняли 8 Мбайт; данные каждого сжаты на 25 %, после сжатия к каждому добавлен заголовок 64 Кбайт. Какова глубина цвета?

  1. Набор строился слева направо: глубина → данные → сжатие → заголовок → 32 файла. Известен только конец цепочки.
  2. 8 · 1024 / 32 = 256 Кбайт: сначала делим общий объём между файлами.
  3. 256 − 64 = 192 Кбайт: убираем заголовок: он добавлен последним.
  4. 192 / 0,75 = 256 Кбайт: восстанавливаем объём до сжатия.
  5. 256 · 8192 / (512 · 256) = 16 бит: делим биты данных на число пикселей. Глубина 16 бит, цветов 2¹⁶ = 65 536.

На файл 8 · 1024 / 32 = 256 Кбайт, без заголовка 192, до сжатия 192 / 0,75 = 256 Кбайт, глубина 256 · 8192 / (512 · 256) = 16 бит. Если бы получилась дробная глубина, взяли бы её целую часть: набор должен поместиться.

Тонкости:проценты в программе — целыми числами

Запись 1 - 0.70 в Python — не ровно 0,3, и вместо 10 получается 9,999…: целая часть станет 9. Поэтому долю записывают целыми числами: «осталось 30 из 100» — делимое умножают на 100, делитель на 30.

limit = 48 * 1024 * 8pixels = 512 * 256print(limit / (pixels * (1 - 0.70)))print(limit * 100 // (pixels * 30))
9.999999999999998 10

Итого

  • Сжатие на p %умножить на (100 − p) / 100
  • «До p %», «в k раз»осталось p % или 1/k
  • Исходный объёмсжатый / оставшаяся доля
  • Заголовокприбавить; у каждого файла — n · (V + H)
  • Обратный ходотменять действия с конца, глубину — вниз

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

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

Вопрос 1
Файл 40 Мбайт сжали на 15 %. Сколько он занимает теперь?
ОтветСкрыть ответ
Ответ
34 Мбайт: осталось 85 %, 40 · 0,85.
Вопрос 2
Объём «уменьшился до 20 % исходного». Какая доля осталась?
ОтветСкрыть ответ
Ответ
0,2: «до 20 %» — осталось 20 %, а не 80 %.
Вопрос 3
После сжатия на 30 % файл занимает 28 Мбайт. Сколько он занимал до сжатия?
ОтветСкрыть ответ
Ответ
40 Мбайт: 28 = 0,7 · V, V = 28 / 0,7. Прибавлять 30 % к 28 нельзя: они считались от исходного объёма.
Вопрос 4
Данные 300 Кбайт сжимают в 3 раза, а заголовок 24 Кбайт добавляют после сжатия. Каков объём файла?
ОтветСкрыть ответ
Ответ
124 Кбайт: 300 / 3 + 24.
Вопрос 5
Десять файлов по 96 Кбайт данных, у каждого свой заголовок 8 Кбайт. Каков общий объём?
ОтветСкрыть ответ
Ответ
1040 Кбайт: 10 · (96 + 8).

Практика

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

Сжатие на 15 %

Файл объёмом 40 Мбайт сжали на 15 %. Сколько Мбайт он занимает теперь?

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

На сколько процентов уменьшился объём

Объём файла уменьшился с 80 до 20 Мбайт. На сколько процентов он уменьшился?

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

Два сжатия подряд

Файл сначала сжали на 20 %, а затем получившийся файл — ещё на 50 %. На сколько процентов уменьшился исходный объём?

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

Объём до сжатия

После уменьшения на 30 % файл занимает 28 Мбайт. Сколько он занимал до сжатия?

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

Сжат весь файл с заголовком

Данные занимают 300 Кбайт, заголовок — 24 Кбайт. Весь файл вместе с заголовком сжимают в 3 раза. Каков объём сжатого файла в Кбайтах?

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

Заголовок у каждого файла

Десять файлов содержат по 96 Кбайт данных, у каждого файла свой заголовок 8 Кбайт. Каков общий объём файлов в Кбайтах?

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

Палитра при сжатии на 40 %

Изображение 1024 × 768 пикселей хранится в сжатом виде: сжатие уменьшает объём на 40 %. На изображение отведено не более 576 Кбайт. Какое наибольшее количество цветов можно использовать?

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

Палитра 64 изображений

В системе хранятся 64 изображения размером 1024 × 512 пикселей. Данные каждого изображения сжимаются на 25 %, после сжатия к каждому добавляется служебная информация объёмом 32 Кбайт. Все изображения вместе заняли 20 Мбайт. Сколько цветов использовано в палитре каждого изображения?

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

Описание карточки

Карточка каталога состоит из фотографии и текстового описания. Фотографии имеют размер 800 × 600 пикселей и палитру из 2²⁴ цветов; при сохранении их объём уменьшается на 75 %. 100 карточек занимают 50 Мбайт. Сколько Кбайт в среднем занимает описание одной карточки? Ответ округли до целого числа.

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