Creați o aplicație de decupare a imaginilor în Flash cu ActionScript 3

În acest Tutorial Premium, vom învăța cum să manipulați Bitmap-urile în ActionScript 3 pentru a produce o aplicație utilă de recoltare a imaginilor. Continua să citești!


Rezultatul final al rezultatelor

Imagine de către Swami Stream licențiată sub Creative Commons.


Pasul 1: Prezentare generală

Folosind Flash Tools vom crea o interfață atractivă care va fi alimentată de mai multe clase ActionScript 3 cum ar fi MouseCursor, Bitmap, BitmapData, Rectangle, Point, Tween, FileReference și chiar biblioteci externe.

Utilizatorul va putea să taie o imagine de mai multe ori pentru a selecta ulterior cea mai bună opțiune și ao salva pe disc.


Pasul 2: Configurați Flash

Deschideți Flash și creați un document cu înălțime de 600 de pixeli, de 400 de pixeli înălțime. Setați rata cadrelor la 24fps.



Pasul 3: Interfața


O interfață asemănătoare mac-like vă va alimenta codul, aceasta implică mai multe butoane bazate pe cronologie, cursoare personalizate și multe altele.

Continuați cu pașii următori pentru a afla cum să creați această interfață grafică.


Pasul 4: Contextul


Fără știință în fundal, creați doar un dreptunghi negru de 600x400 pixeli și centrați-l în scenă. De asemenea, puteți schimba culoarea de fundal în Stage Properties.


Pasul 5: Imagine

Vom avea nevoie de o imagine pentru a decupa, selecta imaginea preferata si importa-o in faza (Cmd + R).



Imagine de către Swami Stream licențiată sub Creative Commons.


Pasul 6: Cursor particularizat

Vom face un cursor personalizat să îl folosească ca un feedback către utilizator, permițându-i să știe unde poate recolta.

Selectați instrumentul Rectangle (R) și faceți un dreptunghi alb înalt de 3px, înalt de 17px.


Duplicați forma (Cmd + D) și rotiți-o cu 90 de grade pentru a forma o cruce.


Repetați acest proces cu un dreptunghi de negru înalt de 1px, de 15 px.


Transformați forma finală la MovieClip (F8) și setați numele instanței acesteia cursor.


Pasul 7: Butoane de acțiune

Aceste butoane acționează acțiuni secundare bazate pe recoltă, aceste acțiuni fiind:

  • Salvați: Salvează cultura curentă.
  • Anulare: Returnează cultura curentă în poziția sa și readuce imaginea originală.
  • clar: Șterge toate culturile și readuce imaginea originală.

Selectați Instrumentul primitiv dreptunghi (R) și modificați raza de colț la 10, desenați un dreptunghi de 70x18px și completați-l cu # 666666.


Duplicați forma (Cmd + D), redimensionați-o la 68x16px și schimbați culoarea spre acest gradient liniar # 222222 la # 444444. Utilizați instrumentul de transformare a gradientului (F) pentru a roti gradientul.


Apoi, utilizați instrumentul Text (T) pentru a scrie o etichetă pentru buton. Utilizați acest format: Lucida Grande Regular, 12pt, #CCCCCC.


Utilizați aceeași tehnică pentru a crea butoanele Anulare și Ștergere.



Pasul 8: Cronologia butoanelor

Un buton GUI bine realizat are 4 stări:

  • Sus: Starea normală a butonului.
  • Peste: Grafica afișată atunci când cursorul mouse-ului este peste butonul.
  • Jos: Se afișează când mouse-ul face clic pe buton.
  • Lovit: Zona în care mouse-ul poate face clic.

Conversați butoanele în MovieClip și faceți dublu clic pe ele pentru a intra în modul de editare. Deschideți panoul Timeline (fereastră> Cronologie).

Veți observa că Sus statul este deja creat, acestea sunt formele pe care le-ați convertit în MovieClip.


Apăsați F6 pentru a crea un nou cadru și a schimba umplutura de gradient de formă centrală la # 222222, # 5B5B5B. Acesta va fi Peste stat.


Pentru Jos , selectați forma centrală și rotiți-o vertical (Modificați> Tranform> Flip Vertical).


Lovit stat este în mod implicit, suprafața mai mare a formei, pe măsură ce zona pe care o dăm clic pe care o dorim este întregul buton, nu va fi nevoie să creați un cadru pentru acest.


Pasul 9: Nume de poziție și instanță

Când toate butoanele sunt gata, ieșiți din modul de editare și plasați-le după cum se arată în următoarea imagine. Textul alb indică numele instanței butonului.



Pasul 10: Buton Bar

O bară de butoane va fi utilizată pentru a plasa și a evidenția butonul de decupare.

Utilizați instrumentul Rectangle pentru a crea un dreptunghi de 600x50 px și completați acest gradient fill #AFAFAF la # C4C4C4. Aliniați bara din partea inferioară a scenei.


Pentru a crea un efect gravat, trageți două linii de 600x1px și plasați-le deasupra barei de butoane, umpleți-o cu # 858585, iar cealaltă cu # D8D8D8.



Pasul 11: Buton de decupare

Butonul Crop (Crop) va porni funcția Main ActionScript care va manipula bitmap-urile din scenă.

Cu instrumentul Rectangle, creați dreptunghiuri de 33x6px și 26x6px și le folosiți pentru a forma un unghi drept.


Duplicați forma și rotiți-o cu 180 de grade pentru a forma un pătrat.


Deplasați forma duplicată 5px în sus și 5px spre dreapta.


Umpleți forma rezultată cu această umplutură de gradient: # 444444 la # 222222. Utilizați instrumentul Transformare gradient pentru a roti umplerea.


Puteți adăuga mai multe detalii adăugând o umbră; duplicați forma actuală și mutați-o cu 1px în jos și 1px dreapta.


În cele din urmă, transformați forma în MovieClip și denumiți-o cropButton.


Pasul 12: Formă de decupare


Forma culturii este o imagine care va fi utilizată pentru a indica zona care va fi decupată.

Selectați Instrumentul dreptunghi și schimbați culoarea cursei în alb și culoarea de umplere la alb cu 1% alfa (acest lucru ne va ajuta să tragem forma culturii). Desenați un pătrat de 10x10px și centrați-l.


Selectați o parte de 1px a pătratului și schimbați culoarea în negru.


Duplicați forma și faceți totul pe toată partea.


Repetați acest proces pe toate laturile.


Convertiți rezultatul în MovieClip și denumiți-l cropShape, marchează Exportați pentru ActionScript cutie.

Faceți dublu clic pe acesta pentru a intra în modul de editare, pentru a crea un nou cadru cheie în cadrul 5 și pentru a roti forma la 180 de grade.


Adăugați mai mult 4 cadre și ieșiți din modul de editare.

Aceasta incheie partea grafica, sa incepem cu ActionScript!


Pasul 13: Noua clasă ActionScript

Creați o nouă clasă ActionScript 3.0 (Cmd + N) și salvați-o ca Main.as în dosarul dvs. de clasă.



Pasul 14: Pachetul

Cuvântul cheie pentru pachete vă permite să vă organizați codul în grupuri care pot fi importate de alte scripturi, este recomandat să le numiți începând cu o literă mică și să utilizați intercaps pentru următoarele cuvinte, de exemplu: myClasses. Este, de asemenea, obișnuit să le denumiți utilizând site-ul companiei: com.mycompany.classesType.myClass.

În acest exemplu, folosim o singură clasă, deci nu este necesar să creați un folder de clase.

 pachet 

Pasul 15: Directiva privind importul

Acestea sunt clasele pe care trebuie să le importăm pentru ca clasa noastră să funcționeze import directiva face ca clasele și pachetele definite extern să fie disponibile pentru codul dvs..

 import flash.display.Sprite; importul flash.events.MouseEvent; import flash.ui.Mouse; import flash.ui.MouseCursor; import flash.display.BitmapData; import flash.display.Bitmap; import flash.geom.Rectangle; import flash.geom.Point; import fl.transitions.Tween; import fl.transitions.easing.Strong; import flash.net.FileReference; import flash.utils.ByteArray; import com.adobe.images.JPGEncoder; importul flash.events.Event;

Pasul 16: codificator JPGE


Pentru a salva cultura imaginii, vom folosi o clasă care face parte din as3corelib. Urmați linkul și descărcați biblioteca.


Pasul 17: Declarația și extinderea

Aici declarăm clasa utilizând clasă definirea cuvântului cheie urmat de numele pe care îl dorim pentru clasă, amintiți-vă că trebuie să salvați fișierul utilizând acest nume.

extinde cuvântul cheie definește o clasă care este o subclasă a unei alte clase. Subclasa moștenește toate metodele, proprietățile și funcțiile, astfel încât le putem folosi în clasa noastră.

clasa publică principală extinde Sprite 

Pasul 18: Variabile

Acestea sunt variabilele pe care le vom folosi, citiți comentariile din cod pentru a afla mai multe despre ele.

private var cropShape: CropShape; // Aceasta este o instanță a formei de cultură pe care am creat-o înainte de privat var pointX: Number; // Aceasta var va tine pozitia x unde forma cultului este pornita priv var varYY: Number; // Acest var va tine pozitia y unde se porneste forma culturii private var adaugat: Boolean; // Verifică dacă forma culturii este în imagini privitoare la var privat: Array = Array nou (); // Stochează imaginile culturi private var bmd: BitmapData; // Un obiect de date bitmap, utilizat pentru a manipula principalele date de imagine private var bmd2: BitmapData; // Un al doilea obiect de date bitmap, acesta va conține datele imaginii pe care dorim să o salvăm privat var croppedImage: Sprite; // Susține imaginile tăiate private var cropThumb: int = 0; // Numărul de degete deja creat privat var thumbPosX: Array = [5, 5, 5, 505, 505, 505]; // stochează pozițiile x ale thumb thumbs: array = [37, 135, 233, 37, 135, 233]; // Stochează pozițiile y ale degetului privat var tween: Tween; // Un obiect tween, biblioteca de animație implicită în fișierul private privat varReference: FileReference; // Folosit pentru salvarea fișierului pe disc privat var byteArray: ByteArray; // Stochează datele binare, folosite pentru a salva fișierul pe disc privat var jpg: JPGEncoder = nou JPGEncoder (); // encoder privat var zoomed: Boolean; // Verifică dacă miniaturile sunt mărite sau deconectate privat var currentCrop: Bitmap; // Menține thumbnail-ul curent mărit, cel care va fi salvat privat var currentSprite: *; // folosit pentru a ști ce degetul mare este activ privat var latestX: Number; // Verifică cele mai recente x de la miniatură privată privat var latestY: Number; // Verifică ultimul y al degetului mare

Pasul 19: Constructor

Constructorul este o funcție care rulează atunci când un obiect este creat dintr-o clasă, acest cod este primul care se execută atunci când faceți o instanță a unui obiect sau executați utilizând Clasa de documente.

 funcția publică Main (): void 

Pasul 20: Ascultători inițiali

Acestea sunt ascultătorii care vor fi definiți la lansare, aceștia adăugând practic evenimente legate de mouse-uri la butoane.

imaginea.addEventListener (MouseEvent.MOUSE_DOWN, getStartPoint); image.addEventListener (MouseEvent.MOUSE_UP, stopDrawing); cropButton.addEventListener (MouseEvent.MOUSE_UP, crop); image.addEventListener (MouseEvent.MOUSE_OVER, customCursor); image.addEventListener (MouseEvent.MOUSE_OUT, removeCustomCursor); saveButton.addEventListener (MouseEvent.MOUSE_UP, saveImage); cancelButton.addEventListener (MouseEvent.MOUSE_UP, anula); clearButton.addEventListener (MouseEvent.MOUSE_UP, clearThumbs);

Pasul 21: Ascundeți butoanele

Acest cod ascunde butoanele care nu sunt utilizate în acest moment.

saveButton.visible = false; cancelButton.visible = false; clearButton.visible = false; cursor.visible = false;

Pasul 22: Adăugați cursorul personalizat

Următoarea funcție face ca cursorul personalizat să fie vizibil când indicatorul mouse-ului este peste imaginea principală.

funcția privată customCursor (e: MouseEvent): void cursor.visible = true; Mouse.hide (); cursor.startDrag (true); 

Pasul 23: Înlăturați cursorul personalizat

Ascunde cursorul personalizat când indicatorul mouse-ului părăsește imaginea principală.

funcția privată removeCustomCursor (e: MouseEvent): void cursor.visible = false; Mouse.show (); cursor.stopDrag (); 

Pasul 24: Obțineți punctul de pornire

O funcție foarte importantă, stochează și stochează coordonatele click-ului mouse-ului și plasează în ele rolul "Shape crop", valoarea curentă va fi utilizată mai târziu pentru a determina dimensiunea formei culturii.

 funcția privată getStartPoint (e: MouseEvent): void pointX = mouseX; pointY = mouseYY; dacă (! added) cropShape = CropShape (); cropShape.x = pointX; cropShape.y = pointY; addChild (cropShape); adăugat = adevărat;  altceva removeChild (cropShape); cropShape = CropShape (); cropShape.x = pointX; cropShape.y = pointY; addChild (cropShape); 

Pasul 25: Ascultătoarele mouse-ului

Adaugă un ascultător în imaginea principală pentru a extinde forma de decupare pe mișcarea mouse-ului și adaugă ascultătorului să se oprească extinderea pe mouse.

 image.addEventListener (MouseEvent.MOUSE_MOVE, drawCropShape); cropShape.addEventListener (MouseEvent.MOUSE_UP, StopDrawing);

Pasul 26: Desenați forma de decupare

Extinde forma de cultură în funcție de coordonatele salvate și cele curente.

 funcția privată drawCropShape (e: MouseEvent): void cropShape.width = mouseX - pointX; cropShape.height = mouseY - pointY; 

Pasul 27: Opriți forma de decupare

Opresc extinderea formei culturii și adaugă niște ascultători care vor fi utilizați de următoarele funcții.

 funcția privată stopDrawing (e: MouseEvent): void image.removeEventListener (MouseEvent.MOUSE_MOVE, drawCropShape); cropShape.addEventListener (MouseEvent.MOUSE_OVER, showHandCursor); cropShape.addEventListener (MouseEvent.MOUSE_OUT, hideHandCursor); cropShape.addEventListener (MouseEvent.MOUSE_DOWN, dragCrop); cropShape.addEventListener (MouseEvent.MOUSE_UP, stopDragCrop); 

Pasul 28: Afișați cursorul de mână

Utilizează clasa Mouse pentru a manipula cursorul mouse-ului, acest cod va afișa cursorul de mână atunci când mouse-ul este peste forma culturii.

 funcția privată showHandCursor (e: MouseEvent): void Mouse.cursor = MouseCursor.HAND; 

Pasul 29: Ascundeți cursorul mâinii

Restorează comportamentul original al cursorului mouse-ului.

 funcția privată hideHandCursor (e: MouseEvent): void Mouse.cursor = MouseCursor.AUTO; 

Pasul 30: Trageți trageți

Forma culturii va fi draggabilă, ceea ce va ajuta la selectarea cu ușurință a zonei dorite.

 funcția privată dragCrop (e: MouseEvent): void cropShape.startDrag (); 

Pasul 31: Opriți trasarea tragerii

Oprește trageți mouse-ul în sus.

 funcția privată stopDragCrop (e: MouseEvent): void cropShape.stopDrag (); 

Pasul 32: Funcția de tăiere

Această funcție se va ocupa de decuparea imaginilor, utilizând datele bitmap și clasa sprite pentru a crea o serie de miniaturi care vor fi ușor de salvat.

 funcția privată (e: MouseEvent): void 

Pasul 33: Datele Bitmap

Următoarele linii se ocupă de datele bitmap necesare pentru a decupa imaginea.

bmd = BitmapData nouă (image.width, image.height, false, 0x00000000); // Creează un nou obiect de date bitmap folosind dimensiunea imaginii principale bmd.draw (imagine); // Copiază datele principale ale imaginii în instanța bmd2 = BitmapData nou (cropShape.width, cropShape.height, false, 0x00000000); // Creează un nou bitmap utilizând dimensiunea reală a formei culturii

Pasul 34: Copierea pixelilor de imagine

Următoarea linie copiază pixelii imaginii principale situate în poziția formei culturii la obiectul de date bitmap BMP2.

Parametrii funcționează după cum urmează:

  • bmd: Datele bitmap sursă de copiat de la, imaginea principală
  • Dreptunghi: Specifică poziția pixelilor de copiat, poziția formei culturii
  • Punct: Specifică punctul pentru a începe copierea, din punctul 0 al dreptunghiului
bmd2.copyPixeli (bmd, nou dreptunghi (cropShape.x - imagine.x, cropShape.y - imagine.y, cropShape.width, cropShape.height), new Point (0, 0));

Pasul 35: Creați miniatură

Vom lăsa utilizatorul să se recolteze de șase ori și să salveze aceste previzualizări din partea laterală a imaginii principale, pentru aceasta vom crea un bitmap nou care va stoca datele bitmap ale miniaturii decupate și apoi îl vom adăuga ca o sprite de 90x70 pixeli.

De asemenea, adăugăm un ascultător pentru a mări și micșora miniaturile.

 în cazul în care (cropThumb < 6)  var bmp:Bitmap = new Bitmap(bmd2); var thumb:Sprite = new Sprite(); thumb.addChild(bmp); thumb.width = 90; thumb.height = 70; thumb.addEventListener(MouseEvent.MOUSE_UP, zoomThumb); addChild(thumb);

Pasul 36: Accesați miniaturile

Pe măsură ce creăm un nou sprite în fiecare recoltă, ultima sprite va fi inaccesibilă folosind numele instanței sale, timpul pentru a folosi matricea creată anterior.

Această matrice va memora miniaturile create pentru a le accesa în afara funcției.

images.push (degetul mare);

Pasul 37: Miniaturi Tween

Când utilizatorul apasă butonul de decupare, este creată o miniatură utilizând imaginea decupată, această miniatură este mai târziu animată pe laturile aplicației, în funcție de o variabilă.

Poziția miniaturilor este determinată de această variabilă și de thumbPos matrice.

tween = noul Tween (degetul mare, "x", Strong.easeOut, cropShape.x, thumbPosX [cropThumb], 0,5, true); tween = nou Tween (degetul mare, "y", Strong.easeOut, cropShift.y, thumbPosY [cropThumb], 0.5, true); cropThumb ++; // Adaugă unul la numărul de degete

Pasul 38: Salvați imaginea

Următoarea funcție este utilizată pentru a salva imaginea pe disc.

În primul rând, utilizează metoda jpg.encode () și salvează datele rezultate în tabloul de octeți, apoi obiectul fileReference este utilizat pentru a afișa un dialog de salvare în care utilizatorul poate redenumi fișierul creat (deși este setat un nume implicit).

 funcția privată saveImage (e: MouseEvent): void fileReference = FileReference nou (); byteArray = jpg.encode (actualCrop.bitmapData); fileReference.save (byteArray, "Crop.jpg"); fileReference.addEventListener (Event.COMPLETE, saveComplete); 

Pasul 39: Salvați complet

Odată ce imaginea este salvată, miniaturile sunt eliminate din scenă și din matrice. Butoanele sunt ascunse și imaginea principală revine.

 funcția privată saveComplete (e: Event): void pentru (var i: int = 0; i < images.length; i++)  removeChild(images[i]);  cropThumb = 0; images = []; tween = new Tween(image,"y",Strong.easeOut,image.y,stage.stageHeight / 2 - image.height / 2 - 30,0.5,true); added = false; saveButton.visible = false; cancelButton.visible = false; clearButton.visible = false; 

Pasul 40: Anulați

Există, de asemenea, un buton de anulare care vă va permite să răsfoiți miniaturile fără a salva niciuna dintre ele.

Când acest buton este apăsat, acesta returnează toate miniaturile în postică și aduce înapoi imaginea principală pentru a decupa mai mult (dacă este posibil).

 anularea funcției private (e: MouseEvent): void tween = nou Tween (currentSprite, "width", Strong.easeOut, currentSprite.width, 90,0,5, true); tween = Tween nou (currentSprite, "height", Strong.easeOut, currentSprite.height, 70,0,5, true); tween = noul Tween (currentSprite, "x", Strong.easeOut, currentSprite.x, latestX, 0.5, true); tween = noul Tween (currentSprite, "y", Strong.easeOut, currentSprite.y, latestY, 0.5, true); tween = nou Tween (imagine, "y", Strong.easeOut, imagine.y, stage.stageHeight / 2 - imagine.height / 2 - 30,0,5, true); added = false; saveButton.visible = false; cancelButton.visible = false; clearButton.visible = false; cropButton.visible = true; zoomed = false; 

Pasul 41: Ștergeți miniaturile

Dacă utilizatorul a decupat de 6 ori permisiunea aplicației și niciuna dintre ele nu este rezultatul așteptat, există întotdeauna o modalitate de a tăia și mai multe ori. Aceasta este sarcina pe care butonul clar îl va atinge.

Elimină toate miniaturile de pe scenă și din matrice, returnează imaginea principală în scenă și ascunde butoanele neutilizate.

 funcția privată clearThumbs (e: MouseEvent): void pentru (var i: int = 0; i < images.length; i++)  removeChild(images[i]);  cropThumb = 0; images = []; tween = new Tween(image,"y",Strong.easeOut,image.y,stage.stageHeight / 2 - image.height / 2 - 30,0.5,true); added = false; saveButton.visible = false; cancelButton.visible = false; clearButton.visible = false; 

Pasul 42: Clasa de documente


Vom folosi clasa de documente în acest tutorial, dacă nu știți cum să o utilizați sau sunteți puțin confuză vă rugăm să citiți acest QuickTip.


Concluzie

Rezultatul final este o aplicație utilă Image Cropping care vă învață cum să manipulați bitmap-urile pentru a le modifica și aproape fără a ști asta, ați învățat de asemenea cum să creați și să implementați o interfață foarte frumoasă.

Sper că ți-a plăcut acest tutorial, mulțumesc pentru lectură!

Cod