ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° графичСских Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²

Π”ΠΈΠΏΠ»ΠΎΠΌΠ½Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ΠœΠ΅Ρ‚ΠΎΠ΄ LoadFromFile Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ BMP-Ρ„Π°ΠΉΠ» с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, считывая Сгос диска Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ сначала читаСтся заголовокрастрового Ρ„Π°ΠΉΠ»Π°, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΠΈ с Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ указываСтся Π² ΠΏΠΎΠ»Π΅ infoHeadSize. Помимо этого Π² ΠΏΠΎΠ»Π΅ imageSize указываСтся вычислСнный Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСнияв Π±Π°ΠΉΡ‚Π°Ρ…. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° графичСских Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

1. ОписаниС графичСского Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Ρ„Π°ΠΉΠ»Π°

1.1 ОписаниС графичСского Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° GIF

графичСский ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚

1.1.1 ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния

GIF — Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ хранСния графичСских ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (ΠΎΡ‚ Π°Π½Π³Π». GraphicsInterchangeFormat). Π€ΠΎΡ€ΠΌΠ°Ρ‚ GIF способСн Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ сТатыС Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ изобраТСния Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π΄ΠΎ 256 Ρ†Π²Π΅Ρ‚ΠΎΠ² с ΠΏΠ°Π»ΠΈΡ‚Ρ€ΠΎΠΉ, ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½, Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ, для Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆΠ΅ΠΉ, Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΈ Ρ‚. Π΄.

НСзависящий ΠΎΡ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ обСспСчСния Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ GIF Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ Π² 1987 Π³ΠΎΠ΄Ρƒ (GIF87a) Ρ„ΠΈΡ€ΠΌΠΎΠΉ CompuServe для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ растровых ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΡΠ΅Ρ‚ям. Π’ 1989;ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π±Ρ‹Π» ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½ (GIF89a), Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прозрачности для создания ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. Π€Π°ΠΉΠ» GIF ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½Π΅ ΠΎΠ΄Π½ΠΎ, Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ растровых ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² Ρ„Π°ΠΉΠ»Π΅ частотой.

GIF ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Internet. Π€ΠΎΡ€ΠΌΠ°Ρ‚ GIF ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ рядом свойств, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ²ΡˆΠΈΡ… Π΅Π³ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Web-страниц:

— ΠŸΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ GIF ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹Π΅ области, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΡ‚ΠΎΠΉΡ‚ΠΈ ΠΎΡ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ элСмСнты страницы ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹.

— Π§Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ строк. ГрафичСский Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записан Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ сначала Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ каТдая чСтвСртая строка, растянутая Π½Π° Ρ‚Ρ€ΠΈ сосСдних. ЕстСствСнно, качСство отобраТСния Π±ΡƒΠ΄Π΅Ρ‚ достаточно Π½ΠΈΠ·ΠΊΠΎΠ΅. Π—Π°Ρ‚Π΅ΠΌ, ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… строк, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΠ΄. Вакая схСма позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π΅Ρ‰Π΅ Π΄ΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ графичСского Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ прСдставлСно Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

— ΠΠ½ΠΈΠΌΠ°Ρ†ΠΈΡ. Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ GIF прСдусмотрСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ создания Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ЀактичСски это нСсколько ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, записанных Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» ΠΈ Ρ‡Π΅Ρ€Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ…ся с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ[4].

ОсновноС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° GIF состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ†Π²Π΅Ρ‚Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записано Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ 256 Ρ†Π²Π΅Ρ‚ΠΎΠ².

ΠžΠ±Π»Π°ΡΡ‚ΡŒ примСнСния GIF-Ρ„Π°ΠΉΠ»ΠΎΠ² ограничиваСтся ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡ‹ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ сТатия ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (LZW-компрСссия), Ρ‡ΡŒΡ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ зависит ΠΎΡ‚ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΡ Ρ†Π²Π΅Ρ‚ΠΎΠ² Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, наличия ΠΎΠ΄Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹Ρ… областСй. ΠΠ°ΠΈΠ±ΠΎΠ»ΡŒΡˆΡƒΡŽ экономию объСма Ρ„Π°ΠΉΠ»Π° Π΄Π°ΡŽΡ‚ изобраТСния с Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΠΌ количСством Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠΌΠΈ ΠΎΠ΄Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹ΠΌΠΈ областями. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ GIF ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для отобраТСния графичСских мСню ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ, Π° Ρ‚Π°ΠΊΠΆΠ΅ для создания тСхничСских ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΉ (Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, схСмы, Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Ρ‚. ΠΏ.). Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя использованиС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° GIF для отобраТСния ΠΏΠΎΠ»Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹Ρ… Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΉ практичСски Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ примСнСния ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΌΠ°Π»ΠΎΠ³ΠΎ количСства ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΈ Π½ΠΈΠ·ΠΊΠΎΠΉ эффСктивности Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° сТатия для Ρ‚Π°ΠΊΠΈΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

1.1.2 ΠžΠ±Ρ‰Π°Ρ структура Ρ„Π°ΠΉΠ»Π° GIF

Π’Π°Π±Π»ΠΈΡ†Π°. ΠžΠ±Ρ‰Π°Ρ структура Ρ„Π°ΠΉΠ»Π° прСдставлСна Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ (см Ρ€ΠΈΡ. 1.1).

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ»Π°

ΠŸΠ°Π»ΠΈΡ‚Ρ€Π°

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅1

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅N

ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½Ρ†Π° = 3Π’

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт структуры ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

НачнСм с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π°. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ»Π° GIF прСдставлСн Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ (см Ρ€ΠΈΡ. 1.2.). Π’ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ‚Ρ€Π΅Ρ… Π±Π°ΠΉΡ‚Π°Ρ… стоит ΠΌΠ΅Ρ‚ΠΊΠ° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° (`GIF'). Π—Π° Π½Π΅ΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ 3 Π±Π°ΠΉΡ‚Π° с ΡƒΡ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅ΠΌ вСрсии GIF. Π”Π°Π»Π΅Π΅ располоТСн Π±Π»ΠΎΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 7 Π±Π°ΠΉΡ‚ΠΎΠ² с ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ логичСского экрана.

Π’Π°Π±Π»ΠΈΡ†Π°. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ»Π° GIF

НазваниС поля

Π Π°Π·ΠΌΠ΅Ρ€ (Π² Π±Π°ΠΉΡ‚Π°Ρ…)

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ GIF

47 49 46 («GIF»)

НомСр вСрсии

87Π° ΠΈΠ»ΠΈ 89Π°

Π¨ΠΈΡ€ΠΈΠ½Π°

Высота

Π€Π»Π°Π³ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π¦Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ информация

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ информация — это информация ΠΎ Ρ‚ΠΎΠΌ, Π΅ΡΡ‚ΡŒ Π»ΠΈ глобальная ΠΏΠ°Π»ΠΈΡ‚Ρ€Π°, сколько Π±ΠΈΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для RGB-прСдставлСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° Π² ΠΏΠ°Π»ΠΈΡ‚Ρ€Π΅, сколько Π±ΠΈΡ‚ΠΎΠ² приходится Π½Π° ΠΎΠ΄Π½Ρƒ Ρ‚ΠΎΡ‡ΠΊΡƒ изобраТСния (пиксСль), опрСдСлСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ высвСчивания пиксСлСй. ПослС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈΠ΄Π΅Ρ‚ ΠΏΠ°Π»ΠΈΡ‚Ρ€Π°, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для всСх ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Ρ„Π°ΠΉΠ»Π΅ GIF, Ссли Ρƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ Π½Π΅Ρ‚ собствСнной ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹. ΠŸΠ°Π»ΠΈΡ‚Ρ€Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ ΠΏΠ°Π»ΠΈΡ‚Ρ€Π° состоят ΠΈΠ· Ρ‚Ρ€ΠΎΠ΅ΠΊ Π±Π°ΠΉΡ‚ΠΎΠ² RGB. ОбС ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ — Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ — Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹. ПослС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π° ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ глобальной ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ слСдуСт ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ — ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ нСсколько (Ссли Π΅ΡΡ‚ΡŒ анимация). Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ изобраТСния сначала записываСтся собствСнный Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ (см. Ρ€ΠΈΡ. 1.3).

Π’Π°Π±Π»ΠΈΡ†Π°

НазваниС поля

Π Π°Π·ΠΌΠ΅Ρ€ (Π² Π±Π°ΠΉΡ‚Π°Ρ…)

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ изобраТСния

2Π‘hΠΈΠ»ΠΈ «,» (ASCII) для изобраТСния

ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹Π»Π΅Π²ΠΎΠ³ΠΎ края ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆ.

ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ края ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆ.

Π¨ΠΈΡ€ΠΈΠ½Π°

Высота

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ информация

НаличиС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Π»ΠΈΡ‚Ρ€, ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ изобраТСния

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ дСскриптор изобраТСния начинаСтся с ΡΠΈΠΌΠ²ΠΎΠ»Π°-раздСлитСля ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Роль раздСлитСля ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ состоит просто Π² ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Π΄Π΅ΡΠΊΡ€ΠΈΠΏΡ‚ΠΎΡ€ изобраТСния. Π­Ρ‚ΠΎ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли GIF-Ρ„Π°ΠΉΠ» состоит Π±ΠΎΠ»Π΅Π΅, Ρ‡Π΅ΠΌ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ изобраТСния. Π­Ρ‚ΠΎΡ‚ символ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ 0x2C ΠΈΠ»ΠΈ ',' (запятая). Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этот символ встрСчаСтся ΠΌΠ΅ΠΆΠ΄Ρƒ изобраТСниями, нСпосрСдствСнно Π·Π° Π½ΠΈΠΌ слСдуСт дСскриптор изобраТСния.

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ информация, Π² ΡΡ‚ΠΎΠΌ случаС, — это информация ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ локальной ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹, Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ порядкС ΠΈΠ»ΠΈ порядкС пСрСплСтСния ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, число Π±ΠΈΡ‚ Π½Π° ΠΏΠΈΠΊΡΠ΅Π»ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π”Π°Π»Π΅Π΅ ΠΈΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ локальная ΠΏΠ°Π»ΠΈΡ‚Ρ€Π° изобраТСния. ΠŸΠΎΡ‚ΠΎΠΌ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅. Π‘ΠΆΠ°Ρ‚Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ хранятся Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π»ΠΎΠΊΠΎΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ мСньшС 255 Π±Π°ΠΉΡ‚ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π»ΠΎΠΊ состоит ΠΈΠ· Π±Π°ΠΉΡ‚Π° Π΄Π»ΠΈΠ½Ρ‹ Π±Π»ΠΎΠΊΠ° ΠΈ, собствСнно, Π΄Π°Π½Π½Ρ‹Ρ…. Когда Π΄Π°Π½Π½Ρ‹Π΅ изобраТСния Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ, ΠΈΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.

ΠŸΠΎΡ‚ΠΎΠΊ графичСских Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ локально (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π½Π΅ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°), Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ источника (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ линиям). Π”Π°Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ строится Π½Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Π½Π° Ρ‚ранспортном ΡƒΡ€ΠΎΠ²Π½Π΅ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΡŽ ошибок, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ линиями. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ с Ρ†Π΅Π»ΡŒΡŽ обнаруТСния ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΠΈ ошибок[4].

1.1.3 Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ LZW

Π”Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² GIF хранятся Π² ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ сТатым Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ LZW (Lempel-ZivWelch). LZW — это способ сТатия Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ прСимущСства ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ растровыС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ содСрТат довольно ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ, LZW являСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ для ΠΈΡ… ΡΠΆΠ°Ρ‚ия ΠΈ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ия.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ понятия:

— «Π‘ΠΈΠΌΠ²ΠΎΠ»»: Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… — индСкс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ†Π²Π΅Ρ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ пиксСла (K).

— «Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ°»: нСсколько ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… символов. Π”Π»ΠΈΠ½Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΡ‚ 1 Π΄ΠΎ ΠΎΡ‡Π΅Π½ΡŒ большого числа символов ([…]K).

— «ΠŸΡ€Π΅Ρ„икс»: прСфикс нСпосрСдствСнно ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ символу, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ ([…]).

— «ΠšΠΎΡ€Π΅Π½ΡŒ»: односимвольная Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ([…]K, Π³Π΄Π΅ […] - пуста).

— «ΠšΠΎΠ΄»: число, опрСдСляСмоС извСстным количСством Π±ΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ.

— «ΠŸΠΎΡ‚ΠΎΠΊ ΠΊΠΎΠ΄ΠΎΠ²»: Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΊΠΎΠ΄ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ «Ρ€Π°ΡΡ‚Ρ€ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅» .

— «Π­Π»Π΅ΠΌΠ΅Π½Ρ‚»: ΠΊΠΎΠ΄ ΠΈ Π΅Π³ΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°.

— «Π’Π°Π±Π»ΠΈΡ†Π° Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ»: список элСмСнтов ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ….

ΠŸΡ€ΠΈ сТатии ΠΈ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ LZW ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ трСмя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ: ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ символов, ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΊΠΎΠ΄ΠΎΠ² ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ. ΠŸΡ€ΠΈ сТатии ΠΏΠΎΡ‚ΠΎΠΊ символов являСтся Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ ΠΊΠΎΠ΄ΠΎΠ² — Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ. ΠŸΡ€ΠΈ раскрытии Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ являСтся ΠΏΠΎΡ‚ΠΎΠΊ ΠΊΠΎΠ΄ΠΎΠ², Π° ΠΏΠΎΡ‚ΠΎΠΊ символов — Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ. Π’Π°Π±Π»ΠΈΡ†Π° Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ пороТдаСтся ΠΈ ΠΏΡ€ΠΈ сТатии ΠΈ ΠΏΡ€ΠΈ раскрытии, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ся ΠΎΡ‚ ΡΠΆΠ°Ρ‚ия ΠΊ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΠΈΡŽ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ LZW-сТатии, являСтся инициализация Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ символов. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (количСство Π±ΠΈΡ‚), ΠΈ Π·Π½Π°Ρ‚ΡŒ, сколько Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ символы. ПолоТим ΠΊΠΎΠ΄ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ€Π°Π²Π½Ρ‹ΠΌ 12 Π±ΠΈΡ‚Π°ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запоминания 0FFF, ΠΈΠ»ΠΈ 4096, элСмСнтов Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, установим соотвСтствиС ΠΊΠΎΠ΄Π° #0 символу #0, ΠΊΠΎΠ΄Π° #1 to ΡΠΈΠΌΠ²ΠΎΠ»Ρƒ #1, ΠΈ Ρ‚. Π΄., Π΄ΠΎ ΠΊΠΎΠ΄Π° #31 ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π° #31. Π’. Π΅. ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΡ‚ 0 Π΄ΠΎ 31 являСтся ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ (большС Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ΄ΠΎΠ², ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΡ… этим свойством).

НачнСм сТатиС Π΄Π°Π½Π½Ρ‹Ρ…: ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ «Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ прСфикс» ΠΈ «Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ». ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚. «Π’Скущая Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°» («[.c.]K) образуСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ прСфиксом ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ символом Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ символов.

Рассмотрим ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ символов, Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ P. Π‘Π΄Π΅Π»Π°Π΅ΠΌ [.c.]P Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΎΠΉ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ поиск Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ Π² Π½Π΅Π΅ [.c.]P. Если Π²Ρ…ΠΎΠ΄ΠΈΡ‚, Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ. Π—Π°Ρ‚Π΅ΠΌ Π΄Π΅Π»Π°Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ прСфикс [.c.]P.

Π‘Π΅Ρ€Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ символ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° символов — Q, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ прСфикс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ[.c.]Q. ВыполняСм поиск Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ Π² Π½Π΅Π΅ [.c.]Q. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚. Π”ΠΎΠ±Π°Π²ΠΈΠΌ [.c.]Q Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ ΠΏΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΠΌ #32,ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠ΄ для [.c.] Π² ΠΏΠΎΡ‚ΠΎΠΊ ΠΊΠΎΠ΄ΠΎΠ². Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°Ρ‡Π½Π΅ΠΌ ΠΎΠΏΡΡ‚ΡŒ с Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ прСфикса. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ символов ΠΊ [.c.], Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ [.c.]K, Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ [.c.]K Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΊΠΎΠ΄ для [.c.] ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ [.c.]K Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ.

Алгоритм компрСссии LZW выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (см. Ρ€ΠΈΡ. 1.4):

Рисунок 1.4 — Алгоритм компрСссии LZW

1.2 ОписаниС графичСского Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π’ΠœΠ 

1.2.1 ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния

Π€ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ² BMPΡ€ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Windows. Он ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ся всСми графичСскими Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ΡΡ для хранСния растровых ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для использования Π² Windows ΠΈ, ΠΏΠΎ ΡΡƒΡ‚ΠΈ, большС Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π΅Π½. БпособСн Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ индСксированный (Π΄ΠΎ 256 Ρ†Π²Π΅Ρ‚ΠΎΠ²), Ρ‚Π°ΠΊ ΠΈ RGB-Ρ†Π²Π΅Ρ‚ (16.700.000 ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠΎΠ²). Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ сТатия ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ RLE, Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚ся, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² (ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .rle) «Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚». БущСствуСт Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π’ΠœΠ  для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы OS/2.

1.2.2 ΠžΠ±Ρ‰Π°Ρ структура Ρ„Π°ΠΉΠ»Π° Π’ΠœΠ 

Π’Π°Π±Π»ΠΈΡ†Π°. BMP-Ρ„Π°ΠΉΠ» состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… частСй (см. Ρ€ΠΈΡ. 1.5).

НазваниС поля

Π Π°Π·ΠΌΠ΅Ρ€ (Π² Π±Π°ΠΉΡ‚Π°Ρ…)

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ»Π°

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ изобраТСния

ΠŸΠ°Π»ΠΈΡ‚Ρ€Π°

Зависит ΠΎΡ‚ ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²Π° Ρ†Π²Π΅Ρ‚ΠΎΠ².

Π‘Π°ΠΌΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π±Π°ΠΉΡ‚ΠΎΠ² ΠΎΠΏΡ€Π΅Π΄. Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ растра ΠΈ ΠΊΠΎΠ»ΠΈΡ‡. Π±ΠΈΡ‚ΠΎΠ² Π½Π° ΠΏΠΈΠΊΡΠ΅Π»ΡŒ.

Π’Π°Π±Π»ΠΈΡ†Π°. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π’ΠœΠ -Ρ„Π°ΠΉΠ»Π°

НазваниС поля

Π Π°Π·ΠΌΠ΅Ρ€ (Π² Π±Π°ΠΉΡ‚Π°Ρ…)

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

bfType

Код Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, соотвСтствуСт «Π’Πœ».

bfSize

Π Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° Π² Π±Π°ΠΉΡ‚Π°Ρ….

bfReserved1

Π—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ. Π Π°Π²Π½ΠΎ 0.

bfReserved2

Π—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ. Π Π°Π²Π½ΠΎ 0.

bfOffBits

АдрСс Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ массива Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

Π”Π°Π»Π΅Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ΄Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ — заголовокизобраТСния (BITMAPINFOHEADER, ΠΌΠΎΠΆΠ΅Ρ‚ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранится описаниС Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² растра ΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° пиксСлов (см. Ρ€ΠΈΡ. 1.7).

Π’Π°Π±Π»ΠΈΡ†Π°. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° изобраТСния

НазваниС поля

Π Π°Π·ΠΌΠ΅Ρ€ (Π² Π±Π°ΠΉΡ‚Π°Ρ…)

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

biSize

Π Π°Π·ΠΌΠ΅Ρ€ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, Ρ€Π°Π²Π΅Π½ 40 Π±Π°ΠΉΡ‚.

biWidth

Π¨ΠΈΡ€ΠΈΠ½Π° изобраТСния.

biHeight

Высота изобраТСния.

biplanes

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ 1.

biBitCount

БитнапиксСл. ΠœΠΎΠΆΠ΅Ρ‚Π±Ρ‹Ρ‚ΡŒ 1, 4, 8, 16, 24 ΠΈΠ»ΠΈ 32.

biCompression

ΠšΠΎΠΌΠΏΡ€Π΅ΡΡΠΈΡ:

0 — Π±Π΅Π· компрСссии;

1 — компрСссия RLE8 (8 Π±ΠΈΡ‚ Π½Π° ΠΏΠΈΠΊΡΠ΅Π»);

2 — компрСссия RLE4 (4 Π±ΠΈΡ‚Π° Π½Π° ΠΏΠΈΠΊΡΠ΅Π»);

3 — Π±Π΅Π· компрСссии для 16 ΠΈ 32 Π±ΠΈΡ‚Π° Π½Π° ΠΏΠΈΠΊΡΠ΅Π».

biSizeImage

Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСния Π² Π±Π°ΠΉΡ‚Π°Ρ….

biXPelsPerMeter

Π“ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠΈΠΊΡΠ΅Π»ΡΡ… Π½Π° ΠΌΠ΅Ρ‚Ρ€.

biYPelsPerMeter

Π’Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠΈΠΊΡΠ΅Π»ΡΡ… Π½Π° ΠΌΠ΅Ρ‚Ρ€.

biClrUsed

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… индСксов Π² ΠΏΠ°Π»ΠΈΡ‚Ρ€Π΅.

biCrlImportant

Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ количСство индСксов, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для отобраТСния изобраТСния.

Π”Π°Π»Π΅Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ помСщаСтся ΠΏΠ°Π»ΠΈΡ‚Ρ€Π° (ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ) Π² Π²ΠΈΠ΄Π΅ записСй RGBQUADΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΏΠΎΠ»Π΅ΠΉ, Π΄Π»ΠΈΠ½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π·Π½Π° 1 Π±Π°ΠΉΡ‚Ρƒ (см. Ρ€ΠΈΡ. 1.8).

Π’Π°Π±Π»ΠΈΡ†Π°. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° записи RGBQUAD

НазваниС поля

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

rgbBlue

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π‘ΠΈΠ½ΠΈΠΉ, ΠΎΡ‚ 0 Π΄ΠΎ 255

rgbGreen

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π—Π΅Π»Π΅Π½Ρ‹ΠΉ, ΠΎΡ‚ 0 Π΄ΠΎ 255

rgbRed

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠšΡ€Π°ΡΠ½Ρ‹ΠΉ, ΠΎΡ‚ 0 Π΄ΠΎ 255

rgbReserved

НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ Ρ€Π°Π²Π½ΠΎ 0.

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ записСй RGBQUAD равняСтся количСству ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ².

ПослС ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ (Ссли ΠΎΠ½Π° Π΅ΡΡ‚ΡŒ) Π² Ρ„Π°ΠΉΠ»Π΅ Π’ΠœΠ  записываСтся растр Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ массива.

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ записано построчно. КаТдая строка изобраТСния дополняСтся нулями Π΄ΠΎ Π΄Π»ΠΈΠ½Ρ‹, ΠΊΡ€Π°Ρ‚Π½ΠΎΠΉ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ΠΌ. Надо Π΅Ρ‰Π΅ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Ρ‚ ΠΊΠ°ΠΊ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎΠ΅"Π²Π²Π΅Ρ€Ρ… Π½ΠΎΠ³Π°ΠΌΠΈ", Ρ‚. Π΅. сначала записана ниТняя строка, ΠΏΠΎΡ‚ΠΎΠΌ прСдпослСдняя ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ Π΄ΠΎ ΡΠ°ΠΌΠΎΠ³ΠΎ Π²Π΅Ρ€Ρ…Π°.

2. ОписаниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° отобраТСния Ρ„Π°ΠΉΠ»Π°

2.1 ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° BMP

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ BMP Ρ„Π°ΠΉΠ»Π° осущСствляСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ LoadFromFile, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ BMP-Ρ„Π°ΠΉΠ» с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, считывая Π΅Π³ΠΎ с Π΄ΠΈΡΠΊΠ° Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ сначала читаСтся Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ растрового Ρ„Π°ΠΉΠ»Π°, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΠΈ с Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ указываСтся Π² ΠΏΠΎΠ»Π΅ infoHeadSize.

Помимо этого Π² ΠΏΠΎΠ»Π΅ imageSize указываСтся вычислСнный Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСния Π² Π±Π°ΠΉΡ‚Π°Ρ…. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для указания Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² динамичСски выдСляСмой памяти ΠΏΠΎΠ΄ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° plnfoHead ΠΈ ΠΏΠΎΠ΄ массив пиксСлов aBitmapBits. ПослС выдСлСния ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ памяти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΠ²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ растра Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.

На Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ 2.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ чтСния BMP Ρ„Π°ΠΉΠ»Π°.

2.3 ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ изобраТСния Алгоритм отобраТСния изобраТСния прСдставлСн Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ Рисунок 2.4 — Алгоритм ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Рисунок 2.3 — Алгоритм чтСния BMPΡ„Π°ΠΉΠ»Π°

2.2 Алгоритм сохранСния изобраТСния Π² GIF-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅

Алгоритм сохранСния изобраТСния Π² GIF-Ρ„Π°ΠΉΠ» прСдставлСн Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ (см. Ρ€ΠΈΡ. 2.2).

Рисунок 2.2 — Алгоритм сохранСния изобраТСния Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ GIF

3.ОписаниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ эффСктов

3.1 ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ базисами RGB ΠΈ CMY

CMY (Cyan, Magenta, Yellow — Π³ΠΎΠ»ΡƒΠ±ΠΎΠΉ, ΠΏΡƒΡ€ΠΏΡƒΡ€Π½Ρ‹ΠΉ, ΠΆΠ΅Π»Ρ‚Ρ‹ΠΉ) — Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎ-ориСнтированная модСль, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π² ΠΏΠΎΠ»ΠΈΠ³Ρ€Π°Ρ„ΠΈΠΈ для субтрактивного формирования ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠΎΠ², основанного Π½Π° Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠΈ слоСм краски части ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ свСтового ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π¦Π²Π΅Ρ‚Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ CMY ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊ Ρ†Π²Π΅Ρ‚Π°ΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΈ RGB, Ρ‚. Π΅. Π΄ΠΎΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΠΈ ΠΈΡ… Π΄ΠΎ Π±Π΅Π»ΠΎΠ³ΠΎ.

Рисунок 3.1 — Π¦Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΊΡƒΠ± ΠΌΠΎΠ΄Π΅Π»ΠΈ CMY

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, систСма ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ CMY — Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΡƒΠ±, Ρ‡Ρ‚ΠΎ ΠΈ Π΄Π»Ρ RGB, Π½ΠΎ Ρ Π½Π°Ρ‡Π°Π»ΠΎΠΌ отсчСта Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ с RGB ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ (1,1,1), ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π±Π΅Π»ΠΎΠΌΡƒ Ρ†Π²Π΅Ρ‚Ρƒ. Π¦Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΊΡƒΠ± ΠΌΠΎΠ΄Π΅Π»ΠΈ CMY ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ 2.4.

ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡRGB Π² CMY: C := 255 — R; M := 255 — G; Y := 255 — B;

ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡCMY Π² RGB: R := 255 — C; G := 255 — M; B := 255 — Y;

Рисунок3.3 — ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡCMYΠ²RGB

Рис.

3.2 ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ базисами RGB ΠΈ HSV

HSV (Hue, Saturation, Value — Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ Ρ‚ΠΎΠ½, Π½Π°ΡΡ‹Ρ‰Π΅Π½Π½ΠΎΡΡ‚ΡŒ, количСство свСта) — модСль, ориСнтированная Π½Π° Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ явного задания Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠ° Ρ†Π²Π΅Ρ‚Π° (рис. 3). ΠŸΠΎΠ΄ΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ, опрСдСляСмоС Π΄Π°Π½Π½ΠΎΠΉ модСлью — ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹ΠΉ ΡˆΠ΅ΡΡ‚ΠΈΠ³Ρ€Π°Π½Π½Ρ‹ΠΉ конус.

По Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ оси конуса задаСтся V — свСтлота, ΠΌΠ΅Π½ΡΡŽΡ‰Π°ΡΡΡ ΠΎΡ‚ 0 Π΄ΠΎ 1. Π—Π½Π°Ρ‡Π΅Π½ΠΈΡŽ V = 0 соотвСтствуСт Π²Π΅Ρ€ΡˆΠΈΠ½Π° конуса, Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ V = 1 — основаниС конуса; Ρ†Π²Π΅Ρ‚Π° ΠΏΡ€ΠΈ этом Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ интСнсивны.

Π¦Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ Ρ‚ΠΎΠ½ H Π·Π°Π΄Π°Π΅Ρ‚ся ΡƒΠ³Π»ΠΎΠΌ, отсчитываСмым Π²ΠΎΠΊΡ€ΡƒΠ³ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ оси. Π’ Ρ‡Π°ΡΡ‚ности, 0Β° — красный, 60Β° — ΠΆΠ΅Π»Ρ‚Ρ‹ΠΉ, 120Β° — Π·Π΅Π»Π΅Π½Ρ‹ΠΉ, 180Β° — Π³ΠΎΠ»ΡƒΠ±ΠΎΠΉ, 240Β° — синий, 300Β° — ΠΏΡƒΡ€ΠΏΡƒΡ€Π½Ρ‹ΠΉ, Ρ‚. Π΅. Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π° располоТСны Π΄Ρ€ΡƒΠ³ ΠΏΡ€ΠΎΡ‚ΠΈΠ² Π΄Ρ€ΡƒΠ³Π° (ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π½Π° 180Β°).

ΠΠ°ΡΡ‹Ρ‰Π΅Π½Π½ΠΎΡΡ‚ΡŒ S ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ насколько Π±Π»ΠΈΠ·ΠΎΠΊ Ρ†Π²Π΅Ρ‚ ΠΊ «Ρ‡ΠΈΡΡ‚ΠΎΠΌΡƒ» ΠΏΠΈΠ³ΠΌΠ΅Π½Ρ‚Ρƒ ΠΈ ΠΌΠ΅Π½ΡΠ΅Ρ‚ся ΠΎΡ‚ 0 Π½Π° Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ оси V Π΄ΠΎ 1 Π½Π° Π±ΠΎΠΊΠΎΠ²Ρ‹Ρ… гранях ΡˆΠ΅ΡΡ‚ΠΈΠ³Ρ€Π°Π½Π½ΠΎΠ³ΠΎ конуса.

Рисунок 3.4 — Π Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ HSV

Π’ΠΎΡ‡ΠΊΠ° V = 0, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится Π²Π΅Ρ€ΡˆΠΈΠ½Π° конуса, соотвСтствуСт Ρ‡Π΅Ρ€Π½ΠΎΠΌΡƒ Ρ†Π²Π΅Ρ‚Ρƒ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ S ΠΏΡ€ΠΈ этом ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 0−1. Π’ΠΎΡ‡ΠΊΠ° с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ V = 1, S = 0 — Ρ†Π΅Π½Ρ‚Ρ€ основания конуса соотвСтствуСт Π±Π΅Π»ΠΎΠΌΡƒ Ρ†Π²Π΅Ρ‚Ρƒ. ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ значСния ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ V ΠΏΡ€ΠΈ S=0, Ρ‚. Π΅. Π½Π° ΠΎΡΠΈ конуса, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ сСрым Ρ†Π²Π΅Ρ‚Π°ΠΌ. Если S = 0, Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠ° H ΡΡ‡ΠΈΡ‚аСтся Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ.

Рисунок 3.5 — ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡRGBΠ²HSV

Рисунок 3.6 — ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡHSV Π² RGB

3.3 Π—Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ M

Алгоритм Π·Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΈΡ изобраТСния ΠΏΠΎ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ MпрСдставлСн Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ 3.7.

Рисунок 3.7 — Алгоритм Π·Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΈΡ изобраТСния ΠΏΠΎ M

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡˆΡƒΠΌΠΈΡ‚ΡŒ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ M Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈΠ½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ссли Π² Ρ„Π°ΠΉΠ»Π΅ Π΅ΡΡ‚ΡŒ ΠΏΠ°Π»ΠΈΡ‚Ρ€Π°, Ρ‚ΠΎ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ†Π²Π΅Ρ‚Ρƒ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° MΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΡˆΡƒΠΌ.

Если Π² Ρ„Π°ΠΉΠ»Π΅ Π½Π΅Ρ‚ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ пиксСль Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° CMY, ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ MΠ·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΡˆΡƒΠΌ, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ пиксСль Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π’ ΡΠ»ΡƒΡ‡Π°Π΅ Ссли ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ MΠ²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ допустимого Π΅Π³ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‚ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ для значСния пиксСля Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

3.4 Π—Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ S

Алгоритм Π·Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΈΡ изобраТСния ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ S ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ 3.8.

Рисунок 3.8 — Алгоритм Π·Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΈΡ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ S.

Π”Π°Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ хранятся Π² Π±Π°Π·ΠΈΡΠ΅ RGB ΠΈ Π΄Π»Ρ Π·Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΈΡ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ S Π±Π°Π·ΠΈΡΠ° HSV Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пиксСля ΠΈΠ· Π±Π°Π·ΠΈΡΠ° RGB Π² Π±Π°Π·ΠΈΡ HSV, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ выполняСт ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° RGBtoHSV. Π”Π°Π»Π΅Π΅ трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π°ΡˆΡƒΠΌΠ»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ S, ΠΏΡ€ΠΈΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Π½Π΅ΠΉ ΡˆΡƒΠΌΠ°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ базиса Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ, выполняСмоС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ HSVtoRGB.

3.5 Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ изобраТСния

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ изобраТСния использовался Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ задаСтся ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ 3×3. ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Π½Π° Ρ€ΠΈΡ. 3.4.

Рисунок 3.9 — ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° 6

Рисунок 3.10 — Алгоритм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ изобраТСния.

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ покрываСтся этой ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ, Π² Ρ†ΠΈΠΊΠ»Π΅ попиксСльно. ΠŸΡ€ΠΈ этом ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ умноТаСтся с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ пиксСля. ΠŸΡ€ΠΈ Ρ‡Π΅ΠΌ, Ссли ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ 0…255, Ρ‚ΠΎ ΠΎΠ½Π° приравниваСтся ΠΊ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠ΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ этого ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°.

Алгоритм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° прСдставлСн Π½Π° Ρ€ΠΈΡ. 3.5

3.6 Π­Ρ„Ρ„Π΅ΠΊΡ‚ налоТСния ΠΊΡ€ΡƒΠ³ΠΎΠ²

Π­Ρ„Ρ„Π΅ΠΊΡ‚ налоТСния ΠΊΡ€ΡƒΠ³ΠΎΠ² выполняСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ созданной Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½ΡƒΠ»Π΅ΠΉ ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†, Π³Π΄Π΅ нулями ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ ΠΊΡ€ΡƒΠ³. Π Π°Π·Π»ΠΎΠΆΠΈΠ² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π±Π°Π·ΠΈΡ RGB, каТдая ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° умноТаСтся Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

Рисунок 3.11 — Π­Ρ„Ρ„Π΅ΠΊΡ‚ налоТСния ΠΊΡ€ΡƒΠ³ΠΎΠ²

4. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° прилоТСния

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° систСмы прСдставлСна Π² Π²ΠΈΠ΄Π΅ схСмы (см. Ρ€ΠΈΡ. 4.1).

Рисунок 4.1 — Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° прилоТСния

5.Π’Ρ‹Π±ΠΎΡ€ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… срСдств для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, обоснованиС Π²Ρ‹Π±ΠΎΡ€Π°

Π’ ΡΠ²ΡΠ·ΠΈ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ сСгодня ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ слоТности ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния ΠΎΡ‡Π΅Π½ΡŒ высок, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Windows с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ языка программирования Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ затрудняСтся. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ массу Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ стандартных Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡŽ ΠΌΠ½ΠΎΠ³ΠΎΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ интСрфСйса. РСализация Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ связывания ΠΈ Π²ΡΡ‚раивания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Π° Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ слоТной Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Одним ΠΈΠ· ΡΠ°ΠΌΡ‹Ρ… популярных инструмСнтов для создания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… Windows-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ являСтся язык программирования C++ ΠΈ Π²Ρ…одящая Π² ΡΠΎΡΡ‚Π°Π² MicrosoftVisualStudio 2008, WindowsForms. Она Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² ΡΠ΅Π±Ρ практичСски вСсь ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс Windows ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ срСдствами Π±ΠΎΠ»Π΅Π΅ высокого уровня, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π—Π° ΡΡ‡Π΅Ρ‚ этого Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ упрощаСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… слоТный интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, облСгчаСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ OLE ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Данная курсовая Ρ€Π°Π±ΠΎΡ‚Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ языкСБ++. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ созданныС Π² Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ C++Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ просты Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π³Π»ΡƒΠ±ΠΎΠΊΠΈΡ… Π·Π½Π°Π½ΠΈΠΉ Π² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ.

6.ОписаниС основных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Класс FormatΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»ΠΎΠΌ BMP. РСализация класса ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ 6.1.

Рисунок 6.1 — Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ класса Format

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… для класса ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ конструктори дСструктор, класс Format содСрТит ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, пСрСчислСнныС Π½ΠΈΠΆΠ΅:

1) ΠœΠ΅Ρ‚ΠΎΠ΄ CreateDib24 создаСт Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ 24-разрядный растр с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ ΠΈ Π²Ρ‹ΡΠΎΡ‚ΠΎΠΉ. Π’ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ создания осущСствляСтся инициализация ΠΏΠΎΠ»Π΅ΠΉ заголовкарастрового Ρ„Π°ΠΉΠ»Π° ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. ПослС этого Π²Ρ‹Π΄Π΅Π»ΡΠ΅Ρ‚ΡΡΠΏΠ°ΠΌΡΡ‚ΡŒ для хранСния массива пиксСлов. Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ открываСтся дисковый файлс Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для сохранСния Π² Π½Π΅ΠΌ создаваСмого растра.

2) ΠœΠ΅Ρ‚ΠΎΠ΄ SetPixel осущСствляСт прямой доступ ΠΊ ΠΏΠΈΠΊΡΠ΅Π»Π°ΠΌ Π² 24-разрядном растрС. ЦвСтовая информация для синСй, Π·Π΅Π»Π΅Π½ΠΎΠΉ ΠΈ ΠΊΡ€Π°ΡΠ½ΠΎΠΉ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… цвСтапиксСла записываСтся Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты массива aBitmapBits. АдрСсаэлСмСнтов Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· Π½ΠΎΠΌΠ΅Ρ€ строки Ρ€Π°Π·Π²Π΅Ρ€Ρ‚ΠΊΠΈ Ρƒ ΠΈ Π½ΠΎΠΌΠ΅Ρ€ пиксСла Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ Ρ….

3) ΠœΠ΅Ρ‚ΠΎΠ΄ StoreDib24 сохраняСт созданный растр, записывая Π΅Π³ΠΎ Π½Π° Π΄ΠΈΡΠΊ Π²Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ GIF.

4) ΠœΠ΅Ρ‚ΠΎΠ΄ LoadFromFile Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ BMP-Ρ„Π°ΠΉΠ» с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, считывая Сгос диска Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ сначала читаСтся заголовокрастрового Ρ„Π°ΠΉΠ»Π°, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΠΈ с Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ указываСтся Π² ΠΏΠΎΠ»Π΅ infoHeadSize. Помимо этого Π² ΠΏΠΎΠ»Π΅ imageSize указываСтся вычислСнный Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСнияв Π±Π°ΠΉΡ‚Π°Ρ…. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для указания Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² динамичСски выдСляСмой памяти ΠΏΠΎΠ΄ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° plnfoHeadΠΈ ΠΏΠΎΠ΄ массив пиксСлов aBitmapBits. ПослС выдСлСния ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ памяти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ растра Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.

5) ΠœΠ΅Ρ‚ΠΎΠ΄ Draw Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ растр Π½Π°ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ графичСского устройства, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ StretchDIBits.

6) ΠœΠ΅Ρ‚ΠΎΠ΄ RgbToHlsΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π°Π½Ρ‹Ρ‹Π΅ изобраТСния ΠΈΠ· RGBΠ² HLS.

7) ΠœΠ΅Ρ‚ΠΎΠ΄ HlsToRgbΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ изобраТСния ΠΈΠ· HLSΠ² RGB.

8) ΠœΠ΅Ρ‚ΠΎΠ΄ NoiseMΠ·Π°ΡˆΡƒΠΌΠ»ΡΠ΅Ρ‚ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ M

9) ΠœΠ΅Ρ‚ΠΎΠ΄ NoiseSΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ изобраТСния ΠΈΠ· RGBΠ² HLS, Π·Π°ΡˆΡƒΠΌΠ»ΡΠ΅Ρ‚ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ SΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· HLSΠ² RGB.

10) ΠœΠ΅Ρ‚ΠΎΠ΄ FilterпримСняСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ «Ρ€Π°Π·ΠΌΡ‹Ρ‚ΠΈΠ΅» ΠΊ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.

Π’Π°Π±Π»ΠΈΡ†Π° 6.1 ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса KDib.

ΠœΠ΅Ρ‚ΠΎΠ΄

Π’ΠΈΠΏ

НазначСниС

CreateDib24

BOOL

Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ GIF — Ρ„Π°ΠΉΠ»

StoreDib24

VOID

ΠŸΠ΅Ρ€Π΅ΡΡ‹Π»ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… изобраТСния

LoadFromFile

BOOL

Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ BMP — Ρ„Π°ΠΉΠ»

SetPixel

VOID

УстанавливаСт пиксСль Π² ΠΊΠΎΠ½Ρ‚СкстС

Draw

INT

Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ изобраТСния

GetWidth

INT

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΈΠ½Ρƒ

GetHeight

INT

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ высоту

GetError

CHAR*

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ

RGBtoHSV

VOID

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· RGB Π² HSV

HSVToRGB

VOID

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· HSV Π² RGB

LoadFromFile

BOOL

Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ BMP — Ρ„Π°ΠΉΠ»

GetA

BYTE*

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив пиксСлов

Draw

INT

Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ изобраТСния

GetWidth

INT

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΈΠ½Ρƒ

GetHeight

INT

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ высоту

NoiseB

VOID

Π—Π°ΡˆΡƒΠΌΠ»ΡΠ΅Ρ‚B

NoiseS

VOID

ЗащумляСт S

Filter

VOID

Π€ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚

7.ВСстированиС, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° написана ΠΏΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму ΠΎΡ‚ WindowsXP Π΄ΠΎ WindowsVISTA. Для установки систСмы Π½Π΅Ρ‚ нСобходимости Π² ΠΎΡΠΎΠ±Ρ‹Ρ… настройках.

ВрСбованияк Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ — процСссор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏΠ° Pentium ΠΈΠ»ΠΈ Celeron с Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΎΠΉ частотой Π½Π΅ Π½ΠΈΠΆΠ΅ 166 ΠœΠ“Ρ† (рСкомСндуСтся Pentium III800 ΠœΠ“Ρ†), ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти — 512 ΠœΠ±Π°ΠΉΡ‚ (рСкомСндуСтся 1024 ΠœΠ±Π°ΠΉΡ‚), достаточноС количСство свободного дискового пространства всСго 50MΠ±.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±Ρ‹Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ интСрфСйс, ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΈ ΠΏΡ€ΠΎΡΡ‚ΠΎΠΉ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅, сохранСниС Ρ„Π°ΠΉΠ»ΠΎΠ² графичСских Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² GIF ΠΈ BMP, ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π°Ρ спСцэффСкты.

Π’Ρ‹Π²ΠΎΠ΄Ρ‹

Π’ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ€Π΅ΡˆΠ΅Π½Ρ‹ поставлСнныС Π² Ρ‚СхничСском Π·Π°Π΄Π°Π½ΠΈΠΈΠ·Π°Π΄Π°Ρ‡ΠΈ, ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ возмоТности для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π³Ρ€Π°Ρ„ичСскими Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ GIFΠΈ Π’ΠœΠ .

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ являСтся Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ возмоТностями, Π² Ρ‡Π°ΡΡ‚ности, Ρ€Π°Π±ΠΎΡ‚Π° с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ графичСскими Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ графичСскиС эффСкты: Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ базисам, эффСкты ΡˆΡƒΠΌΠ° для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ….

К Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΠΊΠ°ΠΌ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ отнСсти ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π΅Π³ΠΎ примСнСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΡƒΡ‡Π΅Π±Π½Ρ‹Ρ… ΠΈ ΠΌΠ΅Ρ‚одичСских цСлях.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

Листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Format.h

class Format {

public:

BYTE* aBitmapBits;// массив пиксСлов

BYTE* aBitmapBits1;

BYTE* aBitmapCMY;

BYTE* aBitmapHSV;

BYTE R;

BYTE G;

BYTE B;

Format ();

~Format ();

BOOL CreateDib24(int w, int h, constchar* fileName);

void StoreDib24();

BOOL LoadFromFile (constchar* fileName);

void SetPixel (int x, int y, COLORREF color);

int Draw (HDC hdc, int xDst, int yDst, int wDst, int hDst,

int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop);

int GetWidth () { return width; }

int GetHeight () { return height; }

constchar* GetError () { return error. c_str ();}

void RGBtoCMY ();

void RGBtoHSV ();

void CMYtoRGB ();

void HSVtoRGB ();

void BazisΠ‘ ();

void BazisM ();

void BazisY ();

void BazisH ();

void BazisS ();

void BazisV ();

void NoiseM ();

void NoiseS ();

void Filter ();

void Save ();

void Circ ();

void Transformtocirc (int x, int y);

int Draw1(HDC hdc, int xDst, int yDst, int wDst, int hDst,

int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop);

void TransformPix (int x, int y);

private:

int width;

int height;

int bytesPerLine;

BITMAPFILEHEADER fileHead; // заголовокрастровогофайла

BITMAPINFOHEADER infoHead; // Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎΠ±Π»ΠΎΠΊΠ°

BITMAPINFOHEADER* pInfoHead;

int fileHeadSize;

int infoHeadSize;

int imageSize;

string error;

ofstream outFile;

};

Format.cpp

#include" Format. h"

#include

Format:Format ()

{

fileHeadSize = sizeof (BITMAPFILEHEADER);

fileHead.bfType = 0x4d42;

aBitmapBits = NULL;

}

Format:~Format () {

if (pInfoHead) delete [] pInfoHead;

if (aBitmapBits) delete [] aBitmapBits;

if (outFile) outFile. close ();

}

BOOL Format: CreateDib24(int w, int h, constchar* fileName) ios: binary

BOOL Format: LoadFromFile (constchar* fileName) {

ifstream inpFile;

inpFile.open (fileName, ios: in | ios: binary);

if (!inpFile) {

error = «ΠΠ΅Π²Π΅Ρ€Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.» ;

return FALSE;

}

inpFile.read ((char*)&fileHead, fileHeadSize);

if (fileHead.bfType ≠ 0x4d42) {

error = «Π­Ρ‚ΠΎΠ½Π΅ BMP-Ρ„Π°ΠΉΠ»» ;

return FALSE;

}

infoHeadSize = fileHead. bfOffBits — fileHeadSize;

int fileSize = fileHead. bfSize;

imageSize = fileSize — (fileHeadSize + infoHeadSize);

pInfoHead = (BITMAPINFOHEADER*)(new BYTE [infoHeadSize]);

inpFile.read ((char*)pInfoHead, infoHeadSize);

width = pInfoHead->biWidth;

height = pInfoHead->biHeight;

aBitmapBits = new BYTE[imageSize];

inpFile.read ((char*)aBitmapBits, imageSize);

returntrue;

}

int Format: Draw (HDC hdc, int xDst, int yDst, int wDst, int hDst,

int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop) {

return StretchDIBits (hdc, xDst, yDst, wDst, hDst, xSrc, ySrc, wSrc, hSrc,

aBitmapBits, (CONST BITMAPINFO*)pInfoHead, DIB_RGB_COLORS, rop);

}

void Format: SetPixel (int x, int y, COLORREF color) {

int row = y;

int col = 3 * x;

aBitmapBits[row*bytesPerLine + col] = GetBValue (color);

aBitmapBits[row*bytesPerLine + col+1] = GetGValue (color);

aBitmapBits[row*bytesPerLine + col+2] = GetRValue (color);

aBitmapBits;

}

void Format: StoreDib24() {

// Π—Π°ΠΏΠΈΡΡŒΠ·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° BMP-Ρ„Π°ΠΉΠ»Π°

outFile.write ((char*)&fileHead, fileHeadSize);

outFile.write ((char*)&infoHead, infoHeadSize);

// Π—Π°ΠΏΠΈΡΡŒΠΌΠ°ΡΡΠΈΠ²Π°ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ

outFile.write ((char*)aBitmapBits, imageSize);

}

void Format: CMYtoRGB ()

{

HDC hdc;

BYTE R, G, B, C, M, Y;

int x = GetWidth ();

int y = GetHeight ();

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

int row = y;

int col = 3 * x;

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++){

C = aBitmapCMY[row*bytesPerLine + col*3 + 2];

M = aBitmapCMY[row*bytesPerLine + (col*3)+ 1];

Y = aBitmapCMY[row*bytesPerLine + (col*3)];

R = 255-C;

G = 255-M;

B = 255-Y;

aBitmapBits[row*bytesPerLine + (col*3)] = B;

aBitmapBits[row*bytesPerLine + (col*3)+ 1] = G;

aBitmapBits[row*bytesPerLine + col*3 + 2] = R;

}

aBitmapBits;

}

void Format: RGBtoCMY ()

{

BYTE R, G, B, C, M, Y;

int x = GetWidth ();

int y = GetHeight ();

int row = y;

int col = 3 * x;

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

imageSize = x * y * 3;

aBitmapCMY = new BYTE[imageSize];

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++){

R = aBitmapBits[row*bytesPerLine + col*3 + 2];

G = aBitmapBits[row*bytesPerLine + (col*3)+ 1];

B = aBitmapBits[row*bytesPerLine + (col*3)];

C = 255-R;

M = 255-G;

Y = 255-B;

aBitmapCMY[row*bytesPerLine + (col*3)] = Y;

aBitmapCMY[row*bytesPerLine + (col*3)+ 1] = M;

aBitmapCMY[row*bytesPerLine + col*3 + 2] = C;

}

aBitmapBits=aBitmapCMY;

}

void Format: RGBtoHSV (){

BYTE R, G, B, H, S, V;

double rgbmin, rgbmax;

double rc, bc, gc;

double ht=0.0,st=0.0;

int x = GetWidth ();

int y = GetHeight ();

int row = y;

int col = 3 * x;

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

imageSize = x * y * 3;

aBitmapHSV = new BYTE[imageSize];

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++)

{

R = aBitmapBits[row*bytesPerLine + col*3 + 2];

G = aBitmapBits[row*bytesPerLine + (col*3)+ 1];

B = aBitmapBits[row*bytesPerLine + (col*3)];

rgbmin = min (R, min (G, B));

rgbmax = max (R, max (G, B));

if (rgbmax > 0.0)

st = (rgbmax — rgbmin) / rgbmax;

if (st > 0.0) {

rc = (rgbmax — R) / (rgbmax — rgbmin);

gc = (rgbmax — G) / (rgbmax — rgbmin);

bc = (rgbmax — B) / (rgbmax — rgbmin);

if (R == rgbmax) ht = bc — gc;

elseif (G == rgbmax) ht = 2 + rc — bc;

elseif (B == rgbmax) ht = 4 + gc — rc;

ht = ht * 60.0;

if (ht < 0.0) ht += 360.0;

}

H = ht / 360.0;

V = rgbmax;

S = st;

aBitmapHSV[row*bytesPerLine + (col*3)] = V;

aBitmapHSV[row*bytesPerLine + (col*3)+ 1] = S;

aBitmapHSV[row*bytesPerLine + col*3 + 2] = H;

}

}

void Format: HSVtoRGB ()

{

BYTE R, G, B, H, S, V, i_H;

int ii;

double fr;

unsignedchar c1, c2, c3;

int x = GetWidth ();

int y = GetHeight ();

int row = y;

int col = 3 * x;

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++){

i_H = aBitmapHSV[row*bytesPerLine + col*3 + 2];

S = aBitmapHSV[row*bytesPerLine + (col*3)+ 1];

V = aBitmapHSV[row*bytesPerLine + (col*3)];

if (!S)

R = G = B = V;

else

{

while (i_H >= 360)

i_H -= 360;

H = i_H;

ii = (int)(H /= 60.0);

fr = H — ii;

c1 = (V * (255 — S)) / 255;

c2 = (V * (255 — S * fr)) / 255;

c3 = (V * (255 — S * (1.0 — fr))) / 255;

switch (ii)

{

case 0: R = V; G = c3; B = c1; break;

case 1: R = c2; G = V; B = c1; break;

case 2: R = c1; G = V; B = c3; break;

case 3: R = c1; G = c2; B = V; break;

case 4: R = c3; G = c1; B = V; break;

case 5: R = V; G = c1; B = c2; break;

} // switch

} // if (!sat)

aBitmapBits[row*bytesPerLine + (col*3)] = B;

aBitmapBits[row*bytesPerLine + (col*3)+ 1] = G;

aBitmapBits[row*bytesPerLine + col*3 + 2] = R;

}

}

void Format: NoiseM (){

BYTE M;

int x = GetWidth ();

int y = GetHeight ();

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++){

M = aBitmapCMY[row*bytesPerLine + (col*3)+1];

M+=rand ();

if (M < 0) M = 0;

if (M > 255) M = 255;

aBitmapCMY[row*bytesPerLine + (col*3)+1] = M;

}

aBitmapBits = aBitmapCMY;

}

void Format: NoiseS (){

BYTE S;

int x = GetWidth ();

int y = GetHeight ();

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++){

S = aBitmapHSV[row*bytesPerLine + (col*3)+1];

S+=rand ();

if (S < 0) S = 0;

if (S > 255) S = 255;

aBitmapHSV[row*bytesPerLine + (col*3)+1] = S;

}

aBitmapBits = aBitmapHSV;

}

void Format: TransformPix (int x, int y){

BYTE NewBGR[3];

int Pixel[3];

BYTE Pix[3];

int w = GetWidth ();

int h = GetHeight ();

int count = 9;

int Matrix[9]={1,2,1,

2,4,2,

1,2,1};

int bytesPerLine = ((w * 24 + 31) / 32) * 4;

// x y

for (int c = 0; c < 3; c++){

NewBGR[c] = aBitmapBits[y*bytesPerLine + x*3 + c];

Pixel[c] = NewBGR[c] * Matrix[4];

}

// x-1 y-1

for (int c = 0; c < 3; c++){

NewBGR[c] = aBitmapBits[(y-1)*bytesPerLine + (x-1)*3 + c];

Pixel[c] += NewBGR[c] * Matrix[0];

}

// x y-1

for (int c = 0; c < 3; c++){

NewBGR[c] = aBitmapBits[y*bytesPerLine + (x-1)*3 + c];

Pixel[c] += NewBGR[c] * Matrix[1];

}

// x+1 y-1

for (int c = 0; c < 3; c++){

NewBGR[c] = aBitmapBits[(y+1)*bytesPerLine + (x-1)*3 + c];

Pixel[c] += NewBGR[c] * Matrix[2];

}

// x+1 y

for (int c = 0; c < 3; c++){

NewBGR[c] = aBitmapBits[(y+1)*bytesPerLine + x*3 + c];

Pixel[c] += NewBGR[c] * Matrix[5];

}

// x+1 y+1

for (int c = 0; c < 3; c++){

NewBGR[c] = aBitmapBits[(y+1)*bytesPerLine + (x+1)*3 + c];

Pixel[c] += NewBGR[c] * Matrix[8];

}

// x y+1

for (int c = 0; c < 3; c++){

NewBGR[c] = aBitmapBits[y*bytesPerLine + (x+1)*3 + c];

Pixel[c] += NewBGR[c] * Matrix[7];

}

// x-1 y+1

for (int c = 0; c < 3; c++){

NewBGR[c] = aBitmapBits[(y-1)*bytesPerLine + (x+1)*3 + c];

Pixel[c] += NewBGR[c] * Matrix[6];

}

// x-1 y

for (int c = 0; c < 3; c++){

NewBGR[c] = aBitmapBits[(y-1)*bytesPerLine + x*3 + c];

Pixel[c] += NewBGR[c] * Matrix[3];

}

for (int c = 0; c < 3; c++){

if (count≠0)

Pixel[c] = Pixel[c]/count;

Pix[c] = BYTE (Pixel[c]);

if (Pix[c] < 0)

Pix[c] = 0;

elseif (Pix[c] > 255)

Pix[c]=255;

aBitmapHSV[y*bytesPerLine + x*3 + c] = Pix[c];

}

}

void Format: Filter (){

int w = GetWidth ();

int h = GetHeight ();

imageSize = w * h * 4;

aBitmapHSV = new BYTE[imageSize];

for (int y = 1; y < h-1;y++)

for (int x = 1;x < w-1;x++){

TransformPix (x, y);

}

aBitmapBits = aBitmapHSV;

}

void Format: BazisΠ‘ ()

{

BYTE R, G, B, C, M, Y;

int x = GetWidth ();

int y = GetHeight ();

int row = y;

int col = 3 * x;

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

imageSize = x * y * 3;

aBitmapCMY = new BYTE[imageSize];

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++){

R = aBitmapBits[row*bytesPerLine + col*3 + 2];

G = aBitmapBits[row*bytesPerLine + (col*3)+ 1];

B = aBitmapBits[row*bytesPerLine + (col*3)];

C = 255-R;

M = G-G;

Y = B-B;

aBitmapCMY[row*bytesPerLine + (col*3)] = Y;

aBitmapCMY[row*bytesPerLine + (col*3)+ 1] = M;

aBitmapCMY[row*bytesPerLine + col*3 + 2] = C;

}

aBitmapBits=aBitmapCMY;

}

void Format: BazisM ()

{

BYTE R, G, B, C, M, Y;

int x = GetWidth ();

int y = GetHeight ();

int row = y;

int col = 3 * x;

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

imageSize = x * y * 3;

aBitmapCMY = new BYTE[imageSize];

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++){

R = aBitmapBits[row*bytesPerLine + col*3 + 2];

G = aBitmapBits[row*bytesPerLine + (col*3)+ 1];

B = aBitmapBits[row*bytesPerLine + (col*3)];

C = R-R;

M = 255-G;

Y = B-B;

aBitmapCMY[row*bytesPerLine + (col*3)] = Y;

aBitmapCMY[row*bytesPerLine + (col*3)+ 1] = M;

aBitmapCMY[row*bytesPerLine + col*3 + 2] = C;

}

aBitmapBits=aBitmapCMY;

}

void Format: BazisY ()

{

BYTE R, G, B, C, M, Y;

int x = GetWidth ();

int y = GetHeight ();

int row = y;

int col = 3 * x;

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

imageSize = x * y * 3;

aBitmapCMY = new BYTE[imageSize];

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++){

R = aBitmapBits[row*bytesPerLine + col*3 + 2];

G = aBitmapBits[row*bytesPerLine + (col*3)+ 1];

B = aBitmapBits[row*bytesPerLine + (col*3)];

C = R-R;

M = G-G;

Y = 255-B;

aBitmapCMY[row*bytesPerLine + (col*3)] = Y;

aBitmapCMY[row*bytesPerLine + (col*3)+ 1] = M;

aBitmapCMY[row*bytesPerLine + col*3 + 2] = C;

}

aBitmapBits=aBitmapCMY;

}

void Format: BazisH (){

BYTE R, G, B, H, S, V;

double rgbmin, rgbmax;

double rc, bc, gc;

double ht=0.0,st=0.0;

int x = GetWidth ();

int y = GetHeight ();

int row = y;

int col = 3 * x;

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

imageSize = x * y * 3;

aBitmapHSV = new BYTE[imageSize];

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++)

{

R = aBitmapBits[row*bytesPerLine + col*3 + 2];

G = aBitmapBits[row*bytesPerLine + (col*3)+ 1];

B = aBitmapBits[row*bytesPerLine + (col*3)];

rgbmin = min (R, min (G, B));

rgbmax = max (R, max (G, B));

if (rgbmax > 0.0)

st = (rgbmax — rgbmin) / rgbmax;

if (st > 0.0) {

rc = (rgbmax — R) / (rgbmax — rgbmin);

gc = (rgbmax — G) / (rgbmax — rgbmin);

bc = (rgbmax — B) / (rgbmax — rgbmin);

if (R == rgbmax) ht = bc — gc;

elseif (G == rgbmax) ht = 2 + rc — bc;

elseif (B == rgbmax) ht = 4 + gc — rc;

ht = ht * 60.0;

if (ht < 0.0) ht += 360.0;

}

H = ht / 360.0;

V = rgbmin;

S = 0;

aBitmapHSV[row*bytesPerLine + (col*3)] = V;

aBitmapHSV[row*bytesPerLine + (col*3)+ 1] = S;

aBitmapHSV[row*bytesPerLine + col*3 + 2] = H;

}

aBitmapBits=aBitmapHSV;

}

void Format: BazisS (){

BYTE R, G, B, H, S, V;

double rgbmin, rgbmax;

double rc, bc, gc;

double ht=0.0,st=0.0;

int x = GetWidth ();

int y = GetHeight ();

int row = y;

int col = 3 * x;

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

imageSize = x * y * 3;

aBitmapHSV = new BYTE[imageSize];

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++)

{

R = aBitmapBits[row*bytesPerLine + col*3 + 2];

G = aBitmapBits[row*bytesPerLine + (col*3)+ 1];

B = aBitmapBits[row*bytesPerLine + (col*3)];

rgbmin = min (R, min (G, B));

rgbmax = max (R, max (G, B));

if (rgbmax > 0.0)

st = (rgbmax — rgbmin) / rgbmax;

if (st > 0.0) {

rc = (rgbmax — R) / (rgbmax — rgbmin);

gc = (rgbmax — G) / (rgbmax — rgbmin);

bc = (rgbmax — B) / (rgbmax — rgbmin);

if (R == rgbmax) ht = bc — gc;

elseif (G == rgbmax) ht = 2 + rc — bc;

elseif (B == rgbmax) ht = 4 + gc — rc;

ht = ht * 60.0;

if (ht < 0.0) ht += 360.0;

}

H = 0.0;

V = 0 ;

S = st;

aBitmapHSV[row*bytesPerLine + (col*3)] = V;

aBitmapHSV[row*bytesPerLine + (col*3)+ 1] = S;

aBitmapHSV[row*bytesPerLine + col*3 + 2] = H;

}

aBitmapBits=aBitmapHSV;

}

void Format: BazisV (){

BYTE R, G, B, H, S, V;

double rgbmin, rgbmax;

double rc, bc, gc;

double ht=0.0,st=0.0;

int x = GetWidth ();

int y = GetHeight ();

int row = y;

int col = 3 * x;

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

imageSize = x * y * 3;

aBitmapHSV = new BYTE[imageSize];

for (int row = 0;row < y;row++)

for (int col = 0;col < x;col++)

{

R = aBitmapBits[row*bytesPerLine + col*3 + 2];

G = aBitmapBits[row*bytesPerLine + (col*3)+ 1];

B = aBitmapBits[row*bytesPerLine + (col*3)];

rgbmin = min (R, min (G, B));

rgbmax = max (R, max (G, B));

if (rgbmax > 0.0)

st = (rgbmax — rgbmin) / rgbmax;

if (st > 0.0) {

rc = (rgbmax — R) / (rgbmax — rgbmin);

gc = (rgbmax — G) / (rgbmax — rgbmin);

bc = (rgbmax — B) / (rgbmax — rgbmin);

if (R == rgbmax) ht = bc — gc;

elseif (G == rgbmax) ht = 2 + rc — bc;

elseif (B == rgbmax) ht = 4 + gc — rc;

ht = ht * 60.0;

if (ht < 0.0) ht += 360.0;

}

H = 0.0;

V = rgbmax ;

S = 0;

aBitmapHSV[row*bytesPerLine + (col*3)] = V;

aBitmapHSV[row*bytesPerLine + (col*3)+ 1] = S;

aBitmapHSV[row*bytesPerLine + col*3 + 2] = H;

}

aBitmapBits=aBitmapHSV;

}

void Format: Save ()

{

int x = GetWidth ();

int y = GetHeight ();

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

imageSize = x * y * 3;

aBitmapBits1 = new BYTE[imageSize];

aBitmapBits1=aBitmapBits;

}

int Format: Draw1(HDC hdc, int xDst, int yDst, int wDst, int hDst,

int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop)

{

int x = GetWidth ();

int y = GetHeight ();

int bytesPerLine = ((x * 24 + 31) / 32) * 4;

imageSize = x * y * 3;

aBitmapBits = new BYTE[imageSize];

aBitmapBits=aBitmapBits1;

return StretchDIBits (hdc, xDst, yDst, wDst, hDst, xSrc, ySrc, wSrc, hSrc,

aBitmapBits1, (CONST BITMAPINFO*)pInfoHead, DIB_RGB_COLORS, rop);

}

void Format: Circ ()

{

int Matrix[11][11]={1,1,1,1,0,0,0,1,1,1,1,

1,1,1,0,0,1,0,0,1,1,1,

1,1,0,0,1,1,1,0,0,1,1,

1,0,0,1,1,1,1,1,0,0,1,

0,0,1,1,1,1,1,1,1,0,0,

0,1,1,1,1,1,1,1,1,1,0,

0,0,1,1,1,1,1,1,1,0,0,

1,0,0,1,1,1,1,1,0,0,1,

1,1,0,0,1,1,1,0,0,1,1,

1,1,1,0,0,1,0,0,1,1,1,

1,1,1,1,0,0,0,1,1,1,1};

BYTE R, G, B;

int I=0,J=0;

int w = GetWidth ();

int h = GetHeight ();

int row = h;

int col = 3 * w;

int bytesPerLine = ((w * 24 + 31) / 32) * 4;

for (int i = 0;i < h; i++)

{

for (int j = 0;j < w; j++)

{

R = aBitmapBits[j*bytesPerLine + i*3 + 2];

G = aBitmapBits[j*bytesPerLine + (i*3)+ 1];

B = aBitmapBits[j*bytesPerLine + (i*3)];

R *=Matrix [I][J];

G *=Matrix [I][J];

B *=Matrix [I][J];

aBitmapBits[j*bytesPerLine + (i*3)] = B;

aBitmapBits[j*bytesPerLine + (i*3)+ 1] = G;

aBitmapBits[j*bytesPerLine + i*3 + 2] = R;

J++;

if (J==11)

{

J=0;

//j+=1;

}

}

I++;

J=0;

if (I==11)

{

I=0;

//i+=1;

}

}

aBitmapBits;

}

Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΎ Π½Π°

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ