Една налудничава, но перфектно работеща идея – компресирането на текст като PNG изображение

Най-четени

Даниел Десподов
Даниел Десподов
Новинар. Увличам се от съвременни технологии, информационна безопасност, спорт, наука и изкуствен интелект.

Навярно това е глупава идея. Но понякога и най-глупавите идеи водят до неочаквани резултати.

Текстът на трагедията „Ромео и Жулиета“ на Шекспир се състои от около 146 000 символа. Благодарение особеностите на английската азбука всеки символ може да бъде описан с помощта на един байт. Така че размерът на един обикновен текстов файл в Unicode формат възлиза на около 142 KB.

В статията Adventures With Compression (Приключения с компресирането) нейният автор JamesG разсъждава върху конкурса за компресиране на текст и предлага една любопитна идея:

„Кодирайте текста като изображение и компресирайте това изображение. Ще ми трябва алгоритъм за компресиране на изображения без загуби. Използването на RGB ще увеличи броя на стойностите, свързани с всяка дума. Може би трябва да превърна изображението в оттенъци на сивото? ИлСтрува си изследването на тази малко налудничава идея“.

Алгоритмите за компресиране на изображения обикновено са много добри в намирането на моделите и шаблоните в изображенията и тяхното компресиране. Дали този вид компресия на изображенията би ни помогнала, ако преобразуваме текста в изображение?

Английският език и неговата пунктуация не са особено сложни, така че пиесата съдържа само 77 уникални символа. ASCII стойността на всеки символ е между 0 и 127. Нека създадем изображение в сиви тонове, в което всеки пиксел има същото ниво на сивото, както ASCII стойността на символа.

Ето как изглежда то след PNG компресиране без загуби:

Една налудничава, но перфектно работеща идея – компресирането на текст като PNG изображение
Случаен сив шум

Размерът е намалял до 55 KB! Това е около 40% от първоначалния размер на файла. Това е малко по-малко от ZIP и с около 9 байта повече от компресията на Brotli.

Файлът може да бъде прочетен със следния неособено сложен код на Python:

from PIL import Image
image = Image.open("ascii_grey.png")
pixels = list(image.getdata())
ascii = "".join([chr(pixel) for pixel in pixels])
with open("rj.txt", "w") as file:
     file.write(ascii)

Но е малко вероятно дори с най-съвременните алгоритми за компресиране на изображения да може това изображение да бъде компресирано още повече – картината изглежда като случаен шум. Да, вие и аз знаем, че тя съхранява данни. И един статистик, който изчислява ентропията, вероятно би определил, че файлът съдържа данни, които могат да бъдат прочетени. Но алгоритмите за компресиране на изображения работят в съвсем друга сфера. Те търсят блокове с един и същи цвят, предсказуеми градиенти и други статистически характеристики.

Все пак се получи! Компресирането на изображения без загуби е доста ефективен начин за компресия на ASCII текстове.

Да напомним, че PNG (portable network graphics) е формат за съхранение на графична информация, който използва компресия без загуби с помощта на алгоритъма Deflate.

АбонаментВсичко важно от света на технологиите, директно в пощата ти.

С абонирането приемате нашите Условия и Политика за поверителност. Може да се отпишете с един клик по всяко време.


Коментирайте статията в нашите Форуми. За да научите първи най-важното, харесайте страницата ни във Facebook, и ни последвайте в Google Новини, TikTok, Telegram и Viber или изтеглете приложението на Kaldata.com за Android, iPhone, Huawei, Google Chrome, Microsoft Edge и Opera!

5 Коментара
стари
нови оценка

Нови ревюта

Подобни новини