Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠΎΠ·Π΄ΡΠ°Π²ΠΈ.
ΠΠ΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΎΡΠ΄Π°Π²Π½Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ΅Ρ
Π² ΡΠ½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠ°, ΠΈΠΌΠ°ΡΠ΅ ΠΊΡΡΡΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎ Π΄ΠΈΡΡΠΈΠΏΠ»ΠΈΠ½Π°ΡΠ° βΠ‘ΠΎΡΡΡΠ΅ΡΠ½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡβ. ΠΠ°Π΄Π°Π½ΠΈΠ΅ΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, ΠΊΠΎΡΡΠΎ Π²Π³ΡΠ°ΠΆΠ΄Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² GIF ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π Π΅ΡΠΈΡ
Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Ρ Π² Java.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΎΠΏΠΈΡΠ° Π½ΡΠΊΠΎΠΈ ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ½ΠΈ ΡΠΎΡΠΊΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΊΠ°ΠΊ Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° ΡΠ°Π·ΠΈ ΠΌΠ°Π»ΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°.
Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ½Π° ΡΠ°ΡΡ
GIF ΡΠΎΡΠΌΠ°Ρ
GIF (Graphics Interchange Format - ΡΠΎΡΠΌΠ°Ρ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ) Π΅ ΡΠΎΡΠΌΠ°Ρ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΠΏΠΎΡΠΎΠ±Π΅Π½ Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ°Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π±Π΅Π· Π·Π°Π³ΡΠ±Π° Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ Π²ΡΠ² ΡΠΎΡΠΌΠ°Ρ Π΄ΠΎ 256 ΡΠ²ΡΡΠ°. Π’ΠΎΠ·ΠΈ ΡΠΎΡΠΌΠ°Ρ Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΏΡΠ΅Π· 1987 Π³. (GIF87a) ΠΎΡ CompuServe Π·Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°ΡΡΠ΅ΡΠ½ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΌΡΠ΅ΠΆΠΈ. ΠΡΠ΅Π· 1989 Π³. ΡΠΎΡΠΌΠ°ΡΡΡ Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½ (GIF89a), Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡ ΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ.
GIF ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ ΠΈΠΌΠ°Ρ Π±Π»ΠΎΠΊΠΎΠ²Π° ΡΡΡΡΠΊΡΡΡΠ°. Π’Π΅Π·ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΈΠΌΠ°Ρ ΡΠΈΠΊΡΠΈΡΠ°Π½Π° Π΄ΡΠ»ΠΆΠΈΠ½Π° (ΠΈΠ»ΠΈ ΡΠΎΠ²Π° Π·Π°Π²ΠΈΡΠΈ ΠΎΡ Π½ΡΠΊΠΎΠΈ ΡΠ»Π°Π³ΠΎΠ²Π΅), ΡΠ°ΠΊΠ° ΡΠ΅ Π΅ ΠΏΠΎΡΡΠΈ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Π³ΡΠ΅ΡΠΊΠ° ΠΊΡΠ΄Π΅ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π²ΡΠ΅ΠΊΠΈ Π±Π»ΠΎΠΊ. Π‘ΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Π½Π°ΠΉ-ΠΏΡΠΎΡΡΠΎΡΠΎ Π½Π΅Π°Π½ΠΈΠΌΠΈΡΠ°Π½ΠΎ GIF ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠ² ΡΠΎΡΠΌΠ°Ρ GIF89a:

ΠΡ Π²ΡΠΈΡΠΊΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°, Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΠΎΡ Π³Π»ΠΎΠ±Π°Π»Π½ΠΈΡ Π±Π»ΠΎΠΊ Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ° ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅, ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΈ Π·Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ°:
CTβ Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π° Π³Π»ΠΎΠ±Π°Π»Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°. ΠΠΊΠΎ ΡΠΎΠ·ΠΈ ΡΠ»Π°Π³ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½, Π³Π»ΠΎΠ±Π°Π»Π½Π°ΡΠ° ΠΏΠ°Π»ΠΈΡΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ»Π΅Π΄ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠ° Π½Π° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ Π΅ΠΊΡΠ°Π½.Sizeβ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ° ΠΈ Π±ΡΠΎΠΉ ΡΠ²Π΅ΡΠΎΠ²Π΅ Π² ΠΊΠ°ΡΡΠΈΠ½Π°ΡΠ°. Π‘ΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π·Π° ΡΠΎΠ·ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
Π Π°Π·ΠΌΠ΅Ρ
ΠΡΠΎΠΉ ΡΠ²Π΅ΡΠΎΠ²Π΅
Π Π°Π·ΠΌΠ΅Ρ Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ°, Π±Π°ΠΉΡΠΎΠ²Π΅
7
256
768
6
128
384
5
64
192
4
32
96
3
16
48
2
8
24
1
4
12
0
2
6
ΠΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅
Π©Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π²ΡΠ² ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ:
- ΠΠ΅ΡΠΎΠ΄ LSB (Π½Π°ΠΉ-ΠΌΠ°Π»ΡΠΊ Π·Π½Π°ΡΠΈΠΌ Π±ΠΈΡ).
- ΠΠ΅ΡΠΎΠ΄ Π·Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΏΠ°Π»ΠΈΡΡΠΈ
LSB ΠΌΠ΅ΡΠΎΠ΄ - ΠΎΠ±Ρ ΠΌΠ΅ΡΠΎΠ΄ Π½Π° ΡΡΠ΅Π³Π°Π½ΠΎΠ³ΡΠ°ΡΠΈΡ. Π‘ΡΡΡΠΎΠΈ ΡΠ΅ ΠΎΡ Π·Π°ΠΌΡΠ½Π° Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π·Π½Π°ΡΠΈΠΌΠΈ Π±ΠΈΡΠΎΠ²Π΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° (Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π±Π°ΠΉΡΠΎΠ²Π΅ΡΠ΅ Π½Π° Π³Π»ΠΎΠ±Π°Π»Π½Π°ΡΠ° ΠΏΠ°Π»ΠΈΡΡΠ°) Ρ Π±ΠΈΡΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΠΊΡΠΈΡΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
ΠΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π²Π° Π±ΠΈΡΠ° Π² Π±Π°ΠΉΡΠΎΠ²Π΅ΡΠ΅ Π½Π° Π³Π»ΠΎΠ±Π°Π»Π½Π°ΡΠ° ΠΏΠ°Π»ΠΈΡΡΠ° ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π·Π° 24-Π±ΠΈΡΠΎΠ²ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ²Π΅ΡΠΎΠ²Π°ΡΠ° ΠΏΠ°Π»ΠΈΡΡΠ° Π΅ ΡΡΠΈ Π±Π°ΠΉΡΠ° Π·Π° ΡΠ΅ΡΠ²Π΅Π½ΠΎ, ΡΠΈΠ½ΡΠΎ ΠΈ Π·Π΅Π»Π΅Π½ΠΎ, ΡΠ»Π΅Π΄ Π²Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² Π½Π΅Π³ΠΎ, Π²ΡΠ΅ΠΊΠΈ ΡΠ²Π΅ΡΠ΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ 3/255 Π³ΡΠ°Π΄Π°ΡΠΈΠΈ. Π’Π°ΠΊΠ°Π²Π° ΠΏΡΠΎΠΌΡΠ½Π°, ΠΏΡΡΠ²ΠΎ, ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΠ° ΠΈΠ»ΠΈ ΡΡΡΠ΄Π½ΠΎ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΠΌΠ° Π·Π° ΡΠΎΠ²Π΅ΡΠΊΠΎΡΠΎ ΠΎΠΊΠΎ, ΠΈ Π²ΡΠΎΡΠΎ, Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ Π²ΠΈΠΆΠ΄Π° Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π·Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Ρ Π½ΠΈΡΠΊΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ.
ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΡΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠ΅ Π·Π°Π²ΠΈΡΠΈ ΠΏΡΡΠΊΠΎ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ° Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ° Π΅ 256 ΡΠ²ΡΡΠ° ΠΈ Π°ΠΊΠΎ Π΄Π²Π° Π±ΠΈΡΠ° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠ° Π·Π°ΠΏΠΈΡΠ°Π½ΠΈ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π½Π° Π²ΡΠ΅ΠΊΠΈ ΡΠ²ΡΡ, ΡΠΎΠ³Π°Π²Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π°ΡΠ° Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ (Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π°ΡΠ° ΠΏΠ°Π»ΠΈΡΡΠ° Π² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ) Π΅ 192 Π±Π°ΠΉΡΠ°. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π²Π³ΡΠ°Π΄Π΅Π½ΠΎ Π² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΠ°Π·ΠΌΠ΅ΡΡΡ Π½Π° ΡΠ°ΠΉΠ»Π° Π½Π΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ.
ΠΠ΅ΡΠΎΠ΄ Π·Π° ΡΠ°Π·ΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΠΈ ΡΠ°ΠΌΠΎ Π·Π° GIF ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. Π©Π΅ Π±ΡΠ΄Π΅ Π½Π°ΠΉ-Π΅ΡΠ΅ΠΊΡΠ½ΠΎ ΠΏΡΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ ΠΌΠ°Π»ΠΊΠ° ΠΏΠ°Π»ΠΈΡΡΠ°. Π‘ΡΡΠ½ΠΎΡΡΡΠ° ΠΌΡ Π΅, ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ°, ΠΊΠ°ΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΌΡΡΡΠΎ Π·Π° Π·Π°ΠΏΠΈΡ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π±Π°ΠΉΡΠΎΠ²Π΅ Π½Π° ΠΌΡΡΡΠΎΡΠΎ Π½Π° ΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ Π±Π°ΠΉΡΠΎΠ²Π΅. ΠΠΊΠΎ ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ, ΡΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ° Π΅ 2 ΡΠ²ΡΡΠ° (6 Π±Π°ΠΉΡΠ°), ΡΠΎΠ³Π°Π²Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° Π²Π³ΡΠ°Π΄Π΅Π½ΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ 256 Γ 3β6 = 762 Π±Π°ΠΉΡΠ°. ΠΠ΅Π΄ΠΎΡΡΠ°ΡΡΠΊΡΡ Π΅ Π½ΠΈΡΠΊΠ°ΡΠ° ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠ° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ; Π²Π³ΡΠ°Π΄Π΅Π½ΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΡΠ΅ΡΠ΅Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π²ΡΠ΅ΠΊΠΈ ΡΠ΅ΠΊΡΡΠΎΠ² ΡΠ΅Π΄Π°ΠΊΡΠΎΡ, Π°ΠΊΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π΅ Π΅ Π±ΠΈΠ»ΠΎ ΠΏΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π½Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅.
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ° ΡΠ°ΡΡ
ΠΠΈΠ·Π°ΠΉΠ½ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°
ΠΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ ΠΈ Π΄Π΅ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π² ΠΏΠ°ΠΊΠ΅ΡΠ° com.tsarik.steganography. Π’ΠΎΠ·ΠΈ ΠΏΠ°ΠΊΠ΅Ρ Π²ΠΊΠ»ΡΡΠ²Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Encryptor Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈ encrypt ΠΈ decrypt, ΠΠ»Π°Ρ Binary, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π±ΠΈΡΠΎΠ²ΠΈ ΠΌΠ°ΡΠΈΠ²ΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Ρ ΠΊΠ»Π°ΡΠΎΠ²Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ UnableToEncryptException ΠΈ UnableToDecryptException, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Encryptor Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ ΠΏΡΠΈ ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅.
ΠΡΠ½ΠΎΠ²Π΅Π½ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ com.tsarik.programs.gifed ΡΠ΅ Π²ΠΊΠ»ΡΡΠ²Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Π΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Π½ ΠΊΠ»Π°Ρ ΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅Π½ ΠΌΠ΅ΡΠΎΠ΄ main, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°; ΠΊΠ»Π°Ρ, ΠΊΠΎΠΉΡΠΎ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ; ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ Ρ Π΄ΡΡΠ³ΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅.
Π ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠ°ΠΌΠΈΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ com.tsarik.programs.gifed.gif ΠΊΠ»Π°ΡΠΎΠ²Π΅ GIFEncryptorByLSBMethod ΠΈ GIFEncryptorByPaletteExtensionMethod. Π Π΄Π²Π°ΡΠ° ΠΊΠ»Π°ΡΠ° ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Encryptor.
ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° GIF ΡΠΎΡΠΌΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΎΠ±Ρ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ Π·Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ°:

ΠΠ° Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² Π΄Π°Π΄Π΅Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡ Π±ΠΈΡΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΡΡ ΠΏΡΡΠ²ΠΎ ΠΏΡΠΎΡΠΈΡΠ° ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π·Π° ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡ. ΠΠΊΠΎ Π½Π΅ ΡΡΠ²ΠΏΠ°Π΄Π°, ΡΠ΅ ΡΡΠΈΡΠ°, ΡΠ΅ Π² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½ΡΠΌΠ° ΡΠΊΡΠΈΡΠΎ ΠΏΠΎΡΠ»Π°Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ΠΊΡΡΠ° Π½Π° ΡΠ°ΠΌΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
ΠΠ»Π°ΡΠΎΠ²Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Π½Π° ΡΡΠ»ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°
ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠ»Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΎ Π½Π° Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°: ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° Π΄Π΅ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Encryptor, Π² ΠΊΠ»Π°ΡΠΎΠ²Π΅ GIFEncryptorByLSBMethod ΠΈ GIFEncryptorByPaletteExtensionMethodΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
ΠΠΎΠΌΠΈΡΠ»Π΅ΡΠ΅ Π·Π° ΠΊΠ»Π°ΡΠ° GIFEncryptorByLSBMethod.

ΠΏΠΎΠ»Π΅ΡΠ° firstLSBit ΠΈ secondLSBit ΡΡΠ΄ΡΡΠΆΠ° Π±ΡΠΎΡ Π½Π° Π±ΠΈΡΠΎΠ²Π΅ΡΠ΅ Π½Π° Π²ΡΠ΅ΠΊΠΈ Π±Π°ΠΉΡ ΠΎΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π² ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ ΠΎΡΠΊΡΠ΄Π΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΡΠ΅ΡΠ΅Π½ΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠΎΠ»Π΅ checkSequence ΡΡΡ
ΡΠ°Π½ΡΠ²Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡ Π±ΠΈΡΠΎΠ²Π΅ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°, Π·Π° Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π²Π³ΡΠ°Π΄Π΅Π½ΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. Π‘ΡΠ°ΡΠΈΡΠ΅Π½ ΠΌΠ΅ΡΠΎΠ΄ getEncryptingFileParameters Π²ΡΡΡΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ» ΠΈ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈΡΠ΅ Π½Π° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
ΠΠ»Π³ΠΎΡΠΈΡΡΠΌ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° encrypt ΠΊΠ»Π°Ρ GIFEncryptorByLSBMethod:

Π ΠΊΠΎΠ΄ΡΡ ΠΌΡ:
@Override
public void encrypt(File in, File out, String text) throws UnableToEncodeException, NullPointerException, IOException {
if (in == null) {
throw new NullPointerException("Input file is null");
}
if (out == null) {
throw new NullPointerException("Output file is null");
}
if (text == null) {
throw new NullPointerException("Text is null");
}
// read bytes from input file
byte[] bytes = new byte[(int)in.length()];
InputStream is = new FileInputStream(in);
is.read(bytes);
is.close();
// check format
if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
throw new UnableToEncodeException("Input file has wrong GIF format");
}
// read palette size property from first three bits in the 10-th byte from the file
byte[] b10 = Binary.toBitArray(bytes[10]);
byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
// calculate color count and possible message length
int bOrigColorCount = (int)Math.pow(2, bsize+1);
int possibleMessageLength = bOrigColorCount*3/4;
int possibleTextLength = possibleMessageLength-2;// one byte for check and one byte for message length
if (possibleTextLength < text.length()) {
throw new UnableToEncodeException("Text is too big");
}
int n = 13;
// write check sequence
for (int i = 0; i < checkSequence.length/2; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
ba[firstLSBit] = checkSequence[2*i];
ba[secondLSBit] = checkSequence[2*i+1];
bytes[n] = Binary.toByte(ba);
n++;
}
// write text length
byte[] cl = Binary.toBitArray((byte)text.length());
for (int i = 0; i < cl.length/2; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
ba[firstLSBit] = cl[2*i];
ba[secondLSBit] = cl[2*i+1];
bytes[n] = Binary.toByte(ba);
n++;
}
// write message
byte[] textBytes = text.getBytes();
for (int i = 0; i < textBytes.length; i++) {
byte[] c = Binary.toBitArray(textBytes[i]);
for (int ci = 0; ci < c.length/2; ci++) {
byte[] ba = Binary.toBitArray(bytes[n]);
ba[firstLSBit] = c[2*ci];
ba[secondLSBit] = c[2*ci+1];
bytes[n] = Binary.toByte(ba);
n++;
}
}
// write output file
OutputStream os = new FileOutputStream(out);
os.write(bytes);
os.close();
}
ΠΠ»Π³ΠΎΡΠΈΡΡΠΌ ΠΈ ΠΈΠ·Ρ
ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° decrypt ΠΊΠ»Π°Ρ GIFEncryptorByLSBMethod:

@Override
public String decrypt(File in) throws UnableToDecodeException, NullPointerException, IOException {
if (in == null) {
throw new NullPointerException("Input file is null");
}
// read bytes from input file
byte[] bytes = new byte[(int)in.length()];
InputStream is = new FileInputStream(in);
is.read(bytes);
is.close();
// check format
if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
throw new UnableToDecodeException("Input file has wrong GIF format");
}
// read palette size property from first three bits in the 10-th byte from the file
byte[] b10 = Binary.toBitArray(bytes[10]);
byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
// calculate color count and possible message length
int bOrigColorCount = (int)Math.pow(2, bsize+1);
int possibleMessageLength = bOrigColorCount*3/4;
int possibleTextLength = possibleMessageLength-2; // one byte for check and one byte for message length
int n = 13;
// read check sequence
byte[] csBits = new byte[checkSequence.length];
for (int i = 0; i < 4; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
csBits[2*i] = ba[firstLSBit];
csBits[2*i+1] = ba[secondLSBit];
n++;
}
byte cs = Binary.toByte(csBits);
if (cs != Binary.toByte(checkSequence)) {
throw new UnableToDecodeException("There is no encrypted message in the image (Check sequence is incorrect)");
}
// read text length
byte[] cl = new byte[8];
for (int i = 0; i < 4; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
cl[2*i] = ba[firstLSBit];
cl[2*i+1] = ba[secondLSBit];
n++;
}
byte textLength = Binary.toByte(cl);
if (textLength < 0) {
throw new UnableToDecodeException("Decoded text length is less than 0");
}
if (possibleTextLength < textLength) {
throw new UnableToDecodeException("There is no messages (Decoded message length (" + textLength + ") is less than Possible message length (" + possibleTextLength + "))");
}
// read text bits and make text bytes
byte[] bt = new byte[textLength];
for (int i = 0; i < bt.length; i++) {
byte[] bc = new byte[8];
for (int bci = 0; bci < bc.length/2; bci++) {
byte[] ba = Binary.toBitArray(bytes[n]);
bc[2*bci] = ba[firstLSBit];
bc[2*bci+1] = ba[secondLSBit];
n++;
}
bt[i] = Binary.toByte(bc);
}
return new String(bt);
}
ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»Π°ΡΠ° GIFEncryptorByPaletteExtensionMethod ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½, ΡΠ°ΠΌΠΎ ΠΌΠ΅ΡΠΎΠ΄ΡΡ Π·Π° Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅/ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΅ ΡΠ°Π·Π»ΠΈΡΠ΅Π½.
Π ΠΊΠ»Π°Ρ MainFrame ΠΎΠΏΠΈΡΠ°Π½ΠΈ ΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΎΠ±Π²ΠΈΠ²Π°Π½Π΅: encryptImage(Encryptor encryptor) ΠΈ decryptImage(Encryptor encryptor), ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Encryptor ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, Ρ.Π΅. ΠΎΡΠ²Π°ΡΡΠ½Π΅ Π½Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ² ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ Π·Π° ΠΈΠ·Π±ΠΎΡ Π½Π° ΡΠ°ΠΉΠ», ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΈ Ρ.Π½.; ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ: openImage(), ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, exit(), ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·Π»ΠΈΠ·Π° ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π’Π΅Π·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ ΠΎΡ ActionΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΡ ΠΌΠ΅Π½ΡΡΠΎ. Π’ΠΎΠ·ΠΈ ΠΊΠ»Π°Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΡΠΏΠΎΠΌΠ°Π³Π°ΡΠ΅Π»Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ: createComponents() - ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π° ΡΠΎΡΠΌΠ°ΡΠ°, loadImageFile(File f) β Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΡ ΡΠ°ΠΉΠ». ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»Π°ΡΠ° GIFEncryptorByPaletteExtensionMethod ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠ»Π°ΡΠ° GIFEncryptorByLSBMethod, ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° Π΅ Π² Π½Π°ΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ Π±Π°ΠΉΡΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π°Ρ ΠΈ ΡΠ΅ΡΠ°Ρ ΠΎΡ ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ°.
Π Π°Π±ΠΎΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°
LBS ΠΌΠ΅ΡΠΎΠ΄
ΠΠ° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΠΈΠΌΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π°:

Π ΡΠΎΠ²Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ° ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ 256 ΡΠ²ΡΡΠ° (ΠΊΠ°ΠΊΡΠΎ Paint Π·Π°ΠΏΠ°Π·Π²Π°). ΠΡΡΠ²ΠΈΡΠ΅ ΡΠ΅ΡΠΈΡΠΈ ΡΠ²ΡΡΠ° ΡΠ°: Π±ΡΠ»ΠΎ, ΡΠ΅ΡΠ½ΠΎ, ΡΠ΅ΡΠ²Π΅Π½ΠΎ, Π·Π΅Π»Π΅Π½ΠΎ. ΠΡΡΠ³ΠΈΡΠ΅ ΡΠ²Π΅ΡΠΎΠ²Π΅ ΡΠ° ΡΠ΅ΡΠ½ΠΈ. ΠΠ»ΠΎΠ±Π°Π»Π½Π°ΡΠ° Π±ΠΈΡΠΎΠ²Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΊΠ°ΠΊΡΠΎ ΡΠ»Π΅Π΄Π²Π°:
11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...

Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π±ΡΠ΄Π΅ Π²Π³ΡΠ°Π΄Π΅Π½ΠΎ, ΠΏΠΎΠ΄ΡΠ΅ΡΡΠ°Π½ΠΈΡΠ΅ Π±ΠΈΡΠΎΠ²Π΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΈ Ρ Π±ΠΈΡΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠΎΠ»ΡΡΠ΅Π½ΠΎΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠΈ Π½Π΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΠΎΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π°.
ΠΡΠΈΠ³ΠΈΠ½Π°Π»
ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ Π²Π³ΡΠ°Π΄Π΅Π½ΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅

![]()
ΠΠ΅ΡΠΎΠ΄ Π·Π° ΡΠ°Π·ΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠ°Π»ΠΈΡΡΠ°ΡΠ°
ΠΠΎΠ³Π°ΡΠΎ ΠΎΡΠ²ΠΎΡΠΈΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠ΄ΡΡΠΆΠ°ΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄, ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π°:

Π―ΡΠ½ΠΎ Π΅, ΡΠ΅ ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π½ΡΠΌΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π·Π° ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½ΠΈ ΡΠΏΠΈΠΎΠ½ΡΠΊΠΈ Π΄Π΅ΠΉΠ½ΠΎΡΡΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΈΡΠΊΠ²Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ.
Π¨ΠΈΡΡΠΎΠ²Π°Π½Π΅ΡΠΎ/Π΄Π΅ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ΡΠΎ Π² Π°Π½ΠΈΠΌΠΈΡΠ°Π½ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠΈ ΡΠΎΡΠ½ΠΎ ΠΊΠ°ΠΊΡΠΎ Π² ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ Π°Π½ΠΈΠΌΠ°ΡΠΈΡΡΠ° Π½Π΅ ΡΠ΅ ΡΠ°Π·Π²Π°Π»Ρ.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ:
ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅:
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com
