ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ сТатия ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ QOI

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ лСгковСсный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ сТатия ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ — QOI (Quite OK Image), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΡ‡Π΅Π½ΡŒ быстро ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒ изобраТСния Π² Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… пространствах RGB ΠΈ RGBA. ΠŸΡ€ΠΈ сравнСнии ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ PNG однопоточная эталонная рСализация Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° QOI Π½Π° языкС Π‘ΠΈ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ SIMD-инструкции ΠΈ ассСмблСрныС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΠΎ скорости кодирования Π² 20-50 Ρ€Π°Π· прСвосходит Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libpng ΠΈ stb_image, Π° ΠΏΠΎ скорости дСкодирования Π² 3-4 Ρ€Π°Π·Π°. По эффСктивности сТатия QOI Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ тСстов Π±Π»ΠΈΠ·ΠΎΠΊ ΠΊ libpng (Π² ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ тСстах Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°Π΅Ρ‚, Π° Π² ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚), Π½ΠΎ Π² Ρ†Π΅Π»ΠΎΠΌ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°Π΅Ρ‚ stb_image (Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ 20%).

Эталонная рСализация QOI Π½Π° языкС Π‘ΠΈ насчитываСт всСго 300 строк ΠΊΠΎΠ΄Π°. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ тСксты Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ энтузиастами ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠ² ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠ² Π½Π° языках Go, Zig ΠΈ Rust. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅Ρ‚ Π”ΠΎΠΌΠ΅Π½ΠΈΠΊ БаблСвский (Dominic Szablewski), Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠ³Ρ€, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ‹Ρ‚ создания Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для дСкодирования Π²ΠΈΠ΄Π΅ΠΎ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ MPEG1. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° QOI Π°Π²Ρ‚ΠΎΡ€ Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ созданиС эффСктивной ΠΈ простой Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ пСрСуслоТнённым соврСмСнным Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌ кодирования ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ QOI Π½Π΅ зависит ΠΎΡ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π° ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ изобраТСния (O(n)). ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ выполняСтся Π² ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ — ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ пиксСль обрабатываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· 4 способов, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌΡ‹Ρ… Π² зависимости ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΡˆΠ»Ρ‹Ρ… пиксСлСй. Если ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ пиксСль совпадаСт с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ, Ρ‚ΠΎ лишь увСличиваСтся счётчик ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ. Если пиксСль совпадаСт с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ 64 ΠΏΡ€ΠΎΡˆΠ»Ρ‹Ρ… пиксСлСй, Ρ‚ΠΎ вмСсто значСния указываСтся 6-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ смСщСниС Π½Π° ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΉ пиксСль. Если Ρ†Π²Π΅Ρ‚ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ пиксСля Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ отличаСтся, Π² ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ указываСтся Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ (сокращённоС ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ…, ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π² 2,4 ΠΈ 5 Π±ΠΈΡ‚Π°). Если оптимизация Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ°, указываСтся ΠΏΠΎΠ»Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ rgba.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru