Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

Π’ΠΎΠ²Π΅Π΄

ЧСститки.
НС Ρ‚ΠΎΠ»ΠΊΡƒ ΠΎΠ΄Π°ΠΌΠ½Π°, ΠΊΠΎΠ³Π° студирав Π½Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€Π·ΠΈΡ‚Π΅Ρ‚ΠΎΡ‚, имашС ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Π²ΠΎ дисциплината β€žΠ‘ΠΎΡ„Ρ‚Π²Π΅Ρ€ΡΠΊΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° бСзбСдност Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈΡ‚Π΅β€œ. Π—Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π±Π°Ρ€Π°ΡˆΠ΅ ΠΎΠ΄ нас Π΄Π° создадСмС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° која Π²Π³Ρ€Π°Π΄ΡƒΠ²Π° ΠΏΠΎΡ€Π°ΠΊΠ° Π²ΠΎ GIF-Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅. РСшив Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π°ΠΌ Ρ‚ΠΎΠ° Π²ΠΎ Јава.

Π’ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ќС опишам Π½Π΅ΠΊΠΎΠΈ тСорСтски Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΊΠ°ΠΊΠΎ ΠΈ ΠΊΠ°ΠΊΠΎ Π΅ создадСна ΠΎΠ²Π°Π° ΠΌΠ°Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°.

ВСорСтски Π΄Π΅Π»

GIF Ρ„ΠΎΡ€ΠΌΠ°Ρ‚

GIF (Graphics Interchange Format - Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π° Ρ€Π°Π·ΠΌΠ΅Π½Π° Π½Π° слики) Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈ слики, способСн Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° компрСсирани ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π±Π΅Π· Π³ΡƒΠ±Π΅ΡšΠ΅ Π½Π° ΠΊΠ²Π°Π»ΠΈΡ‚Π΅Ρ‚ΠΎΡ‚ Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π΄ΠΎ 256 Π±ΠΎΠΈ. Овој Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ бСшС Ρ€Π°Π·Π²ΠΈΠ΅Π½ Π²ΠΎ 1987 Π³ΠΎΠ΄ΠΈΠ½Π° (GIF87a) ΠΎΠ΄ CompuServe Π·Π° прСнос Π½Π° растСрски слики ΠΏΡ€Π΅ΠΊΡƒ ΠΌΡ€Π΅ΠΆΠΈ. Π’ΠΎ 1989 Π³ΠΎΠ΄ΠΈΠ½Π°, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΡ‚ бСшС ΠΈΠ·ΠΌΠ΅Π½Π΅Ρ‚ (GIF89a), Π΄ΠΎΠ΄Π°Π΄Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ° Π·Π° транспарСнтност ΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡ˜Π°.

GIF-Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ ΠΈΠΌΠ°Π°Ρ‚ Π±Π»ΠΎΠΊ структура. ОвиС Π±Π»ΠΎΠΊΠΎΠ²ΠΈ сСкогаш ΠΈΠΌΠ°Π°Ρ‚ фиксна Π΄ΠΎΠ»ΠΆΠΈΠ½Π° (ΠΈΠ»ΠΈ зависи ΠΎΠ΄ Π½Π΅ΠΊΠΎΠΈ Π·Π½Π°ΠΌΠ΅Π½Ρ†Π°), Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π΅ рСчиси Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ° ΠΎΠΊΠΎΠ»Ρƒ Ρ‚ΠΎΠ° ΠΊΠ°Π΄Π΅ сС Π½Π°ΠΎΡ“Π° сСкој Π±Π»ΠΎΠΊ. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° Π½Π°Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½Π°Ρ‚Π° Π½Π΅Π°Π½ΠΈΠΌΠΈΡ€Π°Π½Π° GIF слика Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ GIF89a:

Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

Од ситС Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π½Π° структурата, Π²ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜ ќС Π½Γ¨ интСрСсира Π±Π»ΠΎΠΊΠΎΡ‚ Π½Π° Π³Π»ΠΎΠ±Π°Π»Π½Π°Ρ‚Π° ΠΏΠ°Π»Π΅Ρ‚Π° ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π½ΠΈ Π·Π° ΠΏΠ°Π»Π΅Ρ‚Π°Ρ‚Π°:

  • 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, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ ΠΎΠΏΡˆΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ Π·Π° Π²ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ ΠΏΠΎΡ€Π°ΠΊΠ° Π²ΠΎ ΠΏΠ°Π»Π΅Ρ‚Π°Ρ‚Π° Π½Π° слики:

Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

Π—Π° Π΄Π° сС ΠΎΠ΄Ρ€Π΅Π΄ΠΈ присуството Π½Π° ΠΏΠΎΡ€Π°ΠΊΠ° Π²ΠΎ слика, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ Π΅ Π΄Π° сС Π΄ΠΎΠ΄Π°Π΄Π΅ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° Π½ΠΈΠ·Π° ΠΎΠ΄ Π±ΠΈΡ‚ΠΎΠ²ΠΈ Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Π½Π° ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π°, ΠΊΠΎΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΡ‚ ΠΏΡ€Π²ΠΎ Π³ΠΈ Ρ‡ΠΈΡ‚Π° ΠΈ ја ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° исправноста. Ако Π½Π΅ сС ΠΏΠΎΠΊΠ»ΠΎΠΏΡƒΠ²Π°, Ρ‚ΠΎΠ³Π°Ρˆ сС смСта Π΄Π΅ΠΊΠ° Π½Π΅ΠΌΠ° скриСна ΠΏΠΎΡ€Π°ΠΊΠ° Π½Π° сликата. Π‘Π»Π΅Π΄Π½ΠΎ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја ΠΎΠ΄Ρ€Π΅Π΄ΠΈΡ‚Π΅ Π΄ΠΎΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π°. ΠŸΠΎΡ‚ΠΎΠ° тСкстот Π½Π° самата ΠΏΠΎΡ€Π°ΠΊΠ°.

КласСн Π΄ΠΈΡ˜Π°Π³Ρ€Π°ΠΌ Π½Π° Ρ†Π΅Π»Π°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°:

Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°

Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Ρ†Π΅Π»Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΠ΄Π΅Π»ΠΈ Π½Π° Π΄Π²Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ: ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Π΅Π½ΠΊΡ€ΠΈΠΏΡ†ΠΈΡ˜Π° Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΡšΠ΅ Encryptor, Π½Π° часови GIFEncryptorByLSBMethod ΠΈ GIFEncryptorByPaletteExtensionMethod, ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° корисничкиот ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ.

РазмислСтС Π·Π° класата GIFEncryptorByLSBMethod.

Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

области firstLSBit ΠΈ secondLSBit Π³ΠΈ содрТи Π±Ρ€ΠΎΠ΅Π²ΠΈΡ‚Π΅ Π½Π° Π±ΠΈΡ‚ΠΎΠ²ΠΈ ΠΎΠ΄ сСкој Π±Π°Ρ˜Ρ‚ ΠΎΠ΄ сликата Π²ΠΎ која Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС внСсС ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π° ΠΈ ΠΎΠ΄ ΠΊΠ°Π΄Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π° ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π°. ПолС checkSequence складира Π½ΠΈΠ·Π° Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π±ΠΈΡ‚ΠΎΠ²ΠΈ Π·Π° Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΏΡ€Π΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡšΠ΅ Π½Π° Π²Π³Ρ€Π°Π΄Π΅Π½Π°Ρ‚Π° ΠΏΠΎΡ€Π°ΠΊΠ°. Π‘Ρ‚Π°Ρ‚ΠΈΡ‡ΠΊΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ getEncryptingFileParameters Π³ΠΈ Π²Ρ€Π°ΡœΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π° Π½Π°Π²Π΅Π΄Π΅Π½Π°Ρ‚Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΈ карактСристикитС Π½Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΡ˜Π°Π»Π½Π°Ρ‚Π° ΠΏΠΎΡ€Π°ΠΊΠ°.

Алгоритам Π·Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ encrypt класа GIFEncryptorByLSBMethod:

Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

И Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ‚ ΠΊΠΎΠ΄:

@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:

Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

@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 ΠΌΠ΅Ρ‚ΠΎΠ΄

Π”Π° Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ° Π²Π°ΠΊΠ²Π° слика:

Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

На ΠΎΠ²Π°Π° слика, ΠΏΠ°Π»Π΅Ρ‚Π°Ρ‚Π° сС состои ΠΎΠ΄ 256 Π±ΠΎΠΈ (ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π° Paint). ΠŸΡ€Π²ΠΈΡ‚Π΅ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Π±ΠΎΠΈ сС: Π±Π΅Π»Π°, Ρ†Ρ€Π½Π°, Ρ†Ρ€Π²Π΅Π½Π°, Π·Π΅Π»Π΅Π½Π°. Π”Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Π±ΠΎΠΈ сС Ρ†Ρ€Π½ΠΈ. Π‘Π΅ΠΊΠ²Π΅Π½Ρ†Π°Ρ‚Π° Π½Π° Π±ΠΈΡ‚ΠΎΠ²ΠΈ Π½Π° Π³Π»ΠΎΠ±Π°Π»Π½Π°Ρ‚Π° ΠΏΠ°Π»Π΅Ρ‚Π° ќС Π±ΠΈΠ΄Π΅ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ слСдува:

11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...

Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

ΠžΡ‚ΠΊΠ°ΠΊΠΎ ќС сС Π²ΠΌΠ΅Ρ‚Π½Π΅ ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π°, ΠΏΠΎΠ΄Π²Π»Π΅Ρ‡Π΅Π½ΠΈΡ‚Π΅ Π±ΠΈΡ‚ΠΎΠ²ΠΈ ќС сС Π·Π°ΠΌΠ΅Π½Π°Ρ‚ со Π±ΠΈΡ‚ΠΎΠ²ΠΈ ΠΎΠ΄ ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π°. Π Π΅Π·ΡƒΠ»Ρ‚ΠΈΡ€Π°Ρ‡ΠΊΠ°Ρ‚Π° слика рСчиси Π½Π΅ сС Ρ€Π°Π·Π»ΠΈΠΊΡƒΠ²Π° ΠΎΠ΄ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΠΎΡ‚.

Авторски
Π‘Π»ΠΈΠΊΠ° со Π²Π³Ρ€Π°Π΄Π΅Π½Π° ΠΏΠΎΡ€Π°ΠΊΠ°

Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF
Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

ΠœΠ΅Ρ‚ΠΎΠ΄ Π½Π° ΠΏΡ€ΠΎΡˆΠΈΡ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΠ°Π»Π΅Ρ‚Π°Ρ‚Π°

Кога ќС ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ слика ΡˆΡ‚ΠΎ содрТи ΠΏΠΎΡ€Π°ΠΊΠ° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ овој ΠΌΠ΅Ρ‚ΠΎΠ΄, ќС ја Π²ΠΈΠ΄ΠΈΡ‚Π΅ слСдната слика:

Π‘Ρ‚Π΅Π³Π°Π½ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜Π° Π²ΠΎ GIF

Јасно Π΅ Π΄Π΅ΠΊΠ° овој ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ΠΌΠ° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π·Π° ΠΏΠΎΠ»Π½ΠΎΠΏΡ€Π°Π²Π½ΠΈ шпионски активности ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±Π°Ρ€Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π°.

Π¨ΠΈΡ„Ρ€ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ/Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π²ΠΎ Π°Π½ΠΈΠΌΠΈΡ€Π°Π½ΠΈ слики Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° исто ΠΊΠ°ΠΊΠΎ ΠΈ кај ΠΎΠ±ΠΈΡ‡Π½ΠΈΡ‚Π΅ статични слики, Π½ΠΎ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π΅ Π΅ ΡΠΊΡ€ΡˆΠ΅Π½Π°.

ΠšΠΎΡ€ΠΈΡΡ‚Π΅Π½ΠΈ ΠΈΠ·Π²ΠΎΡ€ΠΈ:

Download:

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€