Sunteți pe pagina 1din 75

B. Clase de aplicatii multimedia C. Conditii hard-soft pentru multimedia B. Clase de aplicatii multimedia 1.

dupa domeniul vizat de aplicatia multimedia -continuare2. dupa destinatie si interactivitate a) aplicatii multimedia de uz general si de uz personal ex: uz general: chioscurile de informatii, bornele interactive de informare (display, tastatura, meniu) in institutii; b) aplicatii multimedia locale si telematice - aplicatiile locale: se instaleaza pe o masina si ruleaza acolo (aplicatii desktop) - aplicatiile telematice: la distanta; vizualizate printr-un browser web (aplicatii web) Exista tendinta de a se combina sau de a se elimina unele pe celelalte: Exista si aplicatii desktop care folosesc resurse de la distanta (client-server) Aplicatii la distanta: interfata si reactia sunt mai lente; avantaj: nu mai umplu memoria cu registri, biblioteci, etc. c) aplicatii multimedia interactive si noninteractive - aplicatiile interactive: mai familiare; cele pe care le putem controla dpdv al scenariului de derulare a informatiei (selectez ce vreau sa vad, in ce ordine, etc); - aplicatiile noninteractive: se desfasoara dupa un scenariu predefinit. C. Conditii hard-soft pentru multimedia Pentru a procesa tipul media, este nevoie de anumite conditii minime 1) la nivel hardware: device-uri, dispozitive, periferice necesare pentru achizitia tipului media - in timp sunt depasite; apar mereu unele tot mai performante; Microsoft a incercat sa dea un standard minin de functionare. - mmx Conditii hard pe medii de comunicare a) pentru achizitie de imagini fixe: i) scanner: capabil sa preia imaginea imprimata pe suport hartie; o preia in format bitmap (harta de biti) De obicei, software specializat OCR (Optical Character Recognition ) ai sa furnizeze textul in format editabil si nu ca bitmap. ii) scanner de roll-film: preia imaginea de pe diapozitiv, celuloid iii) aparatul foto digital: pentru a transfera imaginile sistemului de calcul are nevoie de un driver si o conexiune cu un port USB

b) pentru lucrul cu sunet in sistemul de calcul: i) placa de sunet, care actioneaza ca un convertor de semnal audio din analog in digital pe input-uri (microfon, etc), respectiv din digital in analog pe output-uri c) pentru lucrul cu componenta video: i) placa de achizitie si numerizare video (placa de captura): actioneaza ca o placa de sunet, numai ca aici se refera la semnal video, nu la cel audio - depinde de capabilitatile placilor - si placile video normale pot face acest lucru; dar in general doar preiau, nu si scot semnale video; - altele pot prelua semnalul video pe tipuri de semnal (SVideo separator video: este capabil sa proceseze separat pe luminanta, respectiv pro. Nanta (adica stralucire si culoare)) - altele capabile sa preia mai multe fluxuri simultan (procesari in direct intre cele 2 fluxuri; ex: transmisiune in direct din 2 locuri, cu efecte de tranzitie intre ele, etc) Device-uri mai simple: ii) web cam: are nevoie de driver, respectiv conexiune pe port USB; nu face conversie de semnal, il preia direct in format digital; iii) placa tunner-TV: capabila sa preia semnalul din antena TV; 2) la nivelul componentelor software: a) nivelul de jos, cel mai apropiat de periferice: drivere (programe de control a perifericelor) b) nivelul urmator: software multimedia ca extensie a sistemului de operare: pentru ca simpla instalare a sistemului de operare furnizeaza si o componenta software cu ajutorul careia se pot manipula resurse media - Apple Macintosh: QuickTime - Windows: Windows Media Player Niste forme care sunt standarde in jurul problemei respective: - pentru Windows: wav, avi incepand cu XP 2 formate pentru audio/ video, comprimate: wma (Windows Media Audio), wmv (Windows Media Video); vor sa le lanseze ca standarde de compresie media - pentru Apple Macintosh (primul loc in domeniul graficii): mov pentru video (movie): rata destul de buna de compresie, tinand cont de calitate aiff: Audio Interchange File Format, pentru audio c) software multimedia specializat pe medii de comunicare: - face parte din softul utilitar - ajuta la achizitia si editarea resurselor media i) produse software pentru lucrul cu imagine: Adobe PhotoShop COREL (pentru imagini bitmap, cat si vectoriale; genereaza si animatie, pornind de la cadre cheie, apoi generand cadrele intermediare in raport cu factorul timp) ii) produse software pentru lucrul cu sunet:

Adobe Audition, care provine din Cool Edit Pro Sound Forge pentru sunet digital iii) produse software pentru lucrul cu resurse video: Adobe Premiere d) componente software pentru multimedia utilizate pentru dezvoltarea de aplicatii multimedia MMSYSTEM.DLL : biblioteca de rutina care face legatura aplicatiilor cu perifericele; se invoca in mediile de programare prin intermediul a 2 interfete alternative: API (Application Program Interface) si MCI (Media Control Interface). I) MCI: - specific Windows; - este o interfata de comenzi unitare ce permite conexiunea si controlul perifericelor multimedia legate la un calculator in mediul Windows; - perifericele controlabile prin niste comenzi O comanda MCI are urmatoarea structura: Actiune Dispozitiv Argumente_Suplimentare Actiune: de genul open, play, close Dispozitiv: dispozitivul caruia i se adreseaza comanda (de genul CD-audio, video disc, wave audio, avi video, etc niste dispozitive cunoscute) Argumente_Suplimentare: tin de natura actiunii; exemplu: pentru play CD-audio, pot furniza track-ul pe care sa il deschida; pentru video: intre ce momente de timp sa dea play Aceasta interfata apare odata cu unitatea de CD-ROM. Cu ajutorul ei se realizeaza controlul CD-ROM. A urmat dezvoltarea interfetei, fiind capabila sa coreleze si controleze toate device-urile multimedia. Modalitati de trimitere a unei comenzi MCI: 1. mciSendCommand functie; print intermediul ei se trimite o comanda dispozitivului MCI; mai greoaie, in sensul ca respectivele comenzi sunt definite prin constante simbolice si se folosesc ca atare: MCI_PLAY, MCI_OPEN, iar argumentele sunt impachetate in structuri predefinite MCI_OPEN_PARMS (parametri); impacheteaza membri care sunt interpretati ca argument suplimentar pentru comanda de deschidere; 2. furnizeaza interfetei MCI comanda sub forma unui literal (sir de caractere); functie: mciSendString; exemplu: open f.wav type waveaudio alias sunet deschide un dispozitiv MCI de tip audio. I-a asociat un alias comenzii, ca sa se refere la tipul respectiv prin alias. play sunet cea mai simpla forma de derulare Pentru a face legatura intre tipul de dispozitiv MCI si resursa multimedia exista o sectiune corespunzatoare in fisierele de initializare ale sistemului (system.ini, win.ini), iar sectiunea in care se face acest lucru poarta denumirea de sectiunea [MCI]. Legatura se face de tipul

wav=waveaudio avand conexiunea intre resursa si tipul de dispozitiv, nu mai este necesar sa furnizeze in comanda si tipul: open f.wav alias sunet Realizand controlul perifericelor prin intermediul comenzilor, interfata MCI se poate utiliza din diferite medii de dezvoltare a aplicatiilor (limbaje de programare, software de creatie multimedia) MCI control prin comenzi II) API: Comparatie privind sfera de cuprindere: interfata API are o sfera mult mai mare de cuprindere, in sensul ca nu se refera doar la periferice ce tin de resurse media, asa cum e cazul MCI (interfata creata strict pentru multimedia). Exemplu: exista posibilitatea utilizarii interfetei API pentru programarea socket-ului. API control prin intermediul unor functii - contine un set imens de functii - alternativa este sa o dezvolti obiectual (.Net Framework clasa de obiecte in loc de functii) Cum regasim functiile? Ele sunt individualizate prin prefixarea denumirii - pentru procesarea imaginilor: functiile API care incep cu prefixul DrawDib proceseaza imaginile tratandu-le ca fiind independente de dispozitiv (Driver Independent Bitmap) -pentru sunet: WaveIn pentru preluarea fluxului audio din dispozitiv WaveOut pentru predarea secventei audio pe dispozitiv Prefixarea este necesara pentru ca in acest caz controlul pentru procesarea resursei nu se mai face prin intermediul unei singure comenzi, printr-un singur apel de functie (trebuie deschis bufferul, etc). Functie API: SndPlaySound deruleaza secventa audio printr-un singur apel al ei Procesul descris are loc si de sus in jos, si de jos in sus (de la periferic primesc un feedback care este exploatat de aplicatie). Legat de interfetele API: interfete API specializate (care au ca principal obiectiv redarea la nivel grafic in cadrul sistemului de calcul) redarea graficii pe calculator - in Windows: GDI (Graphic Device Interface) realizata ca un limbaj de programare a graficii in mediul Windows pentru a realiza independenta intre programul de afisare grafica si dispozitivul pe care programul ruleaza (vad acelasi lucru pe 2 calculatoare, chiar daca au placi video diferite de exemplu). Este o interfata care are corespondent clar in partea de programare sub Windows programare in tehnica SDK, cu biblioteca MFC (Visual Studio 6.0). A evoluat in timp: GDI ++ in prezent. Poate umple o suprafata de pe ecran in gradient. - GSK (Graphic Kernell System) are si capacitati de grafica tridimensionala nativ. Alte componente software pentru dezvoltarea de multimedia: - DirectX - pentru Vista

- biblioteca de procesari la nivel grafic - biblioteca complexa ce este utila pentru prelucrarea in general a tipului media, nu numai pentru tipul grafic; - disponibil pe module implementate pe tipul de resurse: DirectX 3D, DirectX Sound, DirectX Show; destul de greu de folosit

2 directii de dezvoltare a multimedia: A) software de creatie multimedia B) programare multimedia PRODUSE SOFTWARE DE CREATIE MULTIMEDIA 1) software de creatie multimedia care isi dezvolta proiectul de-a lungul unei axe a timpului Scenariul de creare a aplicatiei se dezvolta de-a lungul unei axe a timpul (filosofia de sondare a proiectului este axa timpului) Produse software reprezentative: Macromedia Flash, Macromedia Director 2) produse software care isi dezvolta proiectul pe principiul cartii (scenariul se realizeaza punand elementele in pagini, iar aplicatia consta in vizualizarea paginilor respective) Este ceva in gen Power Point. Produs reprezentativ: ToolBook Instructor 3) produse software care isi dezvolta aplicatia pe baza unei diagrame de flux Ceva similar cu o schema logica. Produs reprezentativ: Authorware -- interfata iconica (icon-uri pentru descrierea fluxului): diagrame, icon-uri pentru resurse multimedia, etc, cu ajutorul carora utilizatorul isi construieste fluxul de derulare a aplicatiei. -- gen produsele de managementul documentelor: generarea de documente si a traseului pe care sa circule acestea.

COMPONENTELE CARE FORMEAZA TIPUL MEDIA

A. IMAGINILE 1. Formate de reprezentare a imaginilor 2. Animatia 3. Compresia/ decompresia imaginilor 1. Formate de reprezentare a imaginilor Sistemul de calcul utilizeaza/ prelucreaza imaginile in 2 mari formate de reprezentare: 1) format bitmap (harta de biti/ raster) 2) format vectorial 1) format bitmap O imagine in format bitmap se reprezinta ca o matrice informationala simpla. Fiecare element din matrice codifica culoarea unui punct individual din imagine imaginea este memorata punct cu punct (pixel cu pixel), bidimesional, cu linii si coloane. Codificare: cod pentru culoare. Translatia intre cod si culoare o realizeaza paleta de culori: daca foloseste o paleta cu nuante de gri, vad imaginea pe nuante de gri, fara a modifica cineva valorile din matrice, schimba doar paleta de culori. Imaginile reprezentate in aceasta forma ocupa un volum mare de memorie, semnificativ in functie de numarul culorilor din paleta de culori. Cu cat adancimea de culoare este mai mare, cu atat punctele de culoare se reprezinta pe mai multi octeti. RGB 24 biti (cate 1 octet pentru fiecare culoare). Imaginile in reprezentare bitmap sunt dependente de scala de vizualizare (zoom). Imaginea marita in raport cu dimensiunea ei originala isi pierde din claritate procedeul de pixelizare: multiplicarea pixelilor intr-o zona mai mare decat ecranul ? (umple o zona cu pixeli). La fel, daca este micsorata, atunci se pierd din pixeli, si din nou claritatea imaginii va fi afectata. Principalii algoritmi de compresie a imaginii s-au concentrat pe acest format de reprezentare. Asumat ca standard de compresie: jpeg. Algoritmii cu pierdere de informatie realizeaza compresie mai buna, cu diminuarea calitatii imaginii. Cu cat gradul de compresie este mai mare, cu atat calitatea imaginii scade. Marea majoritate a echipamentelor periferice care au ca scop achizitia de imagini fixe ofera sistemului de calcul imaginea in format bitmap: scanner-ul, aparatul foto digital, scanner-ul de roll-film, etc. Cele mai cunoscute si utilizate formate de stocare a imaginilor in format bitmap sunt (pentru platforma Windows): a) formatul de stocare .bmp -- standard Se caracterizeaza printr-o rata mica de compresie (grad mic de compresie). Bitmap-uri standardizate ca marime si paleta de culori: i) .ico pentru pictograme (icon-uri, iconite);

ii) bitmap-uri (fisiere bitmap) pentru cursoare; lucreaza in 2 culori (alb si negru). b) formatul .gif (Graphic Interchange Format) Este intalnit mai des in legatura cu imaginile pe web, pentru ca standardizeaza paleta de culori. Este preferat pe web ca imaginea sa fie vazuta la fel pe orice calculator la nivel de culoare. c) formatul .tiff (Tagged Image File Format) Este mai des utilizat in raport cu scanner-ele. Sunt imagini de dimensiuni mari pentru ca folosesc ca raport de reprezentare pentru culoare pixelul pe 48 de biti: 16 biti pentru fiecare culoare fundamentala din spectrul RGB. Datorita acestui lucru, au si acuratete mare (redau orice detaliu). d) formatul .jpeg sau .jpg (Joint Photographic Experts Group) S-a impus ca standard in ceea ce priveste imaginile bitmap comprimate, compresia facandu-se in baza algoritmului jpeg. e) formatele .dib si .ddb Nu sunt formate propriu-zise de stocare, ci 2 formate utilizate in partea de procesare a bitmap-urilor (vezi API-DrawDib). .dib Device Independent Bitmap .ddb Device Dependent Bitmap Diferenta intre aceste doua moduri de lucru este urmatoarea: in cazul .dib, sunt preluate din bitmap-ul respectiv informatii cu privire la paleta de culori. Acele functii utilizeaza si informatii legate de paleta de culori, astfel incat la afisarea imaginii pe un alt device, sa fie vazul la nivel de culoare in aceeasi forma in care era pe device-ul pe care a fost creata. In cazul .ddb, functiile utilizeaza paleta de culoare implicita a dispozitivului pe care este redata imaginea. O imagine se poate sa fie vazuta intr-un fel pe o placa, si in alt fel pe o placa mai performanta, la nivel de paleta de culori. Functiile .ddb sunt mult mai rapide decat functiile care utilizeaza si proceseaza bitmapurile cu .dib, pentru ca nu mai translateaza paleta de culori.

2) format vectorial Spre deosebire de formatul bitmap, formatul vectorial tine cont de semantica imaginii (sematica imaginii se refera la obiectele, dpdv grafic, care constituie, care apar in imaginea respectiva: le interpreteaza geometric), spre deosebire de bitmap, unde imaginea este memorata pixel cu pixel (punct cu punct). Ele apar ca o descriere a imaginii respective, pornind de la punctele individuale si functii matematice (originea si ecuatia dreptei). Sunt semnificativ mai mici ca dimensiune in raport cu corespondentul lor, bitmap (decat imaginile reprezentate ca bitmap). Cand imaginea are multe obiecte grafice, atunci devin si ele semnificative ca dimensiune.

Spre deosebire de imaginile bitmap, acestea sunt independente de scala de vizualizare, in sensul ca un zoom pe ele nu duce si la pierderea calitatii, nu distorsioneaza imaginea (se retraseaza tot in functie de noua scala, nu are ce deteriora). Cu toate ca sunt considerabil mai mici ca dimensiune, nu distorsioneaza imaginea, totusi nu sunt utilizate prea des, limita lor fiind data de faptul ca in natura nu totul se poate reprezenta la nivel de forme geometrice. Exista teorii care se ocupa cu aducerea elementelor din natura la nivel de vectorial: teoria fractala (fractalul Julia, care este reprezentarea vectoriala a frunzei de feriga, fractalul pentru a reprezenta vectorial constelatia(galaxia)). Teoria fractala presupune un mod recursiv de a genera, pornind de la particule, intregul ca fiind o multiplicare a elementelor de acelasi fel necesita un timp mare de procesare (cateva ore pentru reprezentarea ferigii), datorita complexitatii algoritmului de reprezentare. Combinatii intre formatul bitmap si cel vectorial: i) elementele de realitate virtuala (de genul camerelor prin care te plimbi, etc): ambientul este reprezentat vectorial, folosind apoi bitmap-ul pentru texturi. ii) fotografiile din satelit, cu suprafata terestra: furnizate de ambii sateliti (Iconos este unul dintre ei) in format bitmap, numai ca ei precizeaza si ca pixelul din cadrul fotografiei corespunde pe suprafata terestra la 5 m2 de exemplu, astfel incat ai posibilitatea de a controla distanta dintre elementele fotografiate. Exista posibilitatea de a face conversii din formatul bitmap in cel vectorial. Corel (cu modulul CorelTrace) incearca acest lucru. Incearca si nu reuseste mereu pentru ca, daca de exemplu are un bitmap cu un peisaj, nu va reusi sa scoata mare lucru, deoarece nu prea va avea forme geometrice in acea imagine. Pe cand pentru o organigrama de exemplu, recunoaste contururi, etc, va reusi conversia in format vectorial. Formate de stocare a imaginilor in format vectorial, care sunt specifice firmelor care leau creat: a) .dxf (Drawing Exchange Format/ Drawing Interchange Format) formatul firmei Autodesk (creatoarea AutoCAD) b) .eps (Encapsulated PostScript) formatul firmei Adobe, pentru grafica sau imagini vectoriale. Adobe a incercat standardizarea descrierii imaginilor vectoriale prin intermediul unui protocol numit PostScript. c) .cgm (Computer Graphic Metafile) formatul creat la initiativa institutiilor de standardizare in domeniul informaticii ISO ANSI, cu scopul transferului imaginilor vectoriale intre diferite platforme. d) .shp (Shape File) pentru date spatiale; capabil de a stoca date spatiale. Esenta consta in date de tip: --point (pentru reprezentari de obiecte punctuale: localitati in Romania, muzee in Bucuresti, etc) --line(pentru reprezentari de segmente: drumuri, conducte, rauri, etc)

--poligon neregulat (pentru reprezentari de suprafete: parcele, proprietati, lacuri, etc). Acestea sunt datele recunoscute, iar din ele au aparut extensii: network, volume (pentru 3D), etc. 2. Animatia Initial, dinamismul la nivel vizual al sistemului de calcul apare legat de animatie, urmand ca apoi sa se utilizeze componenta video (la nivel de sistem de calcul). ~Definitie: Animatia presupune modificarea rapida a imaginilor vizualizate, prin modificarea pozitiei, formei, dimensiunii unui obiect din cadrul imaginii. Dinamismul la nivel vizual este sugerat prin niste tehnici de realizare a animatiilor: 1) tehnica filmului Imita, se bazeaza pe modul de realizare a dinamismului la nivel vizual utilizat in cinematografie. Se porneste de la imagini fixe, urmand ca acestea sa fie vizualizate intr-o secventa prestabilita la un anumit interval de timp (succesiunea imaginilor sa se realizeze la un interval de timp). Exemplu: Pamantul, desenat cu continentele, in diferite pozitii, ai vizualizand imaginile in secventa sa se dea ideea de rotire a acestuia. 2) tehnica cadrelor cheie Se definesc (desemneaza) cadre, numite cadre cheie, urmand ca produsul software sa genereze cadrele intermediare in functie de parametrul timp, pe care il stabileste cel care creaza animatia (timp mai mare inseamna mai multe cadre intermediare). Aceasta tehnica presupune existenta a cel putin 2 cadre cheie: cadrul de inceput si cel de sfarsit. Produse software care folosesc aceasta tehnica: Macromedia Flash, 3D Studio Max, Corel. 3) tehnica de animatie prin modificarea pozitiei unui obiect in cadrul imaginii Tehnica este regasita in produsele de creatie multimedia prin asocierea unui traseu de animatie unui obiect grafic. La declansarea unui eveniment, obiectul de anima, urmand acest traseu. Se poate genera si aleatoriu traseul de urmat, printr-un script. 4) tehnica animatiei prin schema culorii Obiecte din cadrul imaginii isi schimba iterativ culoarea intr-un interval de timp, astfel incat este sugerata miscarea obiectelor respective. Exemplul clasic pentru acest tip de animatie este cercul impartit in sectoare de cerc. Un sector are o culoare diferita, in iteratia urmatoare un sector adiacent trece la aceeasi culoare, samd, sugerand astfel miscarea de rotatie. Stocarea numerica a animatiei presupune pastrarea elementelor independente ce compun miscarea in raport cu factorul timp. Daca vreau sa stochez un tip de animatie si sa o vizualizez intr-un alt produs, se stocheaza numai la nivel de secventa de imagini fixe (pentru orice tehnica de animatie folosita), de frame. Ca formate de stocare numerica a animatiei: .gif-ul animat: secventa de bitmap-uri fixe

.fli, .flc: Animation Flick permit stocarea secventelor animate tot la nivel de secvente de bitmap Componentele care formeaza tipul media A. Imaginile 1. Formate de reprezentare a imaginilor 2. Animatia 3. Compresia/ decompresia imaginilor 3. Compresia/ decompresia imaginilor Algoritmii de compresie care s-au adaptat si pentru imagini initial au aparut in jurul datelor obisnuite. Algoritmi de compresie a imaginii: 1) Codul (algoritmul) Huffman Algoritm care comprima un volum informational speculand elemente ce tin de frecventa de aparitie a simbolurilor in document. Cum codifica: simbolurile care apar cu frecventa mai ridicata sunt codificate pe mai multi biti, iar cele cu freventa mai redusa de aparitie sunt retinute pe mai putini biti. Are la baza un arbore binar dezechilibrat, si tine simbolurile care apar cu frecventa mai mare mai aproape de radacina, pentru a ajunge mai usor la ele. Codificarea marcarea distantei de la radacina la nodul codificat. S-a aplicat acest cod de comprimare si la imagini pentru ca se presupune ca intr-o fotografie exista o culoare dominanta. 2) algoritmul RLE (Run-length Encoding) Are eficienta maxima daca sunt satisfacute doua cerinte vizavi de informatia care va fi comprimata: a) diversitate informationala mica (relativ putine simboluri distincte) b) factor mare de repetabilitate (simbolurile sa apara in document unele dupa altele). Se considera ca in imagini multi pixeli invecinati sunt de aceeasi culoare. In prezent a crescut mult adancimea de culoare: chiar daca ochiul uman percepe aceeasi culoare, totusi sunt nuante diferite, de simboluri diferite. Adancimea de culoare: 24 biti per pixel peste 16 milioane de culori Algoritmul era eficient cand imaginile se exprimau in 256 de culori de exemplu, cand adancimea de culoare era mult mai mica. Acum nu mai este eficient, conditiile a) si b) nu prea mai sunt satisfacute. Cum codifica: decat sa retina simbolul in secventa de n ori, tine numarul de repetitii (factorul de repetitie) si simbolul o singura data. 3) algoritmul RGB 5-5-5 - algoritm special pentru imagini Numele ii vine de la modul de lucru: reduce numarul de pixeli rezervati pentru fiecare culoare fundamentala din spectrul RGB de la 8 la 5 biti.

Implicatiile la nivel de imagine: reduce numarul de nuante. Se observa ca nu percepem deranjant aceste modificari in ceea ce priveste numarul de nuante, ochiul nu sesizeaza diferente majore in imagine. 4) algoritmul LZW (Lempel Ziv Welch) In esenta, codifica un document pe baza unui dictionar de simboluri, pe care il creaza in paralel. Simbolurile sunt alese prin constructie de secvente in cadrul documentului. Secvente = simboluri consecutive care se repeta in cadrul documentului. Dictionarul porneste de la 256 de simboluri (codul ASCII) si urmeaza sa isi adauge simboluri noi in functie de ceea ce regaseste in secventele din document. Spre deosebire de codul Huffman, care cauta simbolurile cu frecventa de aparitie in intreg documentul, algoritmul LZW isi cauta simbolurile care se repeta in secventa. http://en.wikipedia.org/wiki/Lempel-Ziv-Welch Formate de comprimare a imaginilor: a) .gif (Graphics Interchange Format) Foloseste ca algoritm de baza RGB 5-5-5, adica reduce numarul de nuante. Gif standardizeaza numarul si paleta de culori (aceeasi nuanta pe masini diferite). Spre deosebire de RGB 5-5-5, care reduce brutal numarul de nuante, gif realizeaza reprezentarea culorilor prin analiza imaginii: analizeaza imaginea ce va fi comprimata si vede ce nuante apar, pe care le reduce si pe care nu. Isi creeaza o tabela de culori pe baza analizei. Comprima in raport de 3:1, adica memoreaza punctele pe 8 biti in loc de 24 biti. Construieste o tabela de culori avand 256 de intrari. Daca observa ca predomina o anumita culoare, elimina nu o singura nuanta, ci mai multe. ?? Tabela globala de culori: la nivel de intreaga imagine. Acest lucru functioneaza pentru imagini de rezolutie mica. Pentru imaginile de rezolutie mare: are tabela locala de culori. Nu mai genereaza o tabela pe toata imaginea, ci genereaza tabele pe cadrane, astfel incat fiecare tabela ramane cu 256 de intrari, dar cele dintr-un cadran difera de intrarile din alt cadran, tocmai pentru a putea cuprinde diversitatea coloristica din imagini (si oricum, pe o zona de imagine, in general sunt nuante apropiate de culoare). b) .tiff (Tagged Image File Format) Foloseste in reprezentare algoritmul LZW. Tiff permite reprezentarea pixelilor (punctelor de culoare) pe 48 de biti, adica 16 biti pentru fiecare culoare fundamentala din spectrul de culori RGB. Astfel se obtine o reprezentare de o mare acuratete la nivel de culoare. Procesul de scanare este legat de tiff. Tiff aplica algoritmul LZW construind un dictionar ce contine initial 256 de culori de baza, urmand ca prin parcurgerea imaginii sa adauge la dictionar noi simboluri care rezulta din pixeli de culori diferite si combinat cu secvente de pixeli care se repeta in cadrul imaginii. Dictionarul permite maxim 4096 de intrari (simboluri).

! unii algoritmi sunt cu pierdere de informatie (RGB 5-5-5, gif), altii fara (RLE: la decomprimare obtine exact ceea ce a comprimat). c) .jpeg formatul care s-a impus ca standard Algoritmul a fost definit in mai multe moduri, unele fiind cu pierdere de informatie, altele fara. Are 4 moduri in care a fost definit: i) modul secvential (modul de baza), cu pierdere de informatie Caracteristici: realizeaza compresia imaginii la o singura parcurgere a acesteia. Este si cel mai raspandit mod de comprimare utilizat de prin jpeg. ii) modul progresiv Caracteristic acestui mod este faptul ca la o prima procesare a imaginii, rezulta o imagine slaba calitativ, urmand ca prin mai multe procesari ulterioare ale imaginii, algoritmul sa obtina o crestere a calitatii imaginii comprimate. Acest algoritm necesita mai multe procesari pentru a comprima o singura imagine. iii) modul ierarhic Pastreaza valorile pixelilor primei linii, integral. Apoi, urmatoarele linii le genereaza prin predictii: considera de exemplu ca linia 2 are toti pixelii identici cu prima linie. Compara linia obtinuta prin predictie cu cea originala si pastreaza doar diferentele. iv) modul progresiv fara pierdere de informatie In primul pas, pentru un punct din imagine, se pastreaza diferentele in raport cu 3 pixeli invecinati. In pasul al doilea, aceste diferente se codifica, folosind algoritmul Huffman. Se considera ca zonele din imagine au cam aceeasi valoare pentru punctele de culoare. Atunci diferentele sunt foarte mici. Se iau 3 pixeli pentru uniformitate: ca sa poata avea acelasi numar de pixeli vecini diferiti pentru toti pixelii, inclusiv pentru cei din colturi, care au doar 3 vecini. i) modul secvential (de baza) Este cel mai utilizat mod. Etape: Etapa 1: pregatirea imaginii In aceasta etapa, se transforma imaginea din reprezentare RGB (la nivel de reprezentare a culorii a punctelor) in reprezentare YUV, adica reprezentanta luminan crominan. In digital, punctul de pe ecran este combinatie RGB. Pe ecranele TV, in sistem analogic, punctul este dat de combinatia de stralucire (unde de stralucire Y) si culoare (UV). Astfel foloseste mai putina informatie pentru a reprezenta 1 punct. RGB: 1B pentru 1 punct in 3 planuri 3B. YUV: 2 planuri: unul de 1B pentru luminanta, culoarea o impacheteaza pe 1B. Ochiul este mai sensibil la luminanta decat la crominanta (vezi intuneric mai intai, nu culoarea). RGB YUV; trece din 3 planuri la 2.

Etapa 2: Se imparte imaginea in mici cadrane, regiuni regulate (8x8 pixeli) si se aplica o functie de transformare cosinus direct (functie de tip DCD discreet cosinus transform) si pentru fiecare pixel in parte rezulta un coeficient de transformare in cosinus discret. Este o functie suma de suma (iau in considerare toate elementele din cadranul respectiv, astfel incat coeficientii pentru transformare sa aiba legatura cu celelalte elemente existente in acel cadran). Etapa 3: etapa de cuantificare Aici are loc pierderea de informatie. Sunt pastrati doar acei coeficienti de transformare care sunt esentiali in obtinerea unei aproximari cat mai exacte in raport cu imaginea originala. Ce valori nu depasesc un anumit prag, sunt considerate valori nule. Acest principiu este utilizat mai ales la procesarea numerica a datelor, la compararea a doua numere reale. De obicei, nu se foloseste operatorul = = pentru ca daca a = 0,00001 si b = 0,000001, atunci nu vor fi considerate egale. Dar in algoritm eu vreau sa fie considerate egale. Atunci le scad, iar daca diferenta lor este mai mare decat un prag ales, atunci sunt considerate diferite. Etapa 4: comprimarea datelor utilizand codul Huffman Procesul de decompresie urmeaza etapele in sens invers: la etapa 3 se reaplica inversa functiei DCD. La recrearea pixelilor, nu se vor obtine exact aceleasi culori, se va pierde din informatie, dar aceasta este o pierdere controlata, iar diferentele nu sunt sesizabile. Standardul in ceea ce priveste compresia secventelor animate: mjpeg (Motion jpeg). Animatia poate fi salvata independent doar frame cu frame, bitmap cu bitmap. Principiul mjpeg este acela ca fiecare cadru individual este comprimat conform algoritmului jpeg. Avantaje: un rezultat bun calitativ prin compresie pot accesa fiecare cadru individual care compune animatia in fluxul cadrelor, fara sa decomprim animatia acces direct pe cadrul in fluxul comprimat. Dezavantaj: algoritmul nu speculeaza redundanta intercadru (adica se considera ca 2 cadre invecinate au multi pixeli asemenea). Manual: Image File Format John Miano, la biblioteca

B. SUNETUL

1. Numerizarea sunetului 2. Formate audio 3. Standardul midi (Musical Instrument Digital Interface) 4. Compresia/ decompresia sunetului 1. Numerizarea sunetului Sunetul este dat de vibratii mecanice in medii elastice, avand frecvente intre 16 si 20000 Hz. Vibratiile percepute placut de urechea umana se numesc sunete, iar cele percepute neplacut se numesc zgomote. In sistemul de calcul, inainte de placa de sunet, initial (pe 386, 486, etc) era incorporat un difuzor. Placa de baza avea un port care furniza o iesire trimisa catre acel difuzor. Ii dadea 2 valori: frecventa pe care sa produca vibratiile, si durata (cat timp sa produca vibratiile). Rezultatul era un sunet gen bipaituri. Sunetul este in format analogic. Pentru a fi prelucrat si stocat prin intermediul sistemului de calcul, trebuie sa fie obtinut in format numeric (digital), este nevoie de aceasta conversie. Etape in numerizarea sunetului: 1) prelucrarea semnalului analog si trecerea lui printr-un convertor analog digital 2) esantionarea semnalului convertit astfel incat sa se pastreze o minima informatie cu ajutorul careia sa se refaca forma initiala a semnalului. 3) prelucrarea informatiei numerice si stocarea ei conform unui format audio. Etapa critica in procesul de numerizare a sunetului este reprezentata de esantionarea semnalului. Prin aceasta se intelege sectionarea semnalului analog pe orizontala, de un numar de ori pe secunda, numar cuprins intre 4500 si 40000. Reprezentarea grafica a sunetului: o sinusoida care moduleaza, reprezinta intensitatea vibratiei. Corzile vocale vibreaza si timpanul receptioneaza aceste vibratii. Transferul se realizeaza prin miscarea moleculelor din aer, care fac ca vibratiile sa fie percepute. Fluctuatia de vibratii era tradusa analogic printr-o variaie continua a tensiunii, care era preluata si producea mai departe o und oscilatorie electrica, ce era imprimata membranei difuzorului. Stocarea se traducea printr-un flux de electroni la capul de scriere al (eventual) casetofonului ce magnetiza banda magnetic.

B. SUNETUL

1. Numerizarea sunetului 2. Formate audio 3. Standardul MIDI (Musical Instrument Digital Interface) 4. Compresia/ decompresia sunetului 1. Numerizarea sunetului Semnal vocal prelucrat prin microfon: 114 Hz Pentru semnal audio preluat de pe benzi magnetice se recomanda o rata de esantionare de 22 KHz Pentru sunet de calitate CD-audio: 44 KHz Calitatea sunetului mai depinde si de un alt factor, care se numeste rezolutie pe verticala (cuantifica amplitudinea). Aparatul care indica intensitatea sunetului se numeste vumetru . Sunetul poate fi preluat in calculator pe: 8, 16, 32 biti. Cu cat este pe mai multi biti, cu atat este mai bine. Avantajele existentei sunetului in format digital: stocarea si procesarea secventelor audio (pot accesa subsecvente de sunet, pot elimina zonele de liniste, etc) prin copieri repetate nu se diminueaza calitativ serios secventa audio (se copiaza valori numerice, deci nu are de ce sa se diminueze calitatea sunetului) nu se degradeaza suportul fizic de stocare a secventei prin copieri/ auditii (se poate zgaria cd-ul, dar nu se strica secventele numerice care contin melodia). 2. Formate audio Exista 2 tipuri de formate audio: A) formate audio analoge B) formate audio digitale a) neinformatice (nu trebuie sa le ascultam neaparat pe PC; de exemplu: CDaudio) b) informatice: 1) wave: permite stocarea sunetului la diferite rate de esantionare, in format: mono stereo: sunetul este reprezentat intercalat sunet digital necomprimat 2) wma (Windows Media Audio) standardul Windows XP pentru sunetul comprimat (mai putin folosit, cel mai utilizat fiind mp3) 3) aiff (Audio Interchange File Format) pentru platforma Apple MacIntosh 4) au (Audio File Format)

standardul pentru Sun (foloseste sistemul de operare UNIX), Unix si Java a aparut initial pentru telefonie digitala 5) vox formatul firmei Creative (produce placi de sunet) format propriu de stocare (sunetul este transformat intai in wave, apoi este transmis device-ului pentru a fi redat) 6) MPEG Layer-3 (mpeg audio) (MPEG Moving Pictures Expert Group) este cunoscut de utilizatori ca mp3 3. Standardul MIDI (Musical Instrument Digital Interface) MIDI este o interfata ce leaga in mod asincron si standardizat instrumente muzicale electrice, periferice si calculatorul pentru a comunica intre ele. Principalul instrument care foloseste standardul MIDI este sintetizatorul. Sunetul este redat prin prisma instrumentelor muzicale. In prezent se opereaza cu norma general midi, aceasta fiind capabila sa armonizeze 128 de instrumente pentru producerea secventelor audio (initial era posibil doar pentru 16-32 instrumente/ canale). Pe un canal se reda sunetul unui anumit instrument. Standardizare: se lucreaza pe canale de la 0 la 127 si fiecare canal reprezinta un anumit instrument. Asincron: utilizatorul poate sa asculte melodia doar prin prisma unor anumite instrumente (nu pot asculta toate canalele o data). Stocarea sunetului in format MIDI Sunetul apare ca o descriere a secventei audio, descrierea facandu-se in conformitate cu un anumit protocol. Descrierea este transformata apoi in sunet de componenta placii de sunet MIDI mapper (preia descrierea si o traduce in sunet (semnal audio)). MIDI furnizeaza un protocol capabil sa transforme in semnal audio un portativ muzical (dai secventa de note si el o transforma in sunete). Melodiile in format MIDI sunt foarte greu de creat pentru ca trebuie sa ai cunostinte muzicale si periferice muzicale (sintetizator, instrumente, etc). Comenzile de descriere cuprind: frecventa notei durata prin prisma carui instrument sa emita sunetul cu frecventa indicata volumul la care sa emita Comenzile respecta factorul timp. Avantaj: prin descrieri, sunetul MIDI este semnificativ mai mic ca dimensiune decat sunetul digital propriu-zis. Dezavantaje:

exista limite in ceea ce priveste gama de sunete care pot fi redate (doar instrumente muzicale, nu voce, sunete din natura, etc) periferice diferite sintetizeaza in mod diferit sunetele identice (aceeasi melodie suna diferit pe diferite telefoane mobile de exemplu). ! Este folosita aceeasi filosofie de abordare audio imagini MIDI bitmap vectorial

4. Compresia/ decompresia sunetului Compresia sunetului in format digital propriu-zis: reducerea spatiului necesar pentru stocare PCM = Pulse-code modulation Algoritmii de compresie pentru sunet s-au canalizat pe 2 mari directii: 1) reprezentare numerica (jocul cu cifre) 2) psihoperceptie (mai evoluat): speculeaza limitele oamenilor in ceea ce tine de perceptia sunetelor 1) elimina din valorile pe care le esantioneaza pe secunda pierderea calitatii sunetului *** Un alt algoritm, numit DPCM (Differential (sau Delta) pulse-code modulation (DPCM)), porneste de la urmatoarea idee: in loc sa memorez valorile rezultate din esantionare, mai bine memorez diferentele dintre valori. Prima valoare este memorata integral, apoi se memoreaza doar diferentele (se observa ca sunetele apropiate prezinta diferente mici de codificare) rezulta un volum mai mic de memorie pentru a le stoca. t0: DPCM = PCM R0 t1: R1 = R0 + DPCM ! Diferentele constituie semnalul rezidual. Principalul dezavantaj: odata aparuta o eroare, aceasta se propaga in continuare. *** Alt algoritm: Adaptive DPCM (ADPCM) Valorile mari obtinute prin diferenta sunt codificate pe un numar mai mare de biti, cele mici pe un numar mai mic. Algoritmul se combina cu separarea semnalului audio un subbenzi de frecventa: frecventa inalta: diferente mari frecventa joasa: diferente mici

64 kbps : 48 16 Procedeul invers: multiplexare ! In Adobe Audition putem urmari o secventa in modul culori. 2) MPEG audio foloseste si elemente ce tin de perceptia noastra a sunetelor 4. Compresia/ decompresia sunetului Algoritmii impusi ca standard (MPEG audio) comprima sunetul si pornind de la psihoperceptii (codificarea psihoperceptiilor): elimina din coloana sonora sunetele pe care noi nu le percepem. Sunetele pe care le elimina nu le sesizam datorita faptului ca sunt mascate: a) mascarea frecventelor b) mascarea temporala a) mascarea frecventelor In primul rand, din coloana sonora sunt eliminate sunete care au frecventa mai mare de 16-18 KHz (limita pana la care noi auzim: 18000 Hz). Mai sunt eliminate sunetele de intensitate scazuta, care apar concomitent cu sunete de intensitate inalta, conditia fiind ca sunetele sa fie in benzi invecinate de frecventa. Cele cu intensitate scazuta sunt mascate de cele cu intensitate inalta. b) mascarea temporara Se elimina sunetele de intensitate mica care urmeaza dupa sunete de intensitate puternica (pe o durata foarte mica). Sunetele de intensitate joasa nu mai pot fi percepute dupa ce am ascultat sunete de intensitate puternica. Cele puternice imprima o vibratie mare a timpanului, care are o inertie ce ramane ceva vreme. Pasii algoritmului de compresie: 1) Trecerea semnalului sonor printr-un banc de filtre. benzile de frecventa Adobe Audition; culorile: reprezinta valorile semnificative ? esantionarea pentru sistemele de telefonie digitala: ~ 5 KHz ? In paralel, se aleg si valorile de referinta pentru fiecare banda de semnal in parte. 2) Stabilirea numarului de biti disponibilizat, folosind un cuantificator de tip bit per zgomot mp3: compresia, in plus, elimina zgomotul (sesizeaza valorile de referinta si tot ceea ce iese in afara valorilor este eliminat, pentru a ajunge la o sinusoida regulata) (aplatizarea neregularitatilor in cadrul fluxului audio). sau spectral: prin

3) Preluarea valorilor obtinute si constituirea unui flux unic de biti. COMPONENTE CARE FORMEAZA TIPUL MEDIA C. VIDEO 1. Tipuri de semnal si comparatii intre cele 2 tehnologii existente (analog, digital) 2. Conversia video analog video digital necomprimat 3. Accesul direct la secventele video 4. Compresia video 1. Tipuri de semnal si comparatii intre cele 2 tehnologii existente (analog, digital) Video este elementul cel mai spectaculos al tipului media, cel care reda cel mai fidel realitatea. Problema: pe piata erau consacrate diverse tehnologii care lucrau in domeniul video analog. Conversia in digital a trebuit sa tina seama de toate aceste standarde in partea de analog. S-a ajuns la un anumit standard, dar continua sa apara noi si noi probleme, dar si solutii, cat mai diverse. Si conversia, si reprezentarea sunt nestandardizate. Lucrurile inca sunt in discutie si sunt multe cai de perfectionare a modului de reprezentare si prelucrare a componentei video. Tipuri de reprezentare a semnalului video Sunt 3 tipuri consacrate de reprezentare a semnalului video: a) semnal video pe componente: Component Video b) semnal video compozit: Composite video, denumit si CVBS (Composite Video Blanking and Sync) c) semnal video SVideo: Separate video, abreviat S-Video si numit si Y/C a) semnal video pe componente: Component Video Pentru fiecare componenta primara a semnalului video, tranferarea se face pe cate o unda purtatoare separata. Transferarea se face pentru fiecare componenta in parte. Avantaje: trimitandu-se valorile pe unde separate, receptorul primeste corect valorile Dezavantaje: pot aparea probleme la sincronizarea elementelor de semnal: sa se primeasca defazat, astfel incat compuse sa nu mai formeze punctul initial. b) semnal video compozit: Composite video Este cel mai folosit. Toate cele 3 elemente primare care formeaza semnalul video sunt impachetate si transmise pe o singura unda de semnal nu mai pot aparea probleme de defazare.

Dezavantaje: elementele pot intercala (interferenta de semnal) la receptie sa nu pot spune cat inseamna fiecare componenta, sa nu pot separa precis cat revine fiecarei componente in parte. Elementele principale ale semnalului video analog: Y U V Y da componenta primara pentru luminanta UV reprezinta 2 componente pentru crominanta c) semnal video SVideo: SVideo Este o mixtura intre a) si b): foloseste o unda purtatoare pentru Y, iar cele 2 unde de crominanta U si V sunt impachetate pe o unda separata purtatoare de semnal. Comparatii intre cele 2 tehnologii (analog si digital): I) modul de redare a culorii Un element de comportament se refera si la modul cum se reda culoarea punctului (modul de redare a culorii) i) semnal video analog: punctul de pe ecran (culoarea punctului de pe ecran) se reda prin faptul ca acel punct este reprezentat de luminanta, respectiv crominanta (stralucire si culoare). ii) semnal video digital: punctul de pe monitor se reda printr-o combinatie de culori fundamentale ale spectrului RGB Componentele primare in cazul semnalului video digital: RGB II) modul de afisare a imaginii i) semnal video analog: imaginea este afisata folosindu-se asa-numitul baleiaj intretesut: imaginea este redata in felul urmator: intr-o prima etapa, sunt trasate liniile de scan pare, in pasul urmator trasandu-se si linii de scan impare. Imaginea apare dintr-o data, integral, si in pasul 2 se clarifica. Avantaj: necesita o rata de refresh mica. Rata de refresh = frecventa cu care se retransmite imaginea pe ecran. TV: ~50KHz monitoare: > 75KHz ii) semnal video digital: afisarea imaginii se face prin asa-numitul baleiaj progresiv: imaginea apare progresiv pe ecran, de calitate maxima de la inceput, trasandu-se linie dupa linie, incepand de sus, pana jos. Acest mod de afisare a imaginii necesita o rata de refresh mai mare. Cand se blocheaza un program: se traseaza o fereastra linie cu linie La TV: se traseaza doar bucatile care difera de la un cadru la altul. Desincronizare: cand pierde semnalul cablu Rezolutie: la semnalul video analog depinde de sistemul de TV (PAL, SECAM, etc); se da pe linii de scan. Numarul de linii utilizate pentru difuzarea imaginilor este diferit.

2. Conversia video analog video digital necomprimat Procesul de conversie video analog video digital necomprimat este asistat de un decodor care transforma/ converteste semnalul video compus in semnal video RGB, si de un scan convertor, care accelereaza semnalul video intretesut pentru a putea fi redat pe ecranul calculatorului. Acest proces de bazeaza pe esantionarea si cuantificarea semnalului. esantionare stabilirea valorilor de referinta cuantificare reprezentarea valorilor de referinta Procesul de esantionare se poate face plecand atat de la semnalul pe componente, cat si de la semnalul compozit. Majoritatea echipamentelor care realizeaza conversia utilizeaza formatul de codificare 4 22 YUV 422 Reprezinta niste proportii. La esantionarea semnalului, cand este preluat pe computer, se utilizeaza diverse frecvente de esantionare: crominanta: 6,75 frecventa de esantionare luminanta se esantioneaza la dublu: 13,5 frecventa de esantionare Luminanta de 2 ori mai mare decat crominanta se esantioneaza cu frecventa mai mare luminanta pentru ca se doreste sa se redea mai fidel luminanta si mai putin crominanta, pentru ca ochiul uman este mai sensibil la stralucire decat la culoare. Cand intri intr-o camera cu lumina stinsa, sesizezi mai intai intunericul, nu culorile. In cazul in care se realizeaza conversie video pornindu-se de la semnalul compozit, formatul mai des intalnit se numeste 4FSC 4 Frequency Scale Scale: scala de frecventa Rata de esantionare = 4 * frecventa cea mai inalta a semnalului video (frecventa = numarul de cicluri pe secunda). Cuantificarea se face in ambele cazuri pe 8 biti. Factori care influenteaza obtinerea unui semnal video de buna calitate din procesul de conversie: 1) fluxul de derulare a imaginilor: pentru o miscare naturala, trebuie sa fie cam 25 30 frame-uri pe secunda. Retina percepe permanent imagini; pe retina imaginea ramane o fractiune de secunda (echivalentul a 25 30 frame-uri/ secunda), timpul acesta fiind utilizat la partea de derulare a cadrelor. iarasi element de psihoperceptie 2) rezolutia de crominanta: depinde de numarul de culori utilizate la reprezentarea imaginilor din fluxul video. 3) rezolutia spatiala: modul de procesare a liniilor de scan si a liniilor individuale din care se compun imaginile.

4) calitatea secventei video analogica: daca ai un semnal video analog prost. nu ai cum sa obtii un semnal digital de buna calitate; input prost evident output prost. 3. Accesul direct la secventele video Se refera exclusiv la video digital. Player-ele video pot accesa direct o sursa de informatii din fluxul de imagini sau chiar un cadru fix acces direct la secventa video. Accesul direct presupune indexarea invariabila in timp a imaginilor fixe care compun, formeaza fluxul video. indexare = se atribuie un reper fiecarui cadru fix care compune secventa video acces direct = se bazeaza pe un proces de indexare a secventelor: se pun in corespondenta un element cu o entitate informationala. Exista 2 sisteme de reperaj: 1) sistemul de reperaj time code 2) sistemul de reperaj frame code 1) sistemul de reperaj time code foloseste ca reper timpul pentru indexare, adica asociaza fiecarui cadru fix un numar, reprezentand ora, minutul, secunda, milisecunda si numarul cadrului. Numarul acesta este codificat BCD (binary-coded decimal) si se memoreaza pe o pista audio paralela. BCD forma de reprezentare a valorilor din baza 10: fiecare cifra pe 1B BCD impachetat fiecare cifra pe 4B BCD despachetat Primul cadru are: 0, 0, 0, 0, 0 In Adobe Premiere: in timeline este un numar pentru fiecare cadru ? 2) sistemul de reperaj frame code este mai simplu; practic, pune in corespondenta fiecare cadru cu un numar natural in secventa crescatoare de la 0 la n. De fapt, numara cadrele individuale. Adobe Premiere: Timeline Window Options: optiune pentru schimbarea sistemului de reperaj. Vizibil altundeva: in video digital, fisierele de .sub Exista si functii API pentru procesarea secventelor video digital. ? Pot sa ii dau frame code si sa imi returneze time code-ul corespunzator. Cand se creeaza secventa video: 1) generator de time code: asociaza numerele, atunci se creeaza indexarea. Atribuie cadrelor numarul acela care reprezinta ora, minutul, secunda, milisecunda. 2) lector de time code.

4. Compresia video Algoritmii de compresie speculeaza o anumita redundanta a informatiei. Specific pentru video: redundanta spatiala: redundanta care se manifesta intracadru (in interiorul unui cadru) (2 pixeli invecinati) redundanta temporala: se modifica intre 2 cadre consecutive 2 imagini fixe consecutive au multi pixeli de aceeasi culoare. Se elimina redundanta prin compresia video. Fluxul compresiei/ decompresiei in procesul de numerizare a semnalului video ca standard pentru compresia video: algoritmul mpeg de compresie video audio se comprima intrun fel fluxul de imagini, in altul cel de audio, pastrand o corelatie intre cele 2. Algoritmul mpeg a fost lansat in mai multe variante, raspunzand in acest fel diferitelor cerinte de utilizare a secventei video. Variantele au terminatii numerice: mpeg1, prima varianta; a urmarit compresia audio video sincrona a secventei mpeg2: standard de compresie prin care s-a urmarit obtinerea de video digital de calitatea transmisiilor TV. Este si formatul utilizat de DVD-video. mpeg3: lansat pentru a fi utilizat de catre sisteme de TV digitale de inalta rezolutie mpeg4: pentru transmisii video prin internet (comprima si necesita bit-rate-uri mai mici, astfel incat sa nu incarce reteaua). Algoritmul mpeg este un algoritm hibrid (combina mai multe tehnici) de tip predictie transformare: analiza spectrala (prin functii de tip sinusoidal si surprinde repetabilitatea in secventa); codaj Huffman, pentru date; codaj predictiv, astfel incat unele cadre din flux sunt reconstituite prin predictie; codaj diferential, adica se pastreaza doar elementele de diferenta dintre cadre. Compresia este una de tip incremental, si anume: codecul se poate configura astfel incat utilizatorul poate indica intervalul de timp la care algoritmul isi constituie cadrul cheie (cadrul de referinta), urmand ca pe celelalte sa le genereze prin predictie. Pentru secventa dinamica, se impune un keyframe luat la un interval mai mic de timp. Video Compression Manager componenta Windows; transmiterea fluxului comprimat la distanta. Algoritmul este asimetric, timpul necesar comprimarii este semnificativ mai mare decat cel necesar decomprimarii. mpeg7, mpeg21: sunt standarde mai noi, dar nu in sensul de compresie, ci in sensul de a construi metadate pe secventele video, adnotari (pune in corespondenta secvente de tip text cu subsecvente video din film). Standardul html time: utilizez mpeg7 pentru vizualizarea secventelor adnotate in corelatie cu derularea secventei video;

secvente adnotate: comentarii de exemplu; clip cu prezentarea instructiunilor unui produs, etc.

MACROMEDIA DIRECTOR 1. Componente necesare dezvoltarii unui aplicatii multimedia in Director 2. Etapele de realizare a unui aplicatii 3. Tipuri de scripturi si modul de interceptare a mesajelor 4. Integrarea resurselor multimedia in aplicatii Director 5. Elemente de programare in Lingo 6. Lingo 3D multimedia programming 1. Componente necesare dezvoltarii unui aplicatii multimedia in Director Aceste componente sunt puse la dispozitie de produs prin intermediul unor ferestre de vizualizare componentele au drept corespondent in cadrul softului de utilizare ferestre de utilizare: 1. Componenta CAST fereastra impartita in mai multe ferestre de vizualizare prin intermediul ei sunt vizualizati actorii care participa la aplicatia multimedia respectiva stocheaza actorii, care ocupa un rol foarte important in cadrul Cast-ului. Actorii se identifica in mod unic. Sunt inclusi in Cast in 2 moduri: a) provin din afara mediului de dezvoltare Director Actorii proveniti din afara produsului pot fi: i) inclusi in componenta Cast La Property Inspector Member nu va avea Filename ii) referiti prin componenta Cast Actorul nu este inclus in aplicatie, este doar referit (~ pointer la actor) La Property Inspector Member Filename: se gaseste calea catre resursa Consecinta: dimensiunea aplicatiei va fi mai mica. Trebuie sa am grija cand mut aplicatia pe alt computer, sa mut si resursele, si sa modific calea catre ele. b) sunt creati cu ajutorul altor componente ale produsului Director Exemple: a) In Cast Cast View Style (pentru a vedea membri in Cast intr-un mod asemanator cu Thumbnails din Windows) Click dreapta pe un membru cast neocupat Import: Look In

File Name Files of Type Media: Standard Import Link to External File: Color Depth Stage 24 bits Include Original Data for Editing Import PICT File as PICT b) Select membru Cast neocupat Window Paint: desenez. Inchid Paint Se stocheaza intr-un membru Cast de sine statator 2. Componenta STAGE Este utila pentru ca furnizeaza spatiul client de lucru. Este fereastra in care se vizualizeaza aplicatia multimedia. Proprietati: pot modifica dimensiunea ferestrei (dimensiunile predefinite sau date de mine), culoarea de fundal, etc. 3. Componenta SCORE Ne este pusa la dispozitie prin intermediul unei ferestre organizata matriceal (in linii, respectiv coloane numerotate). Pe linii/ canale: sprite-uri, utile pentru a instantia actorii Pe coloane: frame-uri, care furnizeaza/ definesc axa timpului. Pot dimensiona instantierea unui actor pe cate frame-uri vreau (select ultimul frame al sprite-ului, trag de el).

Dunga rosie verticala: joaca rol de cursor al Score-ului, indica frame-ul care se vizualizeaza pe Stage la un moment dat. Dunga alba, neincadrata in frame-uri este utilizata pentru a stabili etichete, marker-e pentru frame-uri (acele frame-uri se vor putea referi si prin etichete, nu doar prin numarul de ordine pe care il au). Pe langa canalele obisnuite, pe care putem instantia actorii, Score-ul mai are si canalele cu destinatie speciala, care se refera la ceva bine definit. Canalele cu destinatie speciala: a) canalul 1: canalul de tempo (cel cu un ceas pe post de icon) Prin intermediul acestui canal dezvoltatorul de aplicatii poate stabili viteza de afisare a cadrelor. b) canalul 2: canalul paletei de culori

Este utilizat pentru a modifica paleta de culori. c) canalul 3: cel cu clepsidra rasturnata Este folosit pentru a asocia efecte de tranzitie intre frame-uri. d) canalele 4 si 5: cele cu difuzor Sunt canalele unde se pot instantia actori de tip sunet. Sunetele nu se pot pune pe canalele obisnuite. e) canalul 6: cu o foaie de hartie Este canalul prin intermediul caruia se asociaza scripturi frame-urilor. Script = secventa de cod care da o anumita functionalitate aplicatiei. 4. Componenta TOOLS Pune la dispozitia utilizatorului obiecte grafice, controale (check box, radio button), etichete (text sub forma de etichete). 5. Componenta CONTROL PANEL Window Control Panel Prin intermediul ei se comuta din starea de constructie (modul in care elaborez aplicatia) in starea de executie (starea in care rulez aplicatia) si invers. Este sub forma unei ferestre de sine statatoare (Window Control Panel), continand butoane pentru aducerea cursorului pe primul frame (Rewind), sau sa se opreasca dupa ce s-a vizualizat si ultimul cadru, sau de loop playback (sa execute aplicatia intruna). Aceste butoane apar si in josul ferestrei Stage sau pe Toolbar-ul aplicatiei. Tempo: 30 frames/second viteza de derulare a cadrelor. 6. Componenta LINGO Este pusa la dispozitia utilizatorului prin intermediul unui editor de texte, cu ajutorul caruia sunt scrise scripturile. Select frame click dreapta Frame Script Are si help contextual: comenzile in ordine alfabetica Lingo pe categorii de operatii Lingo 3D: alfabetic pe categorii de operatii

2. Etapele de realizare a unui aplicatii multimedia in Director Ideea este ca pentru orice aplicatie in Director, in esenta, trebuiesc urmati niste pasi: 1. Stabilirea actorilor care participa la realizarea aplicatiei multimedia: popularea componentei Cast import din afara mediului creare prin intermediul produsului: butoane, paint, etc

2. Secventializarea actorilor utilizand componenta Score, astfel incat dezvoltatorul stabileste momentul cand un actor va fi vizualizat pe scena, durata de persistenta a actorului pe scena, ce actori se vad simultan pe scena la un moment dat al prezentarii. drag & drop pe Score din Cast: automat il pune pe scena, in Stage drag & drop direct in Stage din Cast: il pune automat si pe Score De obicei il secventializeaza din locul in care se afla cursorul Score-ului, pe 30 de frameuri (numarul implicit de frame-uri). 3. Se refera la stabilirea interactiunii cu utilizatorul definesc comportamentul aplicatiei in raport cu interactiunea cu utilizatorul utilizarea in mod special a componentei Lingo Se folosesc cu precadere, in fiecare pas, componentele: 1. Cast; 2. Score; 3. Lingo 4. Se refera la deployment-ul/ Publishing-ul aplicatiei: cum furnizez aplicatia celui care o va utiliza a) Save salvez sursa: consta intr-un fisier cu extensia numeAplicatie.dir b) Publish Settings Formats: i) Projector executabilul respectivei aplicatii: numeAplicatie.exe Ruleaza de sine statator. Este destul de mare. Pot sa il comprim: Publish Settings Projector Player type: nu Standard (necomprimat), ci Shockwave. Acum va avea o dimensiune mult mai mica. Shockwave: comprima aplicatia intr-un format Shockwave Movie. Calculatorul pe care rulez aplicatia trebuie sa aiba instalat Shockwave Movie Player (DivX). ii) HTML numeAplicatie.htm Daca export HTML, obligatoriu trebuie sa ii dau si: iii) Shockwave File (DCR) numeAplicatie.dcr Html face doar legatura intre dcr si Shockwave Player. exe (projector) folosit ca aplicatie desktop Dreamweaver: editor de site-uri. Pui Shockwave intr-o pagina cu mai multe elemente. Insert Media Shockwave; pune .dcr Pot folosi si alte moduri de a exporta: File Export: Export: Current Frame Selected Frames All Frames Frame Range Include: Every Frame One in Every Frames with Markers Frames with Artwork Changes Format:

DIB File Sequence (.BMP) Video for Windows (.AVI) pot scoate dintr-o prezentare: direct frame-urile secvente de frame-uri: sub forma de secventa de bitmap-uri ca Video for Windows (avi) Director se comporta ca un fisier Premiere, se pierde interactiunea cu utilizatorul; Vreau sa las in executie aplicatia, sa nu se opreasca rularea cand ajunge la ultimul cadru. Pe canalul special pentru scripturi, select ultimul frame: click dreapta Frame Script Lingo Alphabetical Lingo go _movie.go(frameNameOrNum , <movieName>) on exitFrame me _movie.go(the frame) end exitFrame mesaje preluate la nivel de frame-uri _movie obiectul aplicatie the frame cicleaza pe ultimul frame; ramane in executie la acesta; Acum, la play, va ramane in executie pe ultimul frame. In canalul pentru sprite-uri, acum va aparea la acest frame un numar (de exemplu 3), care corespunde membrului din Cast in care a fost salvat scriptul creat. In Tools select Radio Button desenez pe Stage; nume: buton Click pe buton. In Property Inspector Behavior: nu are niciunul atasat momentan. Varianta 1: Select + ( add behavior): pot sa adaug behavior 3 (cel de pe ultimul frame) sau pot adauga unul nou: New Behavior Varianta 2: Select buton. Window Behavior Inspector + Behavior Name: behav1 Expandez fereastra: face legatura intre eveniment si actiuni Event + : MouseUp Action +: New Action alert "ai apasat butonul" Deja butonul are acum scriptul atasat, si inserat si in Cast. Select membrul Cast cu numele behav1 arata codul generat: on mouseUp me alert "ai apasat butonul" end

3. Tipuri de scripturi si modul de interceptare a mesajelor In Director exista mai multe tipologii de scripturi: 1) scripturi de tip Behavior Caracteristici: a) cui se asociaza? Se asociaza obiectelor/ actorilor instantiati (instantelor actorilor) din Score, respectiv frame-urilor. i) select instanta din Score, sau obiectul din Stage: click dreapta Script on mouseUp me end ii) select frame: click dreapta Frame Script on exitFrame me end b) aceste scripturi se stocheaza ca membri Cast independenti. c) utilizatorul poate distinge tipul de script prin iconita asociata membrului din Cast Behavior Script: rotita portocalie pe post de icon in Cast 2) scripturi de tip Movie/ Movie Script a) este asociat aplicatiei in ansamblul ei select membru Cast neocupat, de obicei primul gol; Window Script imi sugereaza sa scriu script de tip Behavior Property Inspector Script Type: Movie b) se stocheaza ca membru independent in Cast c) Movie Script: iconul este un papirus cu d rond (simbolul Director) Este util cand descriu comportamentul aplicatiei in ansamblul ei (sa raspund la mesaje specifice aplicatiei, de tipul start movie, stop movie), sau cand vreau sa definesc metode pe care le pot invoca de la orice obiect sau din scripturile altor obiecte. Este echivalentul functiilor globale din C. on startMovie alert "start aplicatie" end Daca incep aplicatia de la un anumit frame, nu de la primul, tot imi va afisa: start aplicatie Faptul ca startez aplicatia declanseaza aparitia mesajului, nu numarul frame-ului de la care incepe. Daca vreau sa mai inserez ceva in fata a ceea ce am acum in Score: select tot de pe Score, mut mai in spate. Daca as pune cod doar pe primul frame (on enterFrame), ar trebui sa preiau codul, si sa il mut pe noua pozitie a fostului prim frame. 3) Cast Member Script (script atasat membrului Cast) inserez buton nou, de tip Field; numele: text_script select membru Cast: click dreapta Cast Member Script

on mouseUp alert "buton apasat" end Acest tip de script este singurul care nu apare ca membru cast independent. Imi dau seama ca membrul Cast are un Cast Member Script atasat daca in Cast, in partea stanga a membrului, apare icon-ul de script, si anume un papirus. membru Cast de tip buton Field, cu script atasat Diferenta dintre cele doua butoane (buton si text_script): pentru buton, doar instantei i-a fost atasat scriptul; daca vreau sa il mai inserez odata in aplicatie, altundeva, va trebui sa iau cu drag&drop scriptul din Cast si sa i-l atasez; Scriptul de tip behavior a fost asociat strict acelei instante, o a doua instanta a butonului, peste care nu am pus scriptul din Cast, nu va mai face nimic la apasarea pe buton; text_script are deja scriptul atasat; Cast Member Script este atasat membrului din Cast, o alta instanta a acestui buton va avea aceleasi functionalitati ca prima. Este comportament pentru membru Cast, la orice aparitie isi preia si comportamentul. Analogia cu clasele din C++: Behavior Script este ca o metoda obisnuita Cast Member Script este ca o metoda statica, aceeasi pentru pentru toata clasa, pentru toate instantele; La crearea scriptului asociat membrului Cast nu am mai pus me (echivalentul lui this din poo). Daca vreau sa mut toata prezentarea cateva cadre am mai multe variante: a) selectez tot de pe Score, mut la destinatie; drag&drop din Cast scriptul de ultim cadru pe noul ultim cadru (on exitFrame me go the frame end) b) ii pot da un nume simbolic frame-ului, pun marker; cand mut sprite-urile, mut doar marker-ul, nu mai modific codul deja scris. Daca vreau ca la apasarea pe un buton, sa sara la o alta zona a aplicatiei, la un alt frame: a) sar dandu-i numarul frame-ului, ca pe o constanta; on mouseUp me _movie.go(5) end Daca shiftez aplicatia pe Score, va trebui sa modific scriptul si sa ii dau noul numar al cadrului. b) ii pun frame-ului un Marker. Cand mut aplicatia, doar mut Markerul, nu mai modific codul. Fie scena2 numele frame-ului la care vreau sa merg prin apasarea butonului. on mouseUp me _movie.go("scena2") end

4) Parent Script (parent ~ clasei din poo) Acest script nu se asociaza niciunul obiect. Scopul sau este de a defini propriile noastre clase de utilizator. Se alege un membru Cast neocupat: Window Script Property Inspector Script Type: Parent Scriu eu ce vreau, nu apare nimic predefinit (on exitFrame, etc). on mouseUp me sprite(1).blend = 20 end Si acest tip de script se stocheaza intr-un membru Cast de sine statator. Are si o iconita specifica (un papirus). In C standard: structura fundamentala de organizare este functia, nu pot scrie cod in afara functiei. Structura fundamentala in Lingo handler-ul (entitatea in care scriu cod): on end De obicei este folosit pentru raspuns la mesaje. Un script poate contine mai multe handlere. De retinut: aspectul dual de a scrie: a) forma obiectuala: folosim obiect.metoda on mouseUp me sprite(1).blend = 20 proprietate a canalului (blend-ul) end b) forma descriptiva: forma mai naturala on mouseUp me set the blend of sprite 1 to 20 end
3. Tipuri de scripturi si modul de interceptare a mesajelor Ordinea in care sunt interceptate mesajele de catre obiecte in Director Pot raspunde la mesaje prin scripturi, atasate diverselor obiecte. Cum sunt mesajele receptionate de catre scripturi? Regulile teoretice: 1) mesajul este interceptat de obiectul/ actorul instantiat in componenta Score. Prima data, mesajul cauta sa fie tratat in scriptul obiectului instantiat in Score. Daca nu, se aplica pasul 2. 2) se cauta la scriptul asociat membrului Cast care contine actorul respectiv Daca nu se gaseste nici aici, se merge in pasul 3. 3) se cauta la scriptul frame-ului curent 4) se mai cauta intr-un singur loc: in movie script (scriptul asociat obiectului aplicatie). Pun pe scena o elipsa si un dreptunghi pline (Tools: Filled Ellipse, Filled Rectangle). Pe ultimul frame: scriptul de oprire a aplicatiei

on exitFrame me _movie.go(the frame) end

Inserez un buton Field, si il numesc culoare. Elipsa este pe sprite-ul 1, ca sa o refer folosesc sprite(1) Ii asignez butonului urmatorul behavior script (la apasare, sa coloreze elipsa in rosu):
on mouseUp me sprite(1).color = rgb(255,0,0) end

mesajul a fost tratat de scriptul asociat instantei obiectului buton Culori: rgb(0,0,0) = negru, rgb(255,255,255) = alb Daca in Cast, la obiectul buton, dau Cast Member Script (sa se coloreze acum si dreptunghiul, in albastru, la apasarea butonului):
on mouseUp sprite(2).color = rgb(0,0,255) end

Se va observa ca se executa numai colorarea elipsei, nu si a dreptunghiului. Cine a tratat primul mesaj, l-a inghit, nu l-a mai dat pe ierarhie. Ca sa faca acest lucru (sa il trimita pe ierarhie), se foloseste comanda pass
on mouseUp me sprite(1).color = rgb(255,0,0) pass end

Daca dau click pe buton acum, se vor colora atat elipsa, cat si dreptunghiul. Comanda pass a facut ca obiectul sa dea mouseUp mai departe pe ierarhie. Daca nu este dat mai departe mesajul, cel care il trateaza il inghite. ! Ideea este sa raspunda la acelasi mesaj pentru a putea vorbi despre aceste lucruri (aici, aveam la ambele evenimentul de mouseUp). Realizarea comunicarii in Director prin mesaje de utilizator (nestandard) Pana acum, am folosit mesaje predefinite, de sistem: mouseUp, exitFrame, etc. Vreau ca atunci cand dau click pe buton, sa trimit elipsei mesajul, sa il preia ea si sa execute ce este in acel mesaj.
on mouseUp me sendSprite(numarul spriteului,#numele mesajului) end

numarul sprite-ului: mesajul este trimis obiectului care se afla pe canalul respectiv #numele mesajului: prin data de tip simbol La buton, in behavior script, voi avea:
on mouseUp me sendSprite(1,#coloreaza) end

La elipsa, tot in behavior script (atasat instantei, nu membrului Cast):


on coloreaza me sprite(1).color = rgb(255,0,0) end

am trimis mesajul obiectului, si acesta a raspuns la mesaj. Pentru generalitate: refer sprite-ul simbolic, nu prin numar:
on coloreaza me

sprite(me.spriteNum).color = rgb(255,0,0) end

me.spriteNum proprietate a lui me (a obiectului curent); indica numarul sprite-ului pe care se afla obiectul referit de me Avantaj: pot atribui scriptul si altui obiect, cu restrictia ca obiectul caruia ii atasez scriptul sa aiba proprietatea color. Drag&drop acest script din Cast si pus peste dreptunghi in Stage. Dar acum trebuie sa ii trimit si lui mesajul, altfel nu va face nimic. La buton, modific scriptul:
on mouseUp me sendSprite(1,#coloreaza) sendSprite(2,#coloreaza) end

Sau pot trimite mesajul tuturor obiectelor instantiate:


on mouseUp me sendAllSprites(#coloreaza) end

Vor primi mesajul: elipsa, dreptunghiul si butonul (toate care sunt pe scena), numai ca butonul nu are proprietatea color, si nu va raspunde la acest mesaj. Sau ii pot da argumente:
on mouseUp me sendAllSprites(#coloreaza, 0,255,0) end

Cand lucrez cu parametri suplimentari care insotesc mesajul: me este pe prima pozitie, apoi lista de parametri. Altfel, in prima valoare cauta ca si cum ar fi me. As putea sa furnizez culoarea prin variabile globale: sa pot schimba culoarea din scriptul care si trimite mesajul. Cand lucrez cu variabile globale, trebuie sa le declar ca globale. La scriptul butonului, behavior script:
on mouseUp me global xx, yy, zz xx = 0 yy = 0 zz = 255 sendAllSprites(#coloreaza) end

La scriptul behavior atasat celor 2 obiecte, modific (trebuie sa declar variabilele):


on coloreaza me global xx, yy, zz sprite(me.spriteNum).color = rgb(xx,yy,zz) end

! Variabilele glabale trebuiesc declarate in scripturile in care se folosesc. Dar mai intai trebuie sa se treaca prin scriptul care le initializeaza, si abia apoi sa ajunga mesajul care le contine la cel care le utilizeaza. 4. Integrarea resurselor multimedia in aplicatii Director A. Integrarea imaginilor Utilizarea imaginilor: 1) le pot crea cu componenta Paint 2) le pot importa: Click dreapta pe membru Cast neocupat Import

Implicit, ii schimba numele membrului Cast, cu numele imaginii importate (numele fisierului din care provine actorul importat). Membrul va putea fi accesat acum si prin numar, si prin nume. Proprietati: a) referite prin sprite ale instantei obiectului, cele pe care le asociez obiectului de pe scena b) ale membrului Cast care stocheaza actorul a) Width, Height. Aceleasi proprietati sunt si la membrul Cast, dar acestea sunt valorile originale, raman nemodificate, chiar daca modific proprietatile instantei. Fac un buton Field, care la apasare sa determine redimensionarea unui imagini importate, la valorile initiale ale Width si Height.
on mouseUp me sprite(2).width = member("sinaia 306").width sprite(2).height = member("sinaia 306").height end

Daca vreau sa fac un zoom pe imagine: modific proprietatile de width si height ale sprite-ului:
on mouseUp me --sprite(2).width = member("sinaia 306").width --sprite(2).height = member("sinaia 306").height sprite(2).width = sprite(2).width * 1.2 sprite(2).height = sprite(2).height * 1.2 end

Mai pot controla location-ul instantei. De exemplu, pun o zona unde am butoane de navigare, ca pentru harti: buton de stanga, dreapta, sus, jos. Conteaza locul ocupat de obiect pe Score (ordinea sprite-urilor). Imi convine imaginea sa fie la cel mai jos nivel, apoi sa vina spatiul pentru butoane (un dreptunghi de exemplu), apoi sa vina butoanele (adica butoanele sa fie pe primele sprite-uri de sus in jos, apoi dreptunghiul, apoi imaginea). Altfel, butoanele vor fi acoperite de imagine daca nu este setata ca transparenta, si nu vor mai putea fi actionate. Modific location-ul: locH, locV. Intrebarea este: ce ia ca locatie? Registration Point regPoint: select membru Score sau Stage Property Inspector Member: regPoint Horizontal (X) reg Point Vertical (Y) In functie de obiecte, regPoint este implicit pus intr-un anumit loc. Vreau sa vizualizez membrul Cast neinstantiat la momentul executiei. Creez buton Field nou: vizualizare Varianta 1: Se realizeaza copierea pixelilor din imaginea sursa in imaginea destinatie. Restrictia este ca sursa sa fie obiect cu proprietati de imagine, si destinatia la fel. Obiectul scena se identifica prin: the stage Script behavior atasat butonului vizualizare: on mouseUp me (the stage).image.copyPixels(member(1).image, rect(0,0,150,150), member(1).image.rect) end copyPixels metoda a unui obiect de tip image

rect(0,0,150,150) obiect noname; incepe din coltul stanga sus (x = 0, y = 0), si are lungime si inaltime de 150. rect face stretch pe rect-ul destinatie member(1).image.rect afiseaza toata imaginea. Pentru afisare cu zoom: the stage).image.copyPixels(member(1).image,rect(0,0,150,150),member(1).image.rect(0,0,member(1).image. rect.height-20,member(1).image.rect.width-20)) Varianta 2: Sa import membrul Cast care contine imaginea nu prin includere, ci prin legare (import link to external file). Daca import prin link to external file, la Property Inspector, la file name, voi avea calea catre fisier. La scriptul behavior de la butonul vizualizare: on mouseUp me member(2).filename = "F:\Facultate\anul III\semestrul I\site mm\sinaia 310.jpg" end Peste imaginea importata prin includere, care era pe membrul Cast 2, a incarcat imaginea de la calea specificata. A luat regPoint-ul de la prima imagine, si acum il are altundeva. Daca nu, fac substituirea la nivel de file name, si apoi copy pixels si construiest un rect la dimensiunea imaginii, si la pozitiile originalului. ? B. Integrarea secventelor video 1. Modul de control a secventelor video Click dreapta pe membru Cast neocupat Import: Link to External File Aleg player-ul: recomandabil Quick Time Il include in Cast. Dublu click pe membru in Cast: il deschide in fereastra de vizualizare. Drag&drop pe scena, redimensionare. In continuarea instantei pe sprite instantiez un obiect de tip text: sfarsit La ultimul frame am scriptul:
on exitFrame me go the frame end

2. Elemente de sincronizare a secventelor video cu celelalte elemente din prezentare a) Varianta vizuala: utilizarea cue point-urilor (puncte de sincronizare) Pun un reper astfel incat sa stea acolo pana se termina de derulat o data de tip continuu. pe canalul tempo (canalul folosit pentru instantierea unui date continue): frame-ul de sfarsit al video; click dreapta Tempo Wait for Cue Point Acum, la play, aplicatia va sta la frame-ul acela pana cand se termina secventa video. b) Varianta Lingo La ultimul frame al secventei video pun marker: sfarsit. Apoi in Frame Script:
on exitFrame me if sprite(1).movietime < member(9).duration then go the frame

else go "sfarsit" end if end

cat timp momentul curent este mai mic decat durata secventei video, aplicatia sa ramana la frame-ul respectiv movietime: proprietate a sprite-ului; indica momentul la care s-a ajuns in derulare duration: durata secventei; proprietate a membrului Mesajul exitFrame are rol de structura repetitiva de control, este executat ciclic nu ii mai dau eu inca nu ciclu, ii pun doar conditia. Unitatea de timp in Director: tick-ul. 1 secunda = 60 tick Daca vreau sa se opreasca dupa 10 secunde: duration = 10*60 B. Integrarea secventelor video Comenzi pentru derularea secventei video Insert movie in aplicatie: Click dreapta pe membru Cast neocupat Import: Link to External File Aleg player-ul: recomandabil Quick Time Il include in Cast. Dublu click pe membru in Cast: il deschide in fereastra de vizualizare. Drag&drop pe scena, redimensionare. Vreau sa inserez butoane pentru cotrolul secventei video. Biblioteca de componente si controale: Library Palette Window Library Palette: Behavior Navigation Hold on Current Frame drag&drop peste ultimul frame Acesta este un script deja creat, care arata in felul urmator:
-- DESCRIPTION on getBehaviorDescription me return \ "HOLD ON CURRENT FRAME" & RETURN & RETURN & \ "Drop this behavior into the Script Channel of the Score or onto the Stage in order to keep the playback head in the current frame." & RETURN & RETURN & \ "PARAMETERS: None" end getBehaviorDescription on getBehaviorTooltip me return \ "Frame behavior. " & \ "Holds the playback head still." end getBehaviorTooltip -- HISTORY --- 3 November, written for the D7 Behaviors Palette by James Newton -- 5 January 2000: updated to D8 <km> on exitFrame me

go the frame end exitFrame on isOKToAttach (me, aSpriteType, aSpriteNum) tIsOk = 0 if aSpriteType = #script then tIsOK = 1 end if return(tIsOK) end on

Inserez 3 butoane de tip Push Button: play, pause, stop. Prima data: selectez membrul video, Property Inspector List View Mode Windows Media bifez pauseAtStart (pauseAtStart = true) pentru a nu mai rula secventa video cand se porneste aplicatia Behavior script pentru butoane: 1) play
on mouseUp me sprite(1).movieRate = 1 end

2)pause
on mouseUp me sprite(1).movieRate = 0 end

3) stop
on mouseUp me sprite(1).movieRate = 0 script(1).movieTime = 0 end

movieRate = 1 vizualizare la viteza normala movieRate = 0 pentru pauza movieTime = 0 il duc pe primul frame al secventei video C. Utilizarea secventelor audio in aplicatii Director Actorul de tip sunet se poate instantia numai pe canalele speciale pentru secvente audio (cele 2 cu icon de difuzor). Are proprietati ca: duration, sample rate, sample size (pe cati biti memoreaza esantionul), loop. Secventa audio in aplicatie Insert sound in aplicatie: Click dreapta pe membru Cast neocupat Import: D:\Cati\muzica\C copiate\Red Hot Chili Peppers\1999 - Californication\Californication.mp3 Link to External File Drag&drop pe unul din cele 2 canale de sunet. Fie pe canalul 1, care se refera prin sound(1) Inserez 3 butoane de tip Push Button pentru controlul secventei audio: play, pause, stop. Behavior script pentru butoane: 1) play
on mouseUp me sound(1).play(member("Californication")) end

2) pause

on mouseUp me sound(1).pause() end

3) stop
on mouseUp me sound(1).stop() end

Derularea secventei audio direct din fisier (fara a include in Cast referinta catre acel obiect) Insert buton Field: play din fisier Script:
on mouseUp me sound(1).playFile("D:\Cati\muzica\C copiate\Savage Garden\Savage Garden To the Moon And Back.mp3") end

Actorul de tip audio se refera pe canalul special de sunet, sub forma sound(1) sau sound(2). Crearea unei cozi de secvente audio (crearea unui actor de tip sunet format din mai multi actori de tip sunet independenti) secventa audio creata prin concatenare coada de sunet: merge pe ideea FIFO Este utila la manipularea unitara a actorilor independenti de tip sunet. Import secvente independente, ca actori in Cast: ?? Click dreapta pe membru Cast neocupat Import: D:\Cati\muzica\dc++\diverse\Flipside - Happy birthday.mp3 Link to External File Drag&drop pe canalul 1, in continuarea primului fisier de tip audio. Pe primul frame, frame script-ul:
on enterFrame me sound(1).queue(member("Californication")) sound(1).queue(member("Flipside - Happy birthday")) end

D.Lucrul cu resursele multimedia utilizand interfata MCI (Media Control Interface) folosind elemente ce tin de sistem, nu de Director Creez 2 butoane PushButton: mci_open, play_mci Script behavior asociat butoanelor: 1) mci_open
on mouseUp me mci "open C:\WINDOWS\Media\chimes.wav type waveaudio alias melodie" end

2) play_mci
on mouseUp me mci "play melodie" end

Prima data deschid, apoi ii dau play. Acum nu mai tine de Director, opresc aplicatia, dar sunetul continua, prin Director i-am transmis doar comanda de play. E. Animatii

Sunt mai multe tehnici de realizare a animatiilor in Director: I) Vizual 1) Tehnica filmului: a) la nivel vizual b) programatic: cu copypixels Tehnica filmului la nivel vizual Import in Cast o serie de imagini care, vizualizare in secventa, dau impresia de miscare. In Cast: select all (CTRL + A) Modify Cast to Time Va pune pe Stage 1 frame si va instantia cu un actor independent secventa de imagini. Va lasa implicit cate un frame pentru fiecare imagine. Avantaje: pot manipula secventa de imagini ca si cum ar fi un actor independent. Daca de exemplu maresc o imagine, aici se vor comporta ca un tot unitar, se maresc toate. Daca as fi instantiat fiecare membru, ar fi trebuit sa ii modific fiecaruia proprietatea respectiva. numarul de frame-uri per cadru individual este calculat si repartizat uniform, in functie de durata actorului. Implicit, dimensiunea actorului (numarul de frame-uri) = numarul de imagini inglobate in Cast to time Daca in Score trag de sprite-ul actorului, pentru a-i mari dimensiunea, se va recalcula numarul de frameuri pentru fiecare imagine, astfel incat sa fie acelasi pentru toate repartizare uniforma 2) Tehnica de asociere a unui cai de animatie obiectului Creez in paint un actor. Il pun pe scena. In Score, sprite-ul asociat acestuia incepe cu cerculet si se termina cu dreptunghi nu are asociata o cale de animatie. Daca trag de regPoint: in Score sprite-ul va incepe si se va termina cu cerculet are asociata acum o cale de animatie. Click dreapta pe un frame intermediar de pe sprite-ul actorului: Insert Keyframe. Pot modifica astfel traiectoria caii de animatie. Pot modifica si alte proprietati intr-un keyframe, dimensiunea de exemplu: mica in primul frame, apoi marita in primul keyframe secventa va fi marita progresiv astfel incat dimensiunea la care trebuie sa ajunga la momentul acelui keyframe este calculata pe pasi. Pot modifica calea de animatie. Punctele de pe Stage corespund numarul de frame-uri. Pot influenta miscarea dpdv al vitezei: intr-un keyframe, trag de calea de animatie si pot sa pun prima parte a punctelor, cele pana la keyframe, foarte apropiate unele de altele, si cele de dupa cadrul cheie mult mai departate, sau invers. In acest fel, prima parte se va derula mai repede decat a doua parte. Viteza se calculeaza in functie de distanta si de numarul de frame-uri utilizate pentru aceasta distanta. In biblioteca de comportamente si controale exista animatii deja realizate, la nivel de script. Window Library Palette Animation Automatic: Rotate Continuosly (time based) are comportament parametric (pot stabili eu niste valori). Cu parametrii impliciti, nu se vede nicio modificare, are Rotate once every 60 seconds, iar secventa mea nu dureaza.

Ii modific valorile: Rotate every 1 second, sau pot sa ii pot modifica unitatea de masura a timpului: Rotate every 20 ticks de exemplu. Scriptul este inserat in Cast, ca membru independent. Fiecare animatie de acest tip are un icon specific.

II) Programatic Vreau sa realizez un script cu o animatie prin schimbarea formei unui obiect, pornind de la coordonatele punctelor individuale ce formeaza acel obiect. trebuie sa pornesc de la o imagine vectoriala, nu merg bitmap-urile. Trebuie sa utilizez un obiect construit vectorial: Vreau sa construiesc capul unei pasari, care sa deschida si sa inchida ciocul. Window Vector Shape Tools Pen. Selectez anumite puncte, le pot modifica pozitia si unghiul. Selectez forma creata, ii pot da umplere in gradient de exemplu. In Property Inspector: se observa culorile: #FFFF99 si #99D4FF Vector VertexList: aici sunt memorate punctele individuale cu ajutorul carora am creat imaginea (sunt 7 in acest caz). Pe ultimul frame pun scriptul gasit la biblioteca de comportamente si controale: Window Library Palette Navigation Hold on Current Frame Creez un buton numit: inchide/ deschide Pe primul frame, script:
on enterFrame me global pinit, pfin, vb -- initializari vb = true vl = member(1).vertexList pinit = vl[1].vertex pfin = vl[6].vertex end

Scriptul atasat butonului:


on mouseUp me global pinit, pfin, vb -- sunt invocate variabilele vl = member(1).vertexList -- preiau imaginea asa cum este cand apas butonul if vb = true then vl[1] .vertex = pfin else vl[1].vertex = pinit end if member(1).vertexList = vl -- se redeseneaza obiectul vb = not vb end

Variabilele sunt contextuale: vb = true devine booleana; In functie de ce initializari fac, variabilele isi asuma un anumit tip.

Timer Realizarea animatiei prin stabilirea cuantei de timp la care sa faca aceasta operatie. Dezavantaje: aceste functii blocheaza aplicatia pe aceasta durata data (cuanta de timp). Nu mai pot interactiona in acest timp cu aplicatia. Windows: lucrul cu timer-ul. Vreau sa fac o actiune dupa ce trece o cuanta de timp. In modul multiprocessing se utilizeaza mesaje de timer (le trimit obiectelor, care le intercepteaza si executa ceva dupa un timp dat). In Director acest lucru este implementat: a) prin cuantificarea intervalului de timp, fara blocarea aplicatiei b) in sistem clasic, cu mesaje a) prin cuantificarea intervalului de timp Prima data trebuie sa initializez timer-ul. In primul frame:
on enterFrame me global pinit, pfin, vb vb = true vl = member(1).vertexList pinit = vl[1].vertex pfin = vl[6].vertex startTimer end

startTimer initializeaza o variabila care se numeste timer; este o variabila a obiectului aplicatie; La ultimul frame pun pe 0 variabila (aveam deja aici scriptul de Hold on Current Frame, il completez):
-- DESCRIPTION -on getBehaviorDescription me return \ "HOLD ON CURRENT FRAME" & RETURN & RETURN & \ "Drop this behavior into the Script Channel of the Score or onto the Stage in order to keep the playback head in the current frame." & RETURN & RETURN & \ "PARAMETERS: None" end getBehaviorDescription on getBehaviorTooltip me return \ "Frame behavior. " & \ "Holds the playback head still." end getBehaviorTooltip -- HISTORY --- 3 November, written for the D7 Behaviors Palette by James Newton -- 5 January 2000: updated to D8 <km> on exitFrame me go the frame if _movie.timer > (0.5*60) then global pinit, pfin, vb vl = member(1).vertexList if vb = true then -- pun codul care era la buton vl[1] .vertex = pfin

else vl[1].vertex = pinit end if member(1).vertexList = vl -- se redeseneaza obiectul vb = not vb startTimer end if end exitFrame on isOKToAttach (me, aSpriteType, aSpriteNum) tIsOk = 0 if aSpriteType = #script then tIsOK = 1 end if return(tIsOK) end on

b) in sistem clasic, cu mesaje este un mod mai inteligent La a), imi este greu sa controlez mai multe actiuni, fiecare cu cuanta sa de timp (daca au asa). Cu mesaje, creez mai multe obiecte de tip timer, si fiecaruia ii trimit un mesaj la o anumita cuanta de timp. Creez camp de text: eroare! Vreau sa ii imprim un efect de blinking. Pe ultimul frame: = script de go the frame.
on exitFrame me _movie.go(the frame) end

Creez un buton: blinking. Scriptul atasat:


on mouseUp me new TimeOut("ceas",500,#tmesaj) end

new se instantiaza un nou obiect de tip TimeOut, dandu-i numele ceas ca sa il pot referi 500 la ce interval de timp sa trimita mesajul; este dat in milisecunde #tmesaj mesajul pe care sa il trimita. Il furnizez prin simbol. La acest mesaj va raspunde un obiect. Nespecificandu-l, il va prelua aplicatia il preiau intr-un script de tip movie Window Script; Property Inspector Type: Movie Script
on tmesaj me sprite(1).visible = not sprite(1).visible end

Daca vreau sa transmit mesajul unui obiect anume, chiar obiectului care sufera actiunea: Scriptul asociat butonului:
on mouseUp me new TimeOut("ceas",500,#tmesaj,sprite(1)) end

sprite(1) cel caruia ii trimit mesajul Scriptul asociat obiectului (de data aceasta behavior script):
on tmesaj me sprite(1).visible = not sprite(1).visible end

Odata ce a fost instantiat, se refera cu: TimeOut(ceas).stop() TimeOut(ceas).delay(), etc

5. Elemente de programare Lingo 1. Variabile Sunt contextuale. Nu se declara in prealabil, ci tipul lor se deduce din contextul de initializare. tipul se deduce: din initializare din utilizarea operatorilor: numerici, pe siruri de caractere, etc Avem la dispozitie functii de conversie: string(), float() Aceste functii de conversie sunt dublate de functii care se termina in p (de la predicat): floatp() returneaza True sau False in functie de posibilitatea de a converti parametrul la tipul respectiv. Sunt folosite cand, de exemplu, introduc intr-un edit box un sir de caractere si vreau sa lucrez cu el ca fiind numeric, testez daca se poate converti validare pe tip. 2. Structuri de date in Lingo a) Liste liniare In esenta, lucreaza cu liste. Le asimileaza si vectorilor, o lista se poate manipula si ca si cum ar fi un vector, pentru ca are implementat operatorul de indexare.
on mouseUp me t = [] t[1] = 100 t[2] = 700 alert string(t.count) -- afiseaza 2 t.add(300) -- adauga un element in lista alert string(t.count) -- afiseaza 3 end

alert pentru afisare t.add(valoare) adauga un element in lista t.count numarul elementelor din lista string(t.count) conversie la string b) Liste de proprietati Ajuta sa declar valori in legatura cu proprietati: utilitatea ei este asemanatoare cu a unei structuri struct din C/ C++.
on mouseUp me t = [:] -- t este o lista de proprietati vida t = [#marca:101, #nume:"anonim", #salariu:1750] alert t.nume -- vizualizare t.salariu = 2000 -- modificare alert "persoana: "&t.nume&" are salariul "&string(t.salariu) end

& operatorul de concatenare

3) Constante EMPTY pentru sir vid RETURN pentru CR LF (enter) VOID testez daca variabila respectiva refera un continut valid de memorie sau nu TAB Exemplu: creez un field (actor de tip field); vreau sa introduc un sir de caractere pe linie.
on mouseUp member(5).text = "prima linie"&RETURN&"a doua linie" end

In field, pe scena, voi avea: prima linie a doua linie 4) Functii care utilizeaza parametri din lista de proprietati Cand dau click pe scena, vreau sa imi traseze o linie din coltul stanga sus al scenei pana la pozitia mouseului. Movie script (Window Script; Property Inspector Script Movie Script):
on mouseUp locInit = point(0,0) --punctul de coordonate 0,0 (the stage).image.draw(locInit,_mouse.mouseLoc, rgb(0,0,255),[#lineSize:3]) end

Pentru a trasa elemente grafice trebuie ca obiectul pe care trasez sa fie cu proprietati de imagine. La draw() dau 2 puncte si culoare. Poate trasa intre aceste doua puncte: fie o dreapta, fie o elipsa, fie un dreptunghi, etc. Aceste elemente sunt furnizate functiei printr-o lista de proprietati. De exemplu, daca vreau sa trasez linia cu alta grosime, pun parametrul suplimentar: [#lineSize:3] Pot schimba si tipul obiectului pe care il traseaza. rect in loc de line, etc. 5) Definirea functiilor de utilizator Vreau sa calculez media elementelor unui vector. In primul rand trebuie sa am puse undeva elementele creez un field, caruia ii bifez: Property Inspector Field Editable si Framing Scrolling. In timp ce aplicatia ruleaza, pot introduce valori in acest field. Pentru a putea apela functia de oriunde, o pun intr-un movie script:
on calcMedie v,n s = 0 repeat with i = 1 to n s = s + v[i] end repeat return float(s)/n end

Mai pun un buton field numit CalculeazaMedie si inca unul numit Rezultat. Secventa de apel pentru functie o pun in scriptul atasat butonului CalculeazaMedie:
on mouseUp me t = [] nrElem = member("EditBox").lineCount repeat with i = 1 to nrElem t[i] = member("EditBox").line[i].word[1] end repeat member("rezultat").text = string(calcMedie(t,nrElem)) end

La click pe butonul CalculeazaMedie, in field-ul Rezultat va aparea valoarea mediei. Acestea sunt functii de utilizator, dar trebuiesc corect privite, cele scrise la nivel de movie script sunt pentru aplicatie ca niste extensii de comportament, ale obiectului de tip movie. pot apela functia sub forma (se comporta ca o metoda a obiectului movie):
member("Rezultat").text = string(_movie.calcMedie(t,nrElem))

mediul este pur obiectual; nici functiile definite de utilizator nu sunt independente. 6) Definirea claselor de utilizator in Lingo utilizarea parent script-urilor Membrii in cadrul clasei se pot declara cu ajutorul cuvantului cheie property Constructorul clasei are numele predefinit new Pun pe scena un obiect de tip shape (elipsa, dreptunghi, etc) si un buton Mareste, care la apasare sa mareasca obiectul cu un procent dat. Prin intermediul proprietatilor ii dau pasul de crestere pentru latime si inaltime. Sa se mareasca, dar sa nu treaca de dimensiunea scenei (se mareste doar pana atinge dimensiunea maxima max, unde max+1 depaseste pe cel putin o latura dimensiunea scenei). Cum incapsulez in cadrul clasei resurse multimedia? Vreau aici obiectul grafic. Vreau sa pot folosi clasa in legatura cu obiecte grafice. Obiectul grafic sa incapsuleaza prin numarul canalului pe care se instantiaza. (Il refer prin intermediul clasei dandu-i numarul sprite-ului pe care se instantiaza.) Parent Script:
property deltaL,deltaH,latimeScena,inaltimeScena,sprNum on new me, fdeltaL,fdeltaH,flatimeScena,finaltimeScena,fsprNum deltaL = fdeltaL deltaH = fdeltaH latimeScena = flatimeScena inaltimeScena = finaltimeScena sprNum = fsprNum return me end on MaresteShape if(sprite(sprNum).locH + sprite(sprNum).width+deltaL<= latimeScena) \ and (sprite(sprNum).locV+sprite(sprNum).height+deltaH) then sprite(sprNum).width = sprite(sprNum).width+deltaL sprite(sprNum).height = sprite(sprNum).height+deltaH end if end -- functie de acces care returneaza cu cat se mareste pe latime on getPasL me return me.deltaL end

Lipseste numele clasei. In Director, numele clasei este dat de numele membrului Cast care contine scriptul parent. Ii dau numele Class Shape. Apelul functiilor, intr-un behavior script atasat obiectul grafic pe care vreau sa il modific:
on beginSprite me global obiect

latScena = _movie.stage.rect.right - _movie.stage.rect.left hScena = _movie.stage.rect.bottom - _movie.stage.rect.top obiect = script("Class Shape").new(10,15,latScena,hScena,me.spriteNum) end

Scriptul atasat butonului Mareste:


on mouseUp me global obiect obiect.MaresteShape() end

_movie.stage.rect.right

Scena este un obiect/ o proprietate a aplicatiei


Cast care contine Parent

rect: left right, top bottom


obiect = script("numeleClasei = numele membrului Script").new(10,15,latScena,hScena,me.spriteNum)

Sau in loc de 10, 15, ii pot da member.width * 0.2 de exemplu.


on MaresteShape ... end

Structures Lists
linearList.add(value) list.AddAt(position, value) lista1 = [:] -- using the Lingo property list operator lista1 = propList() -- using propList() with no parameters

Linear lists and property lists In your scripts, you may want to track and update lists of data, such as a series of names or the values assigned to a set of variables. Both Lingo and JavaScript syntax have access to linear lists and property lists. In a linear list, each element in the list is a single value. In a property list, each element in the list contains two values; the first value is a property name, and the second value is the value associated with that property. Because both Lingo and JavaScript syntax have access to linear and property lists, it is recommended that you use linear lists and property lists if values in your code are shared between Lingo and JavaScript syntax scripts. Creating linear lists

You create a linear list in one of the following ways: In Lingo, use either the top level list() function or the list operator ([ ]), using commas to separate items in the list. In JavaScript syntax, use the top level list() function, using commas to separate items in the list. The index into a linear list always starts with 1. When you use the top level list() function, you specify the lists elements as parameters of the function. This function is useful when you use a keyboard that does not provide square brackets. All of the following statements create a linear list of three names and assign it to a variable.
workerList = ["Bruno", "Heather", "Carlos"] -- using the Lingo list operator workerList = list("Bruno", "Heather", "Carlos") -- using list()

You can also create empty linear lists. The following statements create empty linear lists.
workerList = [] -- using the Lingo list operator workerList = list() -- using list() with no parameters

Creating property lists You create a property list in one of the following ways: In Lingo, use either the top level propList() function or the list operator ([:]). When using the list operator to create a property list, you can use a either a colon to designate name/value elements and commas to separate elements in the list, or commas to both designate name/value elements and to separate elements in the list. In JavaScript syntax, use the top level propList() function and insert commas to both designate name/value elements and to separate elements in the list. When you use the top level propList() function, you specify the property lists elements as parameters of the function. This function is useful when you use a keyboard that does not provide square brackets. Properties can appear more than once in a given property list. All of the following statements create a property list with four property names--left, top, right, and bottom--and their corresponding values.
sprite1Loc = [#left:100, #top:150, #right:300, #bottom:350] sprite1Loc = ["left",400, "top",550, "right",500, "bottom",750] sprite1Loc = propList("left",400, "top",550, "right",500, "bottom",750)

You can also create empty property lists. The following statements create empty property lists.
sprite1Loc = [:] -- using the Lingo property list operator sprite1Loc = propList() -- using propList() with no parameters

Setting and retrieving items in lists You can set and retrieve individual items in a list. The syntax differs for linear and property lists. To set a value in a linear list, do one of the following: Use the equals (=) operator. Use the setAt() method. The following statements illustrate defining the linear list workerList that contains one value, Heather, and then adds Carlos as the second value in the list.
workerList = ["Heather"] -- define a linear list workerList[2] = "Carlos" -- set the second value using the equal operator workerList.setAt(2, "Carlos") -- set the second value using setAt()

To retrieve a value in a linear list: Use the list variable followed by the number that indicates the values position in the list. Place square brackets around the number. Use the getAt() method.

The following statements create the linear list workerList, and then assign the second value in the list to the variable name2.
workerList = ["Bruno", "Heather", "Carlos"] -- define a linear list name2 = workerList[2] -- use bracketed access to retrieve "Heather" name2 = workerList.getAt(2) -- use getAt() to retrieve "Heather"

To set a value in a property list, do one of the following: Use the equals (=) operator. In Lingo only, use the setaProp() method. Use dot syntax. The following Lingo statement uses the equals operator to make sushi the new value associated with the property Bruno.
foodList = [:] -- define an empty property list foodList[#Bruno] = "sushi" -- associate sushi with Bruno

The following Lingo statement uses setaprop() to make sushi the new value associated with the property Bruno.
foodList = [:] -- define an empty property list foodList.setaProp(#Bruno, "sushi") -- use setaProp()

The following statements use dot syntax to set the value associated with Bruno from sushi to teriyaki.
foodList = [#Bruno:"sushi"] trace(foodList) -- displays foodList.Bruno = "teriyaki" trace(foodList) -- displays -- define a property list [#Bruno: "sushi"] -- use dot syntax to set the value of Bruno [#Bruno: "teriyaki"]

To retrieve a value in a property list, do one of the following: Use the list variable followed by the name of the property associated with the value. Place square brackets around the property. Use the getaProp() or getPropAt() methods. Use dot syntax. The following statements use bracketed access to retrieve the values associated with the properties breakfast and lunch.
-- define a property list foodList = [#breakfast:"Waffles", #lunch:"Tofu Burger"] trace(foodList[#breakfast]) -- displays "Waffles" trace(foodList[#lunch]) -- displays "Tofu Burger"

The following statements use getaProp() to retrieve the value associated with the property breakfast, and getPropAt() to retrieve the property at the second index position in the list.
-- define a property list foodList = [#breakfast:"Waffles", #lunch:"Tofu Burger"] trace(foodList.getaProp(#breakfast)) -- displays "Waffles" trace(foodList.getPropAt(2)) -- displays #lunch

The following statements use dot syntax to access the values associated with properties in a property list.
-- define a property list foodList = [#breakfast:"Waffles", #lunch:"Tofu Burger"] trace(foodList.breakfast) -- displays "Waffles"

Checking items in lists

You can determine the characteristics of a list and the number of items the list contains by using the following methods. To display the contents of a list, use the put() or trace() functions, passing the variable that contains the list as a parameter. To determine the number of items in a list, use the count() method (Lingo only) or the count property. To determine a lists type, use the ilk() method. To determine the maximum value in a list, use the max() method. To determine the minimum value in a list, use the min() function. To determine the position of a specific property, use the findPos, findPosNear, or getOne command. The following statements use count() and count to display the number of items in a list.
workerList = ["Bruno", "Heather", "Carlos"] -- define a linear list trace(workerList.count()) -- displays 3 trace(workerList.count) -- displays 3

The following statements use ilk() to determine a lists type.


x = ["1", "2", "3"] trace(x.ilk()) // returns #list

The following statements use max() and min() to determine the maximum and minimum values in a list.
workerList = ["Bruno", "Heather", "Carlos"] -- define a linear list trace(workerList.max()) -- displays "Heather" trace(workerList.min()) -- displays "Bruno"

The following statements use findPos to get the index position of a specified property in a property list.
-- define a property list foodList = [#breakfast:"Waffles", #lunch:"Tofu Burger"] trace(foodList.findPos(#lunch)) -- displays 2

Adding and deleting items in lists You can add or delete items in a list by using the following methods. To add an item at the end of a list, use the append() method. To add an item at its proper position in a sorted list, use the add() or addProp() methods. To add an item at a specific place in a linear list, use the addAt() method. To add an item at a specific position in a property list, use the addProp() method. To delete an item from a list, use the deleteAt(), deleteOne(), or deleteProp() methods. To replace an item in a list, use the setAt() or setaProp() methods. The following statements use append() to add an item to the end of a list.
workerList = ["Bruno", "Heather", "Carlos"] -- define a linear list workerList.append("David") trace(workerList) -- displays ["Bruno", "Heather", "Carlos", "David"]

The following statements use addProp() to add a property and an associated value to a property list.
-- define a property list foodList = [#breakfast:"Waffles", #lunch:"Tofu Burger"] foodList.addProp(#dinner, "Spaghetti") -- adds [#dinner: "Spaghetti"]

You do not have to explicitly remove lists. Lists are automatically removed when they are no longer referred to by any variable. Other types of objects must be removed explicitly, by setting variables that refer to them to VOID (Lingo) or null (JavaScript syntax). Copying lists Assigning a list to a variable and then assigning that variable to a second variable does not make a separate copy of the list. For example, the first statement below creates a list that contains the names of two continents, and assigns the list to the variable landList. The second statement assigns the same list to a new variable continentList. In the third statement, adding Australia to landList also automatically adds Australia to the list continentList. This happens because both variable names point to the same list object in memory. The same behavior occurs by using an array in JavaScript syntax. landList = ["Asia", "Africa"]
continentList = landList landList.add("Australia") -- this also adds "Australia" to continentList

To create a copy of a list that is independent of another list: Use the duplicate() method. For example, the following statements create a list and then make an independent copy of the list.
oldList = ["a", "b", "c"] newList = oldList.duplicate() -- makes an independent copy of oldList After newList is created, editing either oldList or newList has no effect on the other.

Sorting lists Lists are sorted in alphanumeric order, with numbers being sorted before strings. Strings are sorted according to their initial letters, regardless of how many characters they contain. Sorted lists perform slightly faster than unsorted lists. A linear list is sorted according to the values in the list. A property list is sorted according to the property names in the list or array. After the values in a linear or property list are sorted, they will remain sorted, even as values are added to or removed from the lists. To sort a list: Use the sort() method. For example, the following statements sort a nonsorted alphabetical list.
oldList = ["d", "a", "c", "b"] oldList.sort() -- results in ["a", "b", "c", "d"]

Creating multidimensional lists You can also create multidimensional lists that enable you to work with the values of more than one list at a time. In the following example, the first two statements create the separate linear lists list1 and list2. The third statement creates a multidimensional list and assigns it to mdList. To access the values in a multidimensional list, the fourth and fifth statements use brackets to access the values in the list; the first bracket provides access to a specified list, and the second bracket provides access to the value at a specified index position in the list.
list1 = list(5,10) list2 = list(15,20) mdList = list(list1, list2) trace(mdList[1][2]) -- displays 10 trace(mdList[2][1]) -- displays 15

Constants " (string)

Usage: " Description: String constant; when used before and after a string, quotation marks indicate that the string is a literal--not a variable, numerical value, or script element. Quotation marks must always surround literal names of cast members, casts, windows, and external files. Example: This statement uses quotation marks to indicate that the string "San Francisco" is a literal string, the name of a cast member:
put member("San Francisco").loaded

TAB Usage: -- Lingo syntax TAB // JavaScript syntax 48 // value of _key.keyCode Description: Constant; represents the Tab key. Example: This statement checks whether the character typed is the tab character and calls the handler doNextField if it is:
if (_key.key = TAB) then doNextField // JavaScript syntax if (_key.keyCode == 48) { doNextField(); }

These statements move the playhead forward or backward, depending on whether the user presses Tab or Shift+Tab:
-- Lingo syntax if (_key.key = TAB) then if (_key.shiftDown) then _movie.go(_movie.frame - 1) else _movie.go(_movie.frame + 1) end if end if // JavaScript syntax if (_key.keyCode == 48) { if (_key.shiftDown) { _movie.go(_movie.frame - 1); } else { _movie.go(_movie.frame + 1); } }

BACKSPACE Usage: -- Lingo syntax BACKSPACE // JavaScript syntax 51 // value of _key.keyCode Description: Constant; represents the Backspace key. This key is labeled Backspace in Windows and Delete on the Macintosh. Example: This on keyDown handler checks whether the Backspace key was pressed and, if it was, calls the handler clearEntry:

--Lingo syntax on keyDown if (_key.key = BACKSPACE) then clearEntry _movie.stopEvent() end keyDown // JavaScript syntax function keyDown() { if (_key.keyCode == 51) { clearEntry(); _movie.stopEvent(); } }

ENTER Usage: --Lingo syntax ENTER // JavaScript syntax 3 // value of _key.keyCode Description: Character constant; represents Enter (Windows) or Return (Macintosh) for a carriage return. On PC keyboards, the element ENTER refers only to Enter on the numeric keypad. For a movie that plays back as an applet, use RETURN to specify both Return in Windows and Enter on the Macintosh. Example: This statement checks whether Enter is pressed and if it is, sends the playhead to the frame addSum:
-- Lingo syntax on keyDown if (_key.key = ENTER) then _movie.go("addSum") end // JavaScript syntax function keyDown() { if (_key.keyCode == 3) { _movie.go("addSum"); } }

FALSE Usage: -- Lingo syntax FALSE // JavaScript syntax false Description: Constant; applies to an expression that is logically FALSE, such as 2 > 3. When treated as a number value, FALSE has the numerical value of 0. Conversely, 0 is treated as FALSE. Example:This statement turns off the soundEnabled property by setting it to FALSE:
-- Lingo syntax _sound.soundEnabled = FALSE // JavaScript syntax _sound.soundEnabled = false;

PI Usage: -- Lingo syntax PI // JavaScript syntax Math.PI Description: Constant; returns the value of pi (p), the ratio of a circles circumference to its diameter, as a floating-point number. The value is rounded to the number of decimal places set by the floatPrecision property. Example: This statement uses the PI constant as part of an equation for calculating the area of a circle:
-- Lingo syntax vRadius = 3 vArea = PI*power(vRadius, 2) trace(vArea) -- results in 28.2743 // JavaScript syntax var vRadius = 3; vArea = Math.PI*Math.pow(vRadius, 2); trace(vArea); // results in 28.274333882308138

QUOTE Usage: --Lingo syntax QUOTE // JavaScript syntax \" Description: Constant; represents the quotation mark character and refers to the literal quotation mark character in a string, because the quotation mark character itself is used by Lingo scripts to delimit strings. Example: This statement inserts quotation mark characters in a string:
-- Lingo syntax put("Can you spell" && QUOTE & "Macromedia" & QUOTE & "?") // JavaScript syntax put("Can you spell \"Macromedia\"?");

The result is a set of quotation marks around the word Macromedia:


Can you spell "Macromedia"?

RETURN (Constant) Usage: RETURN


// JavaScript syntax 36 // value of _key.keyCode \n // when used in a string

Description: Constant; represents a carriage return Example: This statement causes a paused movie to continue when the user presses the carriage return:
if (_key.key = RETURN) then _movie.go(_movie.frame + 1)

This statement uses the RETURN character constant to insert a carriage return between two lines in an alert message:

_player.alert("Last line in the file." & RETURN & "Click OK to exit.")

In Windows, it is standard practice to place an additional line-feed character at the end of each line. This statement creates a two-character string named CRLF that provides the additional line feed:
CRLF = RETURN & numToChar(10)

SPACE Usage: -- Lingo syntax SPACE // JavaScript syntax 49 // value of _key.keyCode Description: Constant; read-only, value that represents the space character. Example: This statement displays "Age Of Aquarius" in the Message window:
-- Lingo syntax put("Age"&SPACE&"Of"&SPACE&"Aquarius")

TRUE Usage: -- Lingo syntax TRUE // JavaScript syntax true Description: Constant; represents the value of a logically true expression, such as 2 < 3. It has a traditional numerical value of 1, but any nonzero integer evaluates to TRUE in a comparison. Example: This statement turns on the soundEnabled property by setting it to TRUE:
-- Lingo syntax _sound.soundEnabled = TRUE // JavaScript syntax _sound.soundEnabled = true;

VOID Usage: VOID Description: Constant; indicates the value VOID. Example: This statement checks whether the value in the variable currentVariable is VOID:
if currentVariable = VOID then put("This variable has no value") end if

voidP() Usage: voidP(variableName) Description: Function; determines whether a specified variable has any value. If the variable has no value or is VOID, this function returns TRUE. If the variable has a value other than VOID, this function returns FALSE. Parameters: variableName Required. Specifies the variable to test. Example: This statement checks whether the variable answer has an initial value:
put voidP(answer)

float()
Usage
(expression).float float (expression)

Description Function (Lingo only); converts an expression to a floating-point number. The number of digits that follow the decimal point (for display purposes only, calculations are not affected) is set using the floatPrecision property. In JavaScript syntax, use the parseFloat() function. Parameters
expression

Required. The expression to convert to a floating-point number.

Example This statement converts the integer 1 to the floating-point number 1:


put (1).float -- 1.0

Math operations can be performed using float; if any of the terms is a float value, the entire operation is performed with float:
"the floatPrecision = 1 put 2 + 2 -- 4 put (2).float + 2 -- 4.0 the floatPrecision = 4 put 22/7 -- 3 put (22).float / 7 -- 3.1429"

See also
floatPrecision, ilk()

floatP()
Usage
(expression).floatP floatP(expression)

Description

Function (Lingo only); indicates whether an expression is a floating-point number (1 or TRUE) or not (0 or FALSE). The P in floatP stands for predicate. Parameters
expression

Required. The expression to test.

Example This statement tests whether 3.0 is a floating-point number. The Message window displays the number 1, indicating that the statement is TRUE.
put (3.0).floatP -- 1

This statement tests whether 3 is a floating-point number. The Message window displays the number 0, indicating that the statement is FALSE.
put (3).floatP -- 0

string()
Usage
string(expression)

Description Function; converts an integer, floating-point number, object reference, list, symbol, or other nonstring expression to a string. Parameters
expression

Required. The expression to convert to a string.

Example This statement adds 2.0 + 2.5 and inserts the results in the field cast member Total:
member("total").text = string(2.0 + 2.5)

This statement converts the symbol #red to a string and inserts it in the field cast member Color:
member("Color").text = string(#red)

stringP()
Usage

stringP(expression)

Description Function; determines whether an expression is a string (TRUE) or not (FALSE). The P in stringP stands for predicate. Parameters
expression

Required. The expression to test.

Example This statement checks whether 3 is a string:


put stringP("3")

The result is 1, which is the numeric equivalent of TRUE. This statement checks whether the floating-point number 3.0 is a string:
put stringP(3.0)

Because 3.0 is a floating-point number and not a string, the result is 0, which is the numeric equivalent of FALSE.

symbol()
Usage
-- Lingo syntax symbol(stringValue) // JavaScript syntax symbol(stringValue);

Description Top level function; takes a string and returns a symbol. Parameters
stringValue

Required. The string to convert to a symbol.

Example This statement displays the symbol #hello:


--Lingo syntax put(symbol("hello")) // JavaScript syntax put(symbol("hello"));

This statement displays the symbol #goodbye:


--Lingo syntax x = "goodbye" put(symbol(x)) // JavaScript syntax var x = "goodbye"; put(symbol(x));

symbolP()
Usage
Expression.symbolP symbolP(expression)

Description Function; determines whether a specified expression is a symbol (TRUE) or not (FALSE). The P in symbolP stands for predicate. Parameters
expression

Required. Specifies the expression to test.

Example This statement checks whether the variable myVariable is a symbol:


put myVariable.symbolP

value()
Usage
value(stringExpression)

Description Function; returns the value of a string. When value() is called, Lingo parses through the stringExpression provided and returns its logical value. Any Lingo expression that can be put in the Message window or set as the value of a variable can also be used with value(). These two Lingo statements are equivalent:
put sprite(2).member.duration * 5 put value("sprite(2).member.duration * 5")

These two Lingo statements are also equivalent:


x = (the mouseH - 10) / (the mouseV + 10) x = value("(the mouseH - 10) / (the mouseV + 10)")

Expressions that Lingo cannot parse will produce unexpected results, but will not produce Lingo errors. The result is the value of the initial portion of the expression up to the first syntax error found in the string. The value() function can be useful for parsing expressions input into text fields by end-users, string expressions passed to Lingo by Xtra extensions, or any other expression you need to convert from a string to a Lingo value. Keep in mind that there may be some situations where using value() with user input can be dangerous, such as when the user enters the name of a custom handler into the field. This will cause the handler to be executed when it is passed to value(). Do not confuse the actions of the value function with the integer() and float() functions. Parameters Required. Specifies the string from which a value is returned. The string can be any expression that Lingo can understand.
stringExpression

Example This statement displays the numerical value of the string "the sqrt of" && "2.0":
put value("the sqrt of" && "2.0")

The result is 1.4142. This statement displays the numerical value of the string "penny":
put value("penny")

The resulting display in the Message window is VOID, because the word penny has no numerical value. You can convert a string that is formatted as a list into a true list by using this syntax:
myString = "[" & QUOTE & "cat" & QUOTE & ", " & QUOTE & "dog" & QUOTE & "]" myList = value(myString) put myList -- ["cat", "dog"]

This allows a list to be placed in a field or text cast member and then extracted and easily reformatted as a list. This statement parses the string "3 5" and returns the value of the portion of the string that Lingo understands:
put value("3 5") -- 3

integer()
Usage
(numericExpression).integer integer(numericExpression)

Description Function (Lingo only); rounds the value of an expression to the nearest whole integer. You can force an integer to be a string by using the string() function. In JavaScript syntax, use the parseInt() function. Parameters
numericExpression

Required. The number to round to an integer.

Example This statement rounds off the number 3.75 to the nearest whole integer:
put integer(3.75) -- 4

The following statement rounds off the value in parentheses. This provides a usable value for the locH sprite property, which requires an integer:
sprite(1).locH = integer(0.333 * stageWidth)

integerP()
Usage
expression.integerP (numericExpression).integerP integerP(expression)

Description Function (Lingo only); indicates whether a specified expression can be evaluated to an integer (1 or TRUE) or not (0 or FALSE). P in integerP stands for predicate. Parameters
expression

Required. The expression to test.

Example This statement checks whether the number 3 can be evaluated to an integer and then displays 1 (TRUE) in the Message window:
put(3).integerP

-- 1

The following statement checks whether the number 3 can be evaluated to an integer. Because 3 is surrounded by quotation marks, it cannot be evaluated to an integer, so 0 (FALSE) is displayed in the Message window:
put("3").integerP -- 0

This statement checks whether the numerical value of the string in field cast member Entry is an integer and if it isnt, displays an alert:
if field("Entry").value.integerP = FALSE then alert "Please enter an integer."

See also

point()
Usage
-- Lingo syntax point(intH, intV) // JavaScript syntax point(intH, intV);

Description Top level function and data type. Returns a point that has specified horizontal and vertical coordinates. A point has both a locH and a locV property. Point coordinates can be changed by arithmetic operations using Lingo only. For example, the following two points can be added together using Lingo, but NaN is returned using JavaScript syntax:
-- Lingo pointA = point(10,10) pointB = point(5,5) put(pointA + pointB) -- point(15,15) // JavaScript syntax var pointA = point(10,10); var pointB = point(5,5); trace(pointA + pointB); // NaN

To see an example of point() used in a completed movie, see the Imaging and Vector Shapes movies in the Learning/Lingo folder inside the Director application folder.

Parameters
intH intV

Required. An integer that specifies the horizontal coordinate of the point. Required. An integer that specifies the vertical coordinate of the point.

Example This statement sets the variable lastLocation to the point (250, 400):
-- Lingo syntax lastLocation = point(250, 400) // JavaScript syntax var lastLocation = point(250, 400);

This statement adds 5 pixels to the horizontal coordinate of the point assigned to the variable myPoint:
-- Lingo syntax myPoint.locH = myPoint.locH + 5 // JavaScript syntax myPoint.locH = myPoint.locH + 5;

In Lingo only, the following statements set a sprites Stage coordinates to mouseH and mouseV plus 10 pixels. The two statements are equivalent.
-- Lingo syntax sprite(_mouse.clickOn).loc = point(_mouse.mouseH, _mouse.mouseV) \ + point(10, 10) sprite(_mouse.clickOn).loc = _mouse.mouseLoc + 10

See also

rect()
Usage
-- Lingo syntax rect(intLeft, intTop, intRight, intBottom) // JavaScript syntax rect(intLeft, intTop, intRight, intBottom);

Description Top level function; defines a rectangle. You can perform arithmetic operations on rectangles using both Lingo and JavaScript syntax. If you add a single value to a rectangle, Lingo and JavaScript syntax adds it to each element in the rectangle. You can refer to rectangle components by list syntax or property syntax. For example, the following assignments set both myRectWidth1 and myRectWidth2 to 50:
// JavaScript syntax var myRect = rect(40,30,90,70); var myRectWidth1 = myRect.right - myRect.left; // 50

var myRectWidth2 = myRect[3] - myRect[1]; // 50

To see an example of rect() used in a completed movie, see the Imaging movie in the Learning/Lingo folder inside the Director application folder. Parameters Required. An integer that specifies the number of pixels that the left side of the rectangle is from the left edge of the Stage.
intLeft

Required. An integer that specifies the number of pixels that the top side of the rectangle is from the top edge of the Stage.
intTop

Required. An integer that specifies the number of pixels that the right side of the rectangle is from the left edge of the Stage.
intRight

Required. An integer that specifies the number of pixels that the bottom side of the rectangle is from the top edge of the Stage.
intBottom

Example This statement sets the variable newArea to a rectangle whose left side is at 100, top is at 150, right side is at 300, and bottom is at 400 pixels:
-- Lingo syntax newArea = rect(100, 150, 300, 400) // JavaScript syntax var newArea = rect(100, 150, 300, 400);

In Lingo only, the following statement sets the variable newArea to the rectangle defined by the points firstPoint and secondPoint:
-- Lingo syntax firstPoint = point(100, 150) secondPoint = point(300, 400) newArea = rect(firstPoint, secondPoint)

In Lingo only, these statements add and subtract values for rectangles:
-- Lingo syntax put(rect(0, 0, 100, 100) + rect(30, 55, 120, 95)) -- rect(30, 55, 220, 195) put(rect(0, 0, 100, 100) -rect(30, 55, 120, 95)) -- rect(-30, -55, -20, 5)

In Lingo only, this statement adds 80 to each coordinate in a rectangle:


-- Lingo syntax put(rect(60, 40, 120, 200) + 80) -- rect(140, 120, 200, 280)

In Lingo only, this statement divides each coordinate in a rectangle by 3:


-- Lingo syntax put(rect(60, 40, 120, 200) / 3) -- rect(20, 13, 40, 66)

draw()
Usage
-- Lingo syntax imageObjRef.draw(x1, y1, x2, y2, colorObjOrParamList) imageObjRef.draw(point(x, y), point(x, y), colorObjOrParamList) imageObjRef.draw(rect, colorObjOrParamList) // JavaScript syntax imageObjRef.draw(x1, y1, x2, y2, colorObjOrParamList); imageObjRef.draw(point(x, y), point(x, y), colorObjOrParamList); imageObjRef.draw(rect, colorObjOrParamList);

Description Image method. Draws a line or an unfilled shape with a specified color in a rectangular region of a given image object. This method returns a value of 1 if there is no error. If the optional parameter list is not provided, draw() draws a 1-pixel line between the first and second points given or between the upper left and lower right corners of the given rectangle. For best performance, with 8-bit or lower images the color object should contain an indexed color value. For 16- or 32-bit images, use an RGB color value. To fill a solid region, use the fill() method. Parameters Required if drawing a line using x and y coordinates. An integer that specifies the x coordinate of the start of the line.
x1

Required if drawing a line using x and y coordinates. An integer that specifies the y coordinate of the start of the line.
y1

Required if drawing a line using x and y coordinates. An integer that specifies the x coordinate of the end of the line.
x2

Required if drawing a line using x and y coordinates. An integer that specifies the y coordinate of the end of the line.
y2

Required. A color object or parameter list that specifies the color of the line or shapes border. The parameter list can be used instead of a simple color object to specify the following properties.
colorObjOrParamList

Property
#shapeType #lineSize #color

Description A symbol value of #oval, #rect, #roundRect, or #line. The default is #line. The width of the line to use in drawing the shape. A color object, which determines the color of the shapes border.

point(x, y), point(x, y)

Required if drawing a line using points. Two points that specify the start

and end points of the line. Required if drawing a shape. A rectangle that specifies the rectangular region in which a shape is drawn.
rect

Example This statement draws a 1-pixel, dark red, diagonal line from point (0, 0) to point (128, 86) within the image of member Happy. The following statement draws a dark red, 3-pixel unfilled oval within the image of member Happy. The oval is drawn within the rectangle (0, 0, 128, 86).

color()
Usage
-- Lingo syntax color(intPaletteIndex) color(intRed, intGreen, intBlue) // JavaScript syntax color(intPaletteIndex); color(intRed, intGreen, intBlue);

Description Top level function and data type. Returns a Color data object using either RGB or 8-bit palette index values. The resulting color object can be applied to cast members, sprites, and the Stage where appropriate. Parameters Required if using 8-bit palette values. An integer that specifies the 8-bit palette value to use. Valid values range from 0 to 255. All other values are truncated.
intPaletteIndex

Required if using RGB values. An integer that specifies the red color component in the current palette. Valid values range from 0 to 255. All other values are truncated.
intRed

Required if using RGB values. An integer that specifies the green color component in the current palette. Valid values range from 0 to 255. All other values are truncated.
intGreen

Required if using RGB values. An integer that specifies the blue color component in the current palette. Valid values range from 0 to 255. All other values are truncated.
intBlue

Example These statements display the color of sprite 6 in the Message window, and then set the color of sprite 6 to a new value:
-- Lingo syntax put(sprite(6).color) -- paletteIndex(255) sprite(6).color = color(137)

put(sprite(6).color) -- paletteIndex(137) // JavaScript syntax put(sprite(6).color) // paletteIndex(255); sprite(6).color = color(137); put(sprite(6).color) // paletteIndex(137);

copyPixels()
Usage
-- Lingo syntax imageObjRef.copyPixels(sourceImgObj, destRectOrQuad, sourceRect {, paramList}) // JavaScript syntax imageObjRef.copyPixels(sourceImgObj, destRectOrQuad, sourceRect {, paramList});

Description Image method. Copies the contents of a rectangle in an existing image object into a new image object. When copying pixels from one area of a cast member to another area of the same member, it is best to copy the pixels first into a duplicate image object before copying them back into the original member. Copying directly from one area to another in the same image is not recommended. To simulate matte ink with copyPixels(), create a matte object with createMatte() and then pass that object as the #maskImage parameter of copyPixels(). To see an example of quad used in a completed movie, see the Quad movie in the Learning/Lingo folder inside the Director application folder. Parameters
sourceImgObj

Required. A reference to the source image object from which pixels are copied.

Required if copying pixels into a screen coordinate rectangle or a floating point quad. The rectangle or quad into which pixels are copied.
destRectOrQuad sourceRect paramList

Required. The source rectangle from which pixels are copied.

Optional. A parameter list that can be used to manipulate the copied pixels before they are placed into destRect or destQuad. The property list may contain any or all of the following parameters. Property
#color #bgColor #ink #blendLevel

Use and Effect The foreground color to apply for colorization effects. The default color is black. The background color to apply for colorization effects or background transparency. The default color is white. The type of ink to apply to the copied pixels. This can be an ink symbol or the corresponding numeric ink value. The default ink is #copy. The degree of blend (transparency) to apply to the copied pixels. The range of values is from 0 to 255. The default value is 255 (opaque). Using a value less than 255 forces the

#ink setting to be #blend, or #blendTransparent if it was originally #backgroundTransparent. #blendLevel could also be replaced with #blend;

if so, use

use a value range of 0 to 100.


#dither

A TRUE or FALSE value that determines whether the copied pixels will be dithered when placed into the destRect in 8- and 16-bit images. The default value is FALSE, which maps the copied pixels directly into the imageObjRefs color palette. A TRUE or FALSE value that determines whether quad calculations are made using the faster but less precise method available in Director when copying pixels into destQuad. Set to TRUE to use quads for simple rotation and skew operations. Set to FALSE for arbitrary quads, such as those used for perspective transformations. The default value is FALSE. Specifies a mask or matte object, created with the creatMask() or createMatte()s, that will be used as a mask for the pixels being copied. This enables the effects of mask and matte sprite inks to be duplicated. If the source image has an alpha channel and its useAlpha property is TRUE, the alpha channel is used and the specified mask or matte is ignored. The default is no mask. A point indicating the amount of x and y offset to apply to the mask specified by #maskImage. The offset is relative to the upper left corner of the source image. The default offset is (0, 0).

#useFastQuads

#maskImage

#maskOffset

Example This statement copies the entire image of member Happy into the rectangle of member flower. If the members are different sizes, the image of member Happy will be resized to fit the rectangle of member flower. The following statement copies part of the image of member Happy into part of member flower. The part of the image copied from Happy is within rectangle(0, 0, 200, 90). It is pasted into rectangle(20, 20, 100, 40) within the image of member flower. The copied portion of Happy is resized to fit the rectangle into which it is pasted. The following statement copies the entire image of member Happy into a rectangle within the image of member flower. The rectangle into which the copied image of member Happy is pasted is the same size as the rectangle of member Happy, so the copied image is not resized. The blend level of the copied image is 50, so it is semi-transparent, revealing the part of member flower it is pasted over.

getPixel()
Usage
-- Lingo syntax imageObjRef.getPixel(x, y {, #integer}) imageObjRef.getPixel(point(x, y) {, #integer}) // JavaScript syntax imageObjRef.getPixel(x, y {, #integer}); imageObjRef.getPixel(point(x, y) {, #integer});

Description Image method. Returns an indexed or RGB color of the pixel at a specified point in a given image.

The index of the rows and columns of the returned image starts with 0. Therefore, in order to access the top left pixel of an image, specify the location as (0,0), and not (1,1). If a given image is h pixels high and w pixels wide, to access the bottom right pixel of the image, specify the location as (w,1), (h,1). This method returns a value of 0 if the specified pixel is outside the given image. To set a lot of pixels to the color of another pixel, it is faster to set them as raw numbers (by using the optional #integer parameter). Raw integer color values are also useful because they contain alpha layer information as well as color when the image is 32-bit. The alpha channel information can be extracted from the raw integer by dividing the integer by 2^8+8+8. Parameters Required if specifying a pixel using x and y coordinates. An integer that specifies the x coordinate of the pixel.
x

Required if specifying a pixel using x and y coordinates. An integer that specifies the y coordinate of the pixel.
y #integer

Optional. A symbol that specifies the raw number of the returned color value. Required if specifying a pixel using a point. A point that specifies the point of the pixel.

point(x, y)

setPixel()
Usage
-- Lingo syntax imageObjRef.setPixel(x, y, colorObjOrIntValue) imageObjRef.setPixel(point(x, y), colorObjOrIntValue) // JavaScript syntax imageObjRef.setPixel(x, y, colorObjOrIntValue); imageObjRef.setPixel(point(x, y), colorObjOrIntValue);

Description Image method. Sets the color value of the pixel at a specified point in a given image. If setting many pixels to the color of another pixel with getPixel(), it is faster to set them as integers. For best performance with color objects, use an indexed color object with 8-bit or lower images, and use an RGB color object with 16-bit or higher images. This method returns FALSE if the specified pixel falls outside the specified image. To see an example of this method used in a completed movie, see the Imaging movie in the Learning/Lingo folder inside the Director application folder. Parameters

Required if specifying a pixel using x and y coordinates. An integer that specifies the x coordinate of the pixel.
x

Required if specifying a pixel using x and y coordinates. An integer that specifies the y coordinate of the pixel.
y point(x, y)

Required if specifying a pixel using a point. A point that specifies the pixel.

Required if setting the color to a color object or an integer value. A reference to a color object that specifies the color of the pixel, or an integer that specifies the color value of the pixel.
colorObjOrIntValue

fill()
Usage
-- Lingo syntax imageObjRef.fill(left, top, right, bottom, colorObjOrParamList) imageObjRef.fill(point(x, y), point(x, y), colorObjOrParamList) imageObjRef.fill(rect, colorObjOrParamList) // JavaScript syntax imageObjRef.fill(left, top, right, bottom, colorObjOrParamList); imageObjRef.fill(point(x, y), point(x, y), colorObjOrParamList); imageObjRef.fill(rect, colorObjOrParamList);

Description Image method. Fills a rectangular region with a specified color in a given image object. This method returns a value of 1 if there is no error, zero if there is an error. For best performance, with 8-bit or lower images the color object should contain an indexed color value. For 16- 32-bit images, use an RGB color value. Parameters Required if filling a region specified by coordinates. An integer that specifies the left side of the region to fill.
left

Required if filling a region specified by coordinates. An integer that specifies the top side of the region to fill.
top

Required if filling a region specified by coordinates. An integer that specifies the right side of the region to fill.
right

Required if filling a region specified by coordinates. An integer that specifies the bottom side of the region to fill.
bottom

Required. A color object or parameter list that specifies the color used to fill the region. The parameter list can be used instead of a simple color object to specify the following properties.
colorObjOrParamList

Property
#shapeType #lineSize #color #bgColor

Description A symbol value of #oval, #rect, #roundRect, or #line. The default is #line. The width of the line to use in drawing the shape. A color object, which determines the fill color of the region. A color object, which determines the color of the regions border.

Required if filling a region using points. Two points that specify the upperleft and lower-right corners of region to fill, relative to the upper-left corner of the given image object.
point(x, y), point(x, y) rect

Required if filling a region using a rectangle. A rectangle that specifies the rectangular region to fill.

Example This statement renders the image object in the variable myImage completely black: The following statement draws a filled oval in the image object TestImage. The oval has a green fill and a 5-pixel-wide red border.

image()
Usage
-- Lingo syntax image(intWidth, intHeight, intBitDepth) // JavaScript syntax image(intWidth, intHeight, intBitDepth);

Description Top level function; creates and returns a new image with specified dimensions. If you create a new image by using the top level image() function, the new image is a self-contained set of image data, and is independent of all other images. Therefore, changes made to any other images have no effect on the new image. If you refer to an image by setting a variable equal to a source image, such as a cast member or the image of the Stage, the variable contains a reference to the source image. Therefore, a change made to the image in either the source object or the variable will be reflected in the other image. To avoid this behavior and create a copy of an image that is independent of the source image, use the duplicate() method. The duplicate() method returns a copy of a source image that inherits all the values of the source image but is not tied to the source image. Therefore, a change made to either the source image or the new copy of the source image will have no effect on the other image. If you create an image object by referring to a cast member, the new object contains a reference to the image of the member. Any changes made to the image are reflected in the cast member and in any sprites that are created from that member. When you create a new image object, the background color defaults to white (color(255,255,255)), and the alpha channel is completely opaque (color(0,0,0)).

The alpha channel color for 100% transparency is white (color(255,255,255)); the alpha channel color for 100% opaque is black (color(0,0,0)). To see an example of image() used in a completed movie, see the Imaging movie in the Learning/Lingo folder inside the Director application folder. Parameters
intWidth

Required. An integer that specifies the width of the new image. Required. An integer that specifies the height of the new image. Required. An integer that specifies the bit depth of the new image. Valid values are 1, 2, 4,

intHeight

intBitDepth

8, 16, or 32. Example The following example creates an 8-bit image that is 200 pixels wide by 200 pixels high.
-- Lingo syntax objImage = image(200, 200, 8) // JavaScript syntax var objImage = image(200, 200, 8);

The following example creates an image by referring to the image of the Stage.
-- Lingo syntax objImage = _movie.stage.image // JavaScript syntax var objImage = _movie.stage.image;

See also

image (Image)
Usage
-- Lingo syntax imageObjRef.image // JavaScript syntax imageObjRef.image;

Description Image property. Refers to the image object of a bitmap or text cast member, of the Stage, or of a window. Read/write for a cast members image, read-only for an image of the Stage or a window. Setting a cast members image property immediately changes the contents of the member. However, when getting the image of a member or window, Director creates a reference to the image of the specified member or window. If you make changes to the windows, the contents of the cast member or window change immediately.

If you plan to make a lot of changes to an items image property, it is faster to copy the items image property into a new image object using the duplicate() method, apply your changes to the new image object, and then set the original items image to the new image object. For nonbitmap members, it is always faster to use the duplicate() method. Example This statement puts the image of cast member originalFlower into cast member newFlower:
-- Lingo syntax member("newFlower").image = member("originalFlower").image // JavaScript syntax member("newFlower").image = member("originalFlower").image;

These statements place a reference to the image of the stage into the variable myImage and then put that image into cast member flower:
-- Lingo syntax myImage = _movie.stage.image member("flower").image = myImage // JavaScript syntax var myImage = _movie.stage.image; member("flower").image = myImage;

See also

lineCount
Usage
-- Lingo syntax memberObjRef.lineCount // JavaScript syntax memberObjRef.lineCount;

Description Cast member property; indicates the number of lines that appear in the field cast member on the Stage according to the way the string wraps, not the number of carriage returns in the string. Example This statement determines how many lines the field cast member Todays News has when it appears on the Stage and assigns the value to the variable numberOfLines:
--Lingo syntax numberOfLines = member("Todays News").lineCount // JavaScript syntax var numberOfLines = member("Todays News").lineCount;

line...of
Usage
-- Lingo syntax textMemberExpression.line[whichLine] line whichLine of fieldOrStringVariable textMemberExpression.line[firstLine..lastLine] line firstLine to lastLine of fieldOrStringVariable

Description Keyword; specifies a line or a range of lines in a chunk expression. A line chunk is any sequence of characters delimited by carriage returns, not by line breaks caused by text wrapping. The expressions whichLine, firstLine, and lastLine must be integers that specify a line in the chunk. Chunk expressions refer to any character, word, item, or line in any source of characters. Sources of characters include field cast members and variables that hold strings. Example This statement assigns the first four lines of the variable Action to the field cast member To Do:
member("To Do").text = Action.line[1..4]

This statement inserts the word and after the second word of the third line of the string assigned to the variable Notes:
put "and" after Notes.line[3].word[2]

word...of
Usage
-- Lingo syntax member(whichCastMember).word[whichWord] textMemberExpression.word[whichWord] chunkExpression.word[whichWord] word whichWord of fieldOrStringVariable fieldOrStringVariable. word[whichWord] textMemberExpression.word[firstWord..lastWord] member(whichCastMember).word[firstWord..lastWord] word firstWord to lastWord of chunkExpression chunkExpression.word[whichWord..lastWord]

Description Chunk expression; specifies a word or a range of words in a chunk expression. A word chunk is any sequence of characters delimited by spaces. (Any non-visible character, such as a tab or carriage return, is considered a space.)

The expressions whichWord, firstWord, and lastWord must evaluate to integers that specify a word in the chunk. Chunk expressions refer to any character, word, item, or line in any source of characters. Sources of characters include field and text cast members and variables that hold strings. To see an example of word...of used in a completed movie, see the Text movie in the Learning/Lingo Examples folder inside the Director application folder. Example These statements set the variable named animalList to the string "fox dog cat" and then insert the word elk before the second word of the list:
animalList = "fox dog cat" put "elk" before animalList.word[2]

The result is the string "fox elk dog cat". This statement tells Director to display the fifth word of the same string in the Message window:
put "fox elk dog cat".word[5]

Because there is no fifth word in this string, the Message window displays two quotation marks (""), which indicate an empty string. See also
char...of, line...of, item...of, count(), number (words)

char...of
Usage
-- Lingo syntax textMemberExpression.char[whichCharacter] char whichCharacter of fieldOrStringVariable textMemberExpression.char[firstCharacter..lastCharacter] char firstCharacter to lastCharacter of fieldOrStringVariable

Description Keyword; identifies a character or a range of characters in a chunk expression. A chunk expression is any character, word, item, or line in any source of text (such as field cast members and variables) that holds a string.

An expression using whichCharacter identifies a specific character. An expression using firstCharacter and lastCharacter identifies a range of characters.

The expressions must be integers that specify a character or range of characters in the chunk. Characters include letters, numbers, punctuation marks, spaces, and control characters such as Tab and Return.

You can test but not set the char...of keyword. Use the put...into command to modify the characters in a string. Example This statement displays the first character of the string $9.00:
put(("$9.00").char[1..1]) -- "$"

This statement displays the entire string $9.00:


put(("$9.00").char[1..5]) -- "$9.00"

This statement changes the first five characters of the second word in the third line of a text cast member:
member("quiz").line[3].word[2].char[1..5] = "?????"

S-ar putea să vă placă și