Една налудничава, но перфектно работеща идея – компресирането на текст като PNG изображение
Навярно това е глупава концепция. Но от време на време и най-глупавите хрумвания водят до непредвидени резултати.
Текстът на нещастието „ Ромео и Жулиета “ на Шекспир се състои от към 146 000 признака. Благодарение особеностите на британската писменост всеки знак може да бъде разказан благодарение на един байт. Така че размерът на един елементарен текстов файл в Unicode формат възлиза на към 142 KB.
В публикацията Adventures With Compression (Приключения с компресирането) нейният създател JamesG разсъждава върху състезанието за компресиране на текст и предлага една любопитна концепция:
„ Кодирайте текста като изображение и компресирайте това изображение. Ще ми би трябвало логаритъм за компресиране на изображения без загуби. Използването на RGB ще усили броя на стойностите, свързани с всяка дума. Може би би трябвало да трансформира изображението в оттенъци на сивото? ИлСтрува си проучването на тази малко налудничава концепция “.
Алгоритмите за компресиране на изображения нормално са доста положителни в намирането на моделите и шаблоните в изображенията и тяхното компресиране. Дали този тип компресия на изображенията би ни помогнала, в случай че преобразуваме текста в изображение?
Английският език и неговата пунктуация не са изключително комплицирани, тъй че пиесата съдържа единствено 77 неповторими признака. ASCII цената на всеки знак е сред 0 и 127. Нека създадем изображение в сиви тонове, в което всеки пиксел има същото равнище на сивото, както ASCII цената на признака.
Ето по какъв начин наподобява то след 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.