Lag et bildebeskjæringsprogram i Flash med ActionScript 3

I denne Premium-opplæringen lærer vi hvordan du manipulerer Bitmaps i ActionScript 3 for å lage et nyttig bildebeskjæringsprogram. Fortsett å lese!


Endelig resultatforhåndsvisning

Bilde av Swami Stream lisensiert under Creative Commons.


Trinn 1: Oversikt

Ved hjelp av Flash Tools vil vi opprette et attraktivt grensesnitt som vil bli drevet av flere ActionScript 3-klasser som MouseCursor, Bitmap, BitmapData, Rectangle, Point, Tween, FileReference og til og med eksterne biblioteker.

Brukeren vil kunne beskjære et bilde flere ganger for senere å velge det beste alternativet og lagre det på disk.


Trinn 2: Sett opp Flash

Åpne Flash og lag et 600 piksler bredt, 400 piksler høyt dokument. Still inn rammefrekvensen til 24fps.



Trinn 3: Grensesnitt


Et flott mac-lignende grensesnitt vil melde koden vår, dette innebærer flere tidslinjebaserte knapper, egendefinerte markører og mer.

Fortsett til de neste trinnene for å lære hvordan du oppretter denne GUI.


Trinn 4: Bakgrunn


Ingen vitenskap i bakgrunnen, bare opprett et svart rektangel på 600x400px og senter det i scenen. Du kan også endre bakgrunnsfargen i scenegenskapene.


Trinn 5: Bilde

Vi trenger et bilde for å beskjære, velg ønsket bilde og importer det til scenen (Cmd + R).



Bilde av Swami Stream lisensiert under Creative Commons.


Trinn 6: Tilpasset markør

Vi lager en tilpasset markør for å bruke den som tilbakemelding til brukeren, og lar ham få vite hvor han kan beskjære.

Velg Rectangle Tool (R) og lage et 3px bredt, 17px høyt hvitt rektangel.


Dupliser formen (Cmd + D) og roter den 90 grader for å danne et kryss.


Gjenta denne prosessen med et 1 px bredt, 15 px høyt svart rektangel.


Konverter den endelige formen til MovieClip (F8) og angi sitt forekomstnavn til markør.


Trinn 7: Handlingsknapper

Disse knappene håndterer sekundære handlinger basert på avlingen, disse handlingene er:

  • Lagre: Lagrer gjeldende avling.
  • Avbryt: Returnerer gjeldende avling til sin posisjon og bringer tilbake det opprinnelige bildet.
  • Klar: Sletter alle avlinger og bringer tilbake det opprinnelige bildet.

Velg Rectangle Primitive Tool (R) og endre hjørneradius til 10, tegne et 70x18px rektangel og fyll det med # 666666.


Dupliser formen (Cmd + D), resize den til 68x16px og endre fargen til denne lineære gradienten # 222222 til # 444444. Bruk Gradient Transform Tool (F) for å rotere graden.


Deretter bruker du tekstverktøyet (T) til å skrive en etikett for knappen. Bruk dette formatet: Lucida Grande Regular, 12pt, #CCCCCC.


Bruk samme teknikk for å opprette Avbryt og Slett-knappene.



Trinn 8: Knapper Tidslinje

En godt laget GUI-knapp har 4 stater:

  • Opp: Den vanlige tilstanden til knappen.
  • Over: Grafikken vises når musemarkøren er over knappen.
  • Ned: Vises når musen klikker på knappen.
  • Truffet: Området der musen kan klikke.

Konverter knappene dine til MovieClip og dobbeltklikk dem for å gå inn i redigeringsmodus. Åpne tidslinjepanelet (Vindu> Tidslinje).

Du vil legge merke til at Opp Status er allerede opprettet, dette er de figurene du konverterte til MovieClip.


Trykk F6 for å opprette en ny ramme og endre senterformgradgradientfyllingen til # 222222, # 5B5B5B. Dette vil være Over stat.


For Ned tilstand, velg midtformen og vri den vertikalt (Modifiser> Tranform> Flip Vertical).


De Truffet tilstand er som standard, jo større formområde, da det klikkbare området vi vil ha er hele knappen, er det ikke nødvendig å lage en ramme for dette.


Trinn 9: Stilling og forekomstnavn

Når alle knappene er klare, må du gå ut av redigeringsmodus og plassere dem som vist på følgende skjermbilde. Den hvite teksten indikerer knappens forekomstnavn.



Trinn 10: Knappelinje

En knappestang brukes til å plassere og markere avlingsknappen.

Bruk rektangulærverktøyet til å lage et 600x50 px rektangel og fyll det denne gradientfyllingen #AFAFAF til # C4C4C4. Juster stangen i bunnen av scenen.


For å lage en preget effekt trekker du to 600x1px linjer og legger dem over knappestangen, fyll den øverste med # 858585 og den andre med # D8D8D8.



Trinn 11: Crop Button

Crop-knappen starter Main ActionScript-funksjonen som vil manipulere bitmapene i scenen.

Med rektangulærverktøyet lager du en 33x6px og en 26x6px rektangler og bruker dem til å danne en riktig vinkel.


Dupliser formen og drei den 180 grader for å danne en firkant.


Flytt duplisert form 5px opp og 5px til høyre.


Fyll den resulterende formen med denne gradientfyllingen: # 444444 til # 222222. Bruk Gradient Transform Tool til å rotere fyllingen.


Du kan legge til flere detaljer ved å legge til en skygge; dupliser gjeldende form og flytt den 1px ned og 1px til høyre.


Til slutt konvertere formen til MovieClip og gi den navnet cropButton.


Trinn 12: Beskjæringsform


Beskjæringsformen er et bilde som skal brukes til å indikere området som skal beskjæres.

Velg rektangulærverktøyet og endre slagfargen til hvitt og fyll farge til hvitt med 1% alfa (dette vil hjelpe oss med å dra beskjæreformen). Tegn en 10x10px firkant og senter den.


Velg en 1px del av torget og endre fargen til svart.


Dupliser formen og gjør det samme på hele siden.


Gjenta denne prosessen på alle sider.


Konverter resultatet til MovieClip og navnet på det cropShape, merk av Eksporter for ActionScript eske.

Dobbeltklikk det for å gå inn i redigeringsmodus, opprett en ny Keyframe i ramme 5 og roter formen 180 grader.


Legg til 4 rammer mer og avslutt redigeringsmodus.

Dette slutter den grafiske delen, la oss starte med ActionScript!


Trinn 13: Ny ActionScript-klasse

Opprett en ny (Cmd + N) ActionScript 3.0-klasse og lagre den som Main.as i klassemappen din.



Trinn 14: Pakke

Pakkeordet gir deg mulighet til å organisere koden din i grupper som kan importeres av andre skript. Det anbefales å nevne dem med en liten bokstav og bruk sammenkoblinger for etterfølgende ord, for eksempel: timene mine. Det er også vanlig å navngi dem ved å bruke bedriftens nettsted: com.mycompany.classesType.myClass.

I dette eksemplet bruker vi en enkelt klasse, så det er egentlig ikke et behov for å lage en klassemappe.

 pakke 

Trinn 15: Import Direktiv

Dette er klassene vi må importere for vår klasse for å jobbe, importere Direktivet gir eksternt definerte klasser og pakker tilgjengelig for koden din.

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

Trinn 16: JPGEncoder


For å lagre bildeavlingen bruker vi en klasse som er en del av as3corelib. Følg lenken og last ned biblioteket.


Trinn 17: Deklarere og utvide

Her erklærer vi klassen ved hjelp av klasse definisjon søkeord etterfulgt av navnet vi ønsker for klassen, husk at du må lagre filen ved hjelp av dette navnet.

De strekker Søkeord definerer en klasse som er en underklasse av en annen klasse. Underklassen arver alle metodene, egenskapene og funksjonene, slik at vi kan bruke dem i vår klasse.

offentlig klasse Main utvider Sprite 

Trinn 18: Variabler

Dette er variablene vi skal bruke, les kommentarene i koden for å finne ut mer om dem.

privat var cropShape: CropShape; // Dette er en forekomst av cropShape vi opprettet før private var pointX: Number; // Denne varen vil holde x-posisjonen der skjæreformen startes privat var pointY: Number; // Denne varen vil holde y-posisjonen der beskjæreformen er startet, privat var lagt til: Boolsk; // Kontrollerer om beskjæreformen er i scenen private varbilder: Array = new Array (); // Lagrer bildene avlinger private var bmd: BitmapData; // En bitmap dataobjekt, som brukes til å manipulere hovedbildedataene private var bmd2: BitmapData; // En andre bitmap dataobjekt, denne vil holde dataene på bildet vi vil lagre private var croppedImage: Sprite; // Holder de beskjærte bildene private var cropThumb: int = 0; // Antall tommelen som allerede er opprettet private var thumbPosX: Array = [5, 5, 5, 505, 505, 505]; // Lagrer x-stillingene til tommelen private var thumbPosY: Array = [37, 135, 233, 37, 135, 233]; // Lagrer y-posisjonene til tommelen private var-tween: Tween; // En tweenobjekt, standard animasjonsbiblioteket i flash private var fileReference: FileReference; // Brukes til å lagre filen på disken privat var byteArray: ByteArray; // Lagrer binære data, brukes til å lagre filen på disken privat var jpg: JPGEncoder = ny JPGEncoder (); // Bildekoderen privat var zoomet: Boolsk; // Kontrollerer om miniatyrbildet er zoomet inn eller ut privat var currentCrop: Bitmap; // Holder gjeldende zoomte miniatyrbildet, den som vil bli lagret privat var nåværendeSkjul: *; // Viste å vite hvilken tommel er aktiv, privat var latestX: Number; // Kontrollerer siste x av den zoomede tommelen privat var sisteY: Nummer; // Kontrollerer siste y av den zoomede tommelen

Trinn 19: Konstruktør

Konstruktøren er en funksjon som kjører når et objekt er opprettet fra en klasse, denne koden er den første som skal utføres når du lager en forekomst av et objekt eller kjører ved hjelp av dokumentklassen.

 offentlig funksjon Main (): void 

Trinn 20: Innledende lyttere

Dette er lytterne som vil bli definert ved lansering, de legger i utgangspunktet musrelaterte hendelser til knapper.

image.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, avbryt); clearButton.addEventListener (MouseEvent.MOUSE_UP, clearThumbs);

Trinn 21: Skjul knapper

Denne koden skjuler knappene som ikke er i bruk for øyeblikket.

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

Trinn 22: Legg til egendefinert markør

Følgende funksjon gjør den egendefinerte markøren synlig når musepekeren er over hovedbildet.

privat funksjon customCursor (e: MouseEvent): void cursor.visible = true; Mouse.hide (); cursor.startDrag (true); 

Trinn 23: Fjern egendefinert markør

Skjuler egendefinert markør når musepekeren forlater hovedbildet.

privat funksjon removeCustomCursor (e: MouseEvent): void cursor.visible = false; Mouse.show (); cursor.stopDrag (); 

Trinn 24: Få startpunkt

En svært viktig funksjon, får og lagrer museklikkoordinatene og plasserer cropShape movieclip i dem, den nåværende verdien vil bli brukt senere for å bestemme størrelsen på beskjæreformen.

 privat funksjon getStartPoint (e: MouseEvent): void pointX = mouseX; pointY = mouseY; hvis (! lagt til) cropShape = new CropShape (); cropShape.x = pointX; cropShape.y = pointY; addChild (cropShape); lagt til = sant;  annet removeChild (cropShape); cropShape = nytt CropShape (); cropShape.x = pointX; cropShape.y = pointY; addChild (cropShape); 

Trinn 25: Beskjør muselyttere

Legger til en lytter i hovedbildet for å utvide beskjæringsformen på musebevegelsen og legger lytteren til å slutte å utvide på musen opp.

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

Trinn 26: Tegn beskjæringsform

Utvider cropShape etter de lagrede koordinatene og de nåværende.

 privat funksjon drawCropShape (e: MouseEvent): void cropShape.width = mouseX - pointX; cropShape.height = mouseY - pointY; 

Trinn 27: Stopp avskjæringsform

Stopper utbyggingen av beskjæreform og legger til noen lyttere som vil bli brukt av de neste funksjonene.

 privat funksjon 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); 

Trinn 28: Vis håndmarkør

Bruker musklassen til å manipulere musemarkøren, denne koden vil vise håndmarkøren når musen er over beskjæreformen.

 privat funksjon showHandCursor (e: MouseEvent): void Mouse.cursor = MouseCursor.HAND; 

Trinn 29: Skjul håndmarkør

Gjenoppretter musepekerenes opprinnelige oppførsel.

 privat funksjon hideHandCursor (e: MouseEvent): void Mouse.cursor = MouseCursor.AUTO; 

Trinn 30: Dra avlinger

Beskjæringsformen vil bli slepbar, dette vil hjelpe til med å velge området vi vil ha lett.

 privat funksjon dragCrop (e: MouseEvent): void cropShape.startDrag (); 

Trinn 31: Stopp dra avlinger

Stopper dra på musen opp.

 privat funksjon stopDragCrop (e: MouseEvent): void cropShape.stopDrag (); 

Trinn 32: Beskjæringsfunksjon

Denne funksjonen håndterer bildet beskjæring, ved hjelp av bildene bitmap data og sprite klassen for å lage en serie av miniatyrbilder som vil være elegant å lagre.

 privat funksjon avling (e: MouseEvent): void 

Trinn 33: Bitmapdata

De neste linjene håndterer bitmapdataene som kreves for å beskjære bildet.

bmd = ny BitmapData (image.width, image.height, false, 0x00000000); // Oppretter et nytt bitmap dataobjekt ved hjelp av størrelsen på hovedbildet bmd.draw (bilde); // Kopierer hovedbildedataene til forekomsten bmd2 = ny BitmapData (cropShape.width, cropShape.height, false, 0x00000000); // Oppretter en ny bitmap-data ved hjelp av den faktiske størrelsen på beskjæreformen

Trinn 34: Kopier bildepiksler

Neste linje kopierer pikslene til hovedbildet som er plassert i beskjæringsformposisjonen til bitmapdataobjektet BMP2.

Parametrene fungerer som beskrevet nedenfor:

  • BMD: Kildebitmapdataene som skal kopieres fra, hovedbildet
  • Rektangel: Angir plasseringen av pikslene for å kopiere, posisjonen for beskjæreform
  • Punkt: Angir punktet for å begynne å kopiere, fra rektangelets punkt 0
bmd2.copyPixels (bmd, nytt rektangel (cropShape.x - image.x, cropShape.y - image.y, cropShape.width, cropShape.height), nytt punkt (0, 0));

Trinn 35: Opprett miniatyrbilde

Vi skal la brukeren beskjære seks ganger og lagre forhåndsvisninger på siden av hovedbildet, for det lager vi en ny bitmap som lagrer bitmapdataene på den beskårne miniatyrbilden, og vi legger den til som en 90x70px sprite.

Vi legger også til en lytter for å zoome inn og ut miniatyrbildet.

 if (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);

Trinn 36: Få tilgang til miniatyrbilde

Når vi lager en ny sprite i hver avling, vil den siste sprite være utilgjengelig ved å bruke forekomstnavn, tid til å bruke oppsettet vi opprettet før.

Dette arrayet lagrer de opprettede miniatyrbildene for å få tilgang til dem utenfor funksjonen.

images.push (tommel);

Trinn 37: Tween Thumbnails

Når brukeren trykker på beskjæringsknappen, opprettes et miniatyrbilde ved hjelp av det beskårne bildet, blir dette miniatyrbildet animert senere på sidene av programmet, avhengig av en variabel.

Miniatyrposisjonen bestemmes av denne variabelen og thumbPos arrays.

tween = ny Tween (tommel, "x", Strong.easeOut, cropShape.x, thumbPosX [cropThumb], 0.5, true); tween = ny Tween (tommel, "y", Strong.easeOut, cropShape.y, thumbPosY [cropThumb], 0.5, true); cropThumb ++; // Legger til en til antall tommelfinger

Trinn 38: Lagre bilde

Den neste funksjonen brukes til å lagre bildet på disken.

Først bruker den metoden jpg.encode () og lagrer de resulterende dataene til byte-arrayet, så brukes filenReference-objektet til å vise en lagringsdialog hvor brukeren kan endre navn på filen som er opprettet (selv om et standardnavn er angitt).

 privat funksjon saveImage (e: MouseEvent): void fileReference = new FileReference (); byteArray = jpg.encode (currentCrop.bitmapData); fileReference.save (byteArray, "Crop.jpg"); fileReference.addEventListener (Event.COMPLETE, saveComplete); 

Trinn 39: Lagre Komplett

Når bildet er lagret, blir miniatyrbildene fjernet fra scenen og fra gruppen. Knappene er skjult og hovedbildet returnerer.

 privat funksjon saveComplete (e: Event): void for (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; 

Trinn 40: Avbryt

Det er også en avbryt-knapp som lar deg bla gjennom miniatyrbildene uten å lagre noen av dem.

Når denne knappen trykkes, returneres alle miniatyrbildene til postering og bringer hovedbildet tilbake for å beskjære mer (hvis mulig).

 privat funksjon avbryte (e: MouseEvent): void tween = ny Tween (currentSprite, "width", Strong.easeOut, currentSprite.width, 90,0.5, true); tween = ny Tween (currentSprite, "height", Strong.easeOut, currentSprite.height, 70,0.5, true); tween = ny Tween (currentSprite, "x", Strong.easeOut, currentSprite.x, latestX, 0.5, true); tween = ny Tween (currentSprite, "y", Strong.easeOut, currentSprite.y, latestY, 0.5, true); tween = ny Tween (image, "y", Strong.easeOut, image.y, stage.stageHeight / 2 - image.height / 2 - 30,0.5, true); lagt til = false; saveButton.visible = false; cancelButton.visible = false; clearButton.visible = false; cropButton.visible = true; zoomet = false; 

Trinn 41: Fjern miniatyrbilder

Hvis brukeren har beskjæret de seks ganger tillatt av appen, og ingen av dem er det forventede resultatet, er det alltid en måte å beskjære enda flere ganger på. Dette er oppgaven som den klare knappen vil oppnå.

Det fjerner alle miniatyrer fra scenen og fra matrisen, returnerer hovedbildet til scenen og skjuler de ubrukte knappene.

 privat funksjon clearThumbs (e: MouseEvent): void for (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; 

Trinn 42: Dokumentklasse


Vi bruker dokumentklassen i denne opplæringen, hvis du ikke vet hvordan du bruker den eller er litt forvirret, vennligst les denne QuickTip.


Konklusjon

Det endelige resultatet er en nyttig Image Cropping-applikasjon som lærer deg hvordan du manipulerer bitmaps for å endre dem, og nesten uten å vite det, lærte du også å lage og implementere et veldig fint grensesnitt.

Jeg håper du likte denne opplæringen, takk for å lese!