Introducere

Unul dintre cele mai comune formate de astăzi pentru manipularea culorilor în aplicațiile pentru computer este formatul de culoare pe 32 de biți. În acest format, 4 octeți sunt utilizați pentru a indica intensitatea relativă a fiecărei componente de culoare (R pentru roșu, G pentru verde și B pentru albastru) și canalul alfa (care indică nivelul de transparență, unde 0 este complet transparent și 255, complet opac). În cel mai utilizat standard, roșu corespunde octetului cu cea mai mare greutate, apoi verde, albastru și, în cele din urmă, în cel cu cea mai mică greutate, canalul alfa.

În acest proiect, va fi creată o aplicație care va permite, prin intermediul a patru bare glisante, să selecteze valoarea fiecăreia dintre componentele unei culori cu acest format și va permite, de asemenea, să vadă culoarea configurată ca și cum ar fi totală opac și pe o rețea albă. și negru pentru a-i aprecia transparența. De asemenea, se propune, ca mărire, să poți face o fotografie cu camera și să se suprapună culoarea configurată pe ea.

La realizarea acestui proiect, veți învăța concepte despre dispunerea elementelor de pe ecran, barele de selecție sau glisorul interfeței grafice, utilizarea culorilor în aplicații și, desigur, programarea conceptelor legate de procedurile sau funcțiile și structuri iterative o bucle.

Se propune construirea acestei aplicații în mod incremental, urmând pașii descriși mai jos.

Pasul 1: aspectul interfeței grafice

color

După cum se poate vedea în imagine, aplicația finală constă din mai multe elemente grafice a căror dispunere pe ecran trebuie să fie îngrijită astfel încât aspectul să fie plăcut utilizatorului. Când vizualizați imaginea, se disting clar patru zone aliniate vertical:

  • O mică bandă superioară în care apare titlul.
  • O mare parte centrală în care patru elemente similare sunt dispuse vertical și fiecare dintre ele constă din alte trei dispuse orizontal: bara, un text și o casetă colorată.
  • O altă bandă mică în care valoarea culorii apare în hexazecimal.
  • O secțiune inferioară de dimensiuni medii care arată cele două pătrate care arată culoarea aleasă.

În plus, se observă că bara de stare superioară a telefonului nu este vizibilă și că ecranul conține o imagine de fundal, puțin contrastată, astfel încât să nu deranjeze vizualizarea, ceea ce permite să aprecieze transparența canalului alfa.

Să vedem cum să aranjăm pe ecranul aplicației noastre componentele aspectului grafic, aspectele în MIT App Inventor, necesare pentru a obține în proiectul nostru o imagine similară cu cea prezentată:

Cu aceasta am configurat aspectul grafic al aplicației, care ar fi așa cum se vede în imagine, dar nu am adăugat nicio funcționalitate prin blocuri de cod. În pasul următor vom face să apară și să funcționeze glisoarele de selecție a culorilor.

Pasul 2: selectarea componentelor de culoare

În acest pas vom adăuga elementele de interfață și blocurile pentru a putea selecta fiecare componentă a culorii folosind o bară de selecție și vom arăta valoarea hexazecimală a componentei menționate și intensitatea culorii acesteia. Mai întâi se va efectua întregul proces pentru componenta roșie și apoi se va repeta, schimbând valorile corespunzătoare, pentru ca toate cele 4 să funcționeze. Să vedem pentru primul pas cum să adăugăm elementele grafice și mai târziu blocurile de cod.

În primul rând, vom adăuga elementele grafice ale culorii roșii. Pentru a face acest lucru, pe elementul Roșu vom adăuga:

Acum vrem ca atunci când deplasați cursorul barei și obțineți, așa cum am menționat anterior, o valoare cuprinsă între 0 și 255, textul se schimbă reflectând valoarea menționată în hexazecimal și culoarea casetei să-și modifice componenta roșie în funcție de acea valoare. În secțiunea Blocuri din vizualizarea programului selectăm evenimentul asociat cu schimbarea poziției cursorului Redbar care ne permite să accesăm valoarea configurată în bară în funcție de poziția cursului prin proprietatea ThumbPosition. Cu această valoare putem genera textul afișat în RedValue și culoarea casetei RedRight. În primul caz, va trebui să folosim un bloc din secțiunea Matematică care permite exprimarea unei valori în hexazecimal, iar pentru al doilea, trebuie să luăm în considerare faptul că culoarea poate fi creată printr-o listă cu componentele sale și un din secțiunea Culori, așa că vom folosi valoarea din componenta roșie, lăsând celelalte două componente de culoare la 0 și canalul alfa la 255. Mai întâi trebuie să comentăm că valoarea returnată de bara de selecție este un număr real, cu o parte zecimală, pe care trebuie să o convertim în număr întreg înainte de a o utiliza în cazurile descrise. Vom efectua conversia folosind blocul de plafon al secțiunii Matematică .

Odată ce acești pași sunt finalizați, vom putea vedea funcționarea barei de selecție roșie și cum, atunci când deplasați cursorul sau apăsați la un moment dat pe bară, se schimbă valoarea culorii și intensitatea roșului din casetă. Când am testat că funcționează corect, vom repeta pașii pentru celelalte culori și canalul alfa, ținând cont de poziția diferitelor componente de culoare la crearea culorii rezultate. În exemplu, în cazul canalului alfa, am ales să setăm cele trei componente de culoare la 255. Dacă caseta a cărei transparență o modificăm ar fi fost setată la 0 ar fi neagră.

Înainte de a continua cu pasul următor, va fi propusă o mică extensie. Când folosim valoarea returnată de bară în hexazecimal, aceasta va avea în general două cifre semnificative, dar, când este foarte mică, cea mai mare va fi 0 și textul va fi tipărit cu un singur caracter. Dacă doriți să arătați întotdeauna cu două, adică să arătați 0 din stânga, trebuie să faceți o mică procedură care completează textul adăugând 0 din stânga lipsă. Se propune realizarea unei proceduri pe care o vom numi hex2txt care primește doi parametri, valoarea care urmează să fie convertită și numărul de caractere ale textului pe care îl returnează. În blocurile pe care le-am făcut până acum, vom înlocui conversia în hexazecimal printr-un apel la această procedură cu valoarea returnată de bară și trecută la întreg și 2 ca număr de cifre.

Această procedură va converti valoarea în hexazecimal și, atâta timp cât numărul de cifre din textul rezultat este mai mic decât indicat, va adăuga un 0 la stânga și va verifica din nou lungimea.

Acum avem cele patru bare de selecție funcționale și putem vedea că culoarea și textele sunt modificate de acestea. În pasul următor vom termina făcând ca, la schimbarea valorii oricăreia dintre bare, culorile să fie actualizate pe cele două casete inferioare și să se genereze valoarea hexazecimală a celor 32 de biți de culoare.

Pasul 3: punerea împreună a componentelor de culoare

În pasul anterior am reușit să schimbăm culoarea asociată fiecărei componente atunci când am modificat poziția cursorului oricărei bare glisante. Acum trebuie să facem ca la schimbarea oricăreia dintre cele 4 bare glisante, culoarea celor două dreptunghiuri din secțiunea inferioară să fie modificată și valoarea hexazecimală a culorii, prezentată deasupra lor, să se schimbe.

Mai întâi putem adăuga codul în bara roșie. La blocurile activate de evenimentul asociat schimbării BarRed, adăugăm modificarea culorii de fundal a casetelor ColorPlano și ColorCuadros. Primul se va forma cu valorile barelor celor trei componente R, G și B și va fi opac; a doua va avea aceleași trei componente inițiale și valoarea canalului alfa în a patra. Acum putem vedea că atunci când deplasați bara roșie, culoarea casetelor inferioare este modificată. Am putea repeta acest bloc de cod în evenimentele asociate cu schimbarea celor patru bare glisante, dar pentru a evita repetarea aceluiași bloc de patru ori este mai bine să folosiți o procedură. Deci, vom încapsula noul bloc adăugat la evenimentul asociat cu bara de culisare roșie într-o procedură pe care o vom numi actualizare și la sfârșitul fiecăruia dintre cele patru evenimente asociate barelor, un apel la acea procedură. Dacă mutați oricare dintre bare, veți schimba culoarea dreptunghiurilor inferioare.

Este încă necesar să se afișeze valoarea hexazecimală corectă pe casetele colorate. Valoarea sa numerică este calculată ca R * 256 3 + G * 256 2 + B * 256 + A, unde R, G, B și respectiv A sunt părțile întregi ale valorilor barelor de diapozitive corespunzătoare. Această valoare poate fi, de asemenea, calculată mai rapid - este ceea ce se face pentru a calcula valorile polinoamelor, de exemplu -, cum ar fi (((R * 256 + G) * 256) + B * 256) + A și această expresie este Puteți programa cu ușurință iterând peste listă cu valorile care ne permit să formăm culoarea ColorCuadros. Cu această valoare și 8 ca număr de cifre, folosim funcția hex2txt pentru a genera textul hexadecimal și concatenăm „0x” la stânga pentru a obține un text egal cu cel afișat în eticheta ColHexa. Includem toate acestea în procedura de actualizare și practic am finalizat acest pas.

Lipsește un mic detaliu care ar fi putut deveni evident dacă am testat codul prezentat până acum. În unele cazuri, atunci când modificați una dintre bare din starea inițială, valoarea hexazecimală afișată pentru culoarea globală nu este ceea ce se așteaptă, deoarece componentele culorilor nemodificate nu pot fi aceleași cu cele afișate lângă fiecare bară. Acest lucru se datorează faptului că valoarea returnată de bare depinde de poziția cursorului și de lungimea acestuia și, dacă aceasta este mai mică de 255, este posibil să nu returneze toate valorile întregi care se potrivesc într-un octet, în special, valoarea 7F care setăm implicit. Dacă dorim să corectăm această mică abatere, va fi suficient să adăugăm un bloc care este activat când pornește aplicația, cu evenimentul Initialize care se ocupă de citirea valorii reale a fiecărei bare, actualizarea textului afișat în dreapta și apelând procedura de actualizare pentru a corecta valoarea culorii globale.

Cu aceasta vom avea aplicația de bază corect terminată. În pasul următor vom propune și programa o extensie simplă, încheind astfel proiectul.

Pasul 4: schimbarea culorii unei fotografii

În zilele fotografiei analogice, un efect numit s-a întors spre sepia și a constat în aplicarea unei spălări chimice pe fotografie, astfel încât să capete o nuanță gălbuie și să arate ca o fotografie veche. Acum că aplicația noastră ne permite să configurăm culoarea dorită cu transparența dorită, o vom extinde pentru a ne permite să facem o fotografie și să ne arătăm rezultatul suprapunerii culorii configurate pe ea. Cu aceasta vom vedea, de asemenea, cum să creați o aplicație cu mai multe ecrane și cum să mergeți de la unul la altul.

În interfață, pe ecranul inițial Screen1 vom adăuga AccelerometerSensor din secțiunea Senzori și îl vom numi Accelerometer. Folosind butonul Adăugare ecran. Vom adăuga un al doilea ecran pe care îl vom numi Cameră și vom pune în el un element de reglare verticală care îl umple complet pe care îl vom numi Layer1 și o Cameră pe care o vom obține din secțiunea Media .

În codul de pe ecranul original vom adăuga o nouă variabilă globală pe care o vom numi Selectată și inițializată cu orice culoare din secțiunea Culori. De asemenea, în procedura de actualizare vom adăuga codul necesar, astfel încât această variabilă să ia valoarea culorii configurate prin intermediul celor patru bare glisante, așa cum am făcut pentru a genera culoarea ColorCuadros. Vom adăuga un nou bloc care răspunde la evenimentul de scuturare a telefonului, prin blocurile asociate accelerometrului și care deschide fereastra Camerei cu valoarea inițială Selectată .

În programul de pe celălalt ecran vom adăuga o variabilă globală pe care o vom numi Filter inițializată cu valoarea de pornire a ecranului și vom pune două blocuri simple:

  • La inițializarea ecranului vom apela procedura TakePicture de la Camera1 .
  • Când fotografia a fost făcută, adică cu evenimentul AfterPicture al camerei1, vom pune imaginea făcută în partea de jos a ecranului camerei, iar în culoarea de fundal a elementului Layer1 valoarea filtrului, care este culoarea selectată cu barele de pe ecran anterioare.

Acum putem termina proiectul și ne putem dedica fotografierii și schimbării culorii acestuia.