ΠΠΎΠ²Π΅Π΄
Π§Π΅ΡΡΠΈΡΠΊΠΈ.
ΠΠ΅ ΡΠΎΠ»ΠΊΡ ΠΎΠ΄Π°ΠΌΠ½Π°, ΠΊΠΎΠ³Π° ΡΡΡΠ΄ΠΈΡΠ°Π² Π½Π° ΡΠ½ΠΈΠ²Π΅ΡΠ·ΠΈΡΠ΅ΡΠΎΡ, ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ Π²ΠΎ Π΄ΠΈΡΡΠΈΠΏΠ»ΠΈΠ½Π°ΡΠ° βΠ‘ΠΎΡΡΠ²Π΅ΡΡΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈΡΠ΅β. ΠΠ°Π΄Π°ΡΠ°ΡΠ° Π±Π°ΡΠ°ΡΠ΅ ΠΎΠ΄ Π½Π°Ρ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΊΠΎΡΠ° Π²Π³ΡΠ°Π΄ΡΠ²Π° ΠΏΠΎΡΠ°ΠΊΠ° Π²ΠΎ GIF-Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅. Π Π΅ΡΠΈΠ² Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Π°ΠΌ ΡΠΎΠ° Π²ΠΎ ΠΠ°Π²Π°.
ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ Π½Π΅ΠΊΠΎΠΈ ΡΠ΅ΠΎΡΠ΅ΡΡΠΊΠΈ ΡΠΎΡΠΊΠΈ, ΠΊΠ°ΠΊΠΎ ΠΈ ΠΊΠ°ΠΊΠΎ Π΅ ΡΠΎΠ·Π΄Π°Π΄Π΅Π½Π° ΠΎΠ²Π°Π° ΠΌΠ°Π»Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°.
Π’Π΅ΠΎΡΠ΅ΡΡΠΊΠΈ Π΄Π΅Π»
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...
ΠΡΠΊΠ°ΠΊΠΎ ΡΠ΅ ΡΠ΅ Π²ΠΌΠ΅ΡΠ½Π΅ ΠΏΠΎΡΠ°ΠΊΠ°ΡΠ°, ΠΏΠΎΠ΄Π²Π»Π΅ΡΠ΅Π½ΠΈΡΠ΅ Π±ΠΈΡΠΎΠ²ΠΈ ΡΠ΅ ΡΠ΅ Π·Π°ΠΌΠ΅Π½Π°Ρ ΡΠΎ Π±ΠΈΡΠΎΠ²ΠΈ ΠΎΠ΄ ΠΏΠΎΡΠ°ΠΊΠ°ΡΠ°. Π Π΅Π·ΡΠ»ΡΠΈΡΠ°ΡΠΊΠ°ΡΠ° ΡΠ»ΠΈΠΊΠ° ΡΠ΅ΡΠΈΡΠΈ Π½Π΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΠΊΡΠ²Π° ΠΎΠ΄ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΠΎΡ.
ΠΠ²ΡΠΎΡΡΠΊΠΈ
Π‘Π»ΠΈΠΊΠ° ΡΠΎ Π²Π³ΡΠ°Π΄Π΅Π½Π° ΠΏΠΎΡΠ°ΠΊΠ°
ΠΠ΅ΡΠΎΠ΄ Π½Π° ΠΏΡΠΎΡΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠ°Π»Π΅ΡΠ°ΡΠ°
ΠΠΎΠ³Π° ΡΠ΅ ΠΎΡΠ²ΠΎΡΠΈΡΠ΅ ΡΠ»ΠΈΠΊΠ° ΡΡΠΎ ΡΠΎΠ΄ΡΠΆΠΈ ΠΏΠΎΡΠ°ΠΊΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ ΠΎΠ²ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄, ΡΠ΅ ΡΠ° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΠ»ΠΈΠΊΠ°:
ΠΠ°ΡΠ½ΠΎ Π΅ Π΄Π΅ΠΊΠ° ΠΎΠ²ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π½Π΅ΠΌΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π·Π° ΠΏΠΎΠ»Π½ΠΎΠΏΡΠ°Π²Π½ΠΈ ΡΠΏΠΈΠΎΠ½ΡΠΊΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±Π°ΡΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΡΠΈΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠΎΡΠ°ΠΊΠ°ΡΠ°.
Π¨ΠΈΡΡΠΈΡΠ°ΡΠ΅ΡΠΎ/Π΄Π΅ΡΠΈΡΡΠΈΡΠ°ΡΠ΅ΡΠΎ Π²ΠΎ Π°Π½ΠΈΠΌΠΈΡΠ°Π½ΠΈ ΡΠ»ΠΈΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° ΠΈΡΡΠΎ ΠΊΠ°ΠΊΠΎ ΠΈ ΠΊΠ°Ρ ΠΎΠ±ΠΈΡΠ½ΠΈΡΠ΅ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ»ΠΈΠΊΠΈ, Π½ΠΎ Π°Π½ΠΈΠΌΠ°ΡΠΈΡΠ°ΡΠ° Π½Π΅ Π΅ ΡΠΊΡΡΠ΅Π½Π°.
ΠΠΎΡΠΈΡΡΠ΅Π½ΠΈ ΠΈΠ·Π²ΠΎΡΠΈ:
http://ru.wikipedia.org/wiki/Gif http://ru.wikipedia.org/wiki/Π‘ΡΠ΅Π³Π°Π½ΠΎΠ³ΡΠ°ΡΠΈΡ http://home.onego.ru/~chiezo/gif.htm
Download:
ΠΠ·Π²ΠΎΡ: www.habr.com