Creare un'applicazione per il ritaglio di immagini in Flash con ActionScript 3

In questo Tutorial Premium impareremo come manipolare Bitmap in ActionScript 3 per produrre un'applicazione utile per il ritaglio di immagini. Continua a leggere!


Anteprima del risultato finale

Immagine di Swami Stream con licenza Creative Commons.


Passaggio 1: panoramica

Usando gli strumenti di Flash creeremo un'interfaccia accattivante che sarà alimentata da diverse classi di ActionScript 3 come MouseCursor, Bitmap, BitmapData, Rectangle, Point, Tween, FileReference e persino librerie esterne.

L'utente sarà in grado di ritagliare più volte un'immagine per selezionare successivamente l'opzione migliore e salvarla sul disco.


Passaggio 2: impostare Flash

Apri Flash e crea un documento di 600 pixel di larghezza e 400 pixel di altezza. Imposta la frequenza dei fotogrammi su 24 fps.



Passaggio 3: interfaccia


Un'interfaccia simile a quella di mac darà forza al nostro codice, che coinvolge più pulsanti basati sulla timeline, cursori personalizzati e altro ancora.

Continuare con i passaggi successivi per imparare come creare questa GUI.


Passaggio 4: sfondo


Nessuna scienza in background, basta creare un rettangolo nero 600x400px e centrarlo sul palco. Puoi anche cambiare il colore di sfondo nelle Proprietà dello stage.


Passaggio 5: immagine

Avremo bisogno di un'immagine da ritagliare, selezionare l'immagine che preferisci e importarla sul palco (Cmd + R).



Immagine di Swami Stream con licenza Creative Commons.


Passaggio 6: cursore personalizzato

Creeremo un cursore personalizzato per utilizzarlo come feedback per l'utente, per fargli sapere dove può tagliare.

Seleziona lo strumento Rettangolo (R) e crea un rettangolo bianco largo 3px e 17px.


Duplica la forma (Cmd + D) e ruotala di 90 gradi per formare una croce.


Ripeti questo processo con un rettangolo nero alto 1px largo, 15 px.


Converti la forma finale in MovieClip (F8) e imposta il nome dell'istanza su cursore.


Passaggio 7: pulsanti di azione

Questi pulsanti gestiscono le azioni secondarie in base al ritaglio, queste azioni sono:

  • Salvare: Salva il raccolto corrente.
  • Annulla: Riporta il ritaglio corrente alla sua posizione e riporta l'immagine originale.
  • Chiaro: Cancella tutte le colture e riporta l'immagine originale.

Seleziona lo Strumento Rettangolo Primitivo (R) e modifica il raggio dell'angolo a 10, disegna un rettangolo 70x18 px e riempilo con # 666666.


Duplica la forma (Cmd + D), ridimensionala a 68x16 px e modifica il suo colore con questo gradiente lineare # 222222 a # 444444. Utilizzare lo strumento Trasformazione sfumatura (F) per ruotare la sfumatura.


Quindi, utilizzare lo strumento Testo (T) per scrivere un'etichetta per il pulsante. Usa questo formato: Lucida Grande Regular, 12pt, #CCCCCC.


Usa la stessa tecnica per creare i pulsanti Annulla e Cancella.



Step 8: Timeline dei pulsanti

Un pulsante GUI ben fatto ha 4 stati:

  • Su: Lo stato normale del pulsante.
  • Al di sopra di: La grafica visualizzata quando il cursore del mouse si trova sopra il pulsante.
  • Giù: Mostrato quando il mouse fa clic sul pulsante.
  • Colpire: L'area in cui il mouse può fare clic.

Converti i pulsanti in MovieClip e fai doppio clic su di essi per accedere alla modalità di modifica. Apri il pannello Timeline (Finestra> Timeline).

Noterai che il Su lo stato è già stato creato, queste sono le forme che hai convertito in MovieClip.


Premi F6 per creare un nuovo Frame e modifica il riempimento del gradiente di forma centrale con # 222222, # 5B5B5B. Questo sarà il Al di sopra di stato.


Per il Giù stato, selezionare la forma centrale e capovolgerla verticalmente (Modifica> Tranform> Capovolgi verticalmente).


Il Colpire lo stato è di default, l'area di forma più grande, poiché l'area cliccabile che vogliamo è l'intero pulsante, non ci sarà bisogno di creare una cornice per questo.


Passaggio 9: Nomi di posizione e di istanza

Quando tutti i tuoi pulsanti sono pronti, esci dalla modalità di modifica e posizionali come mostrato nella seguente schermata. Il testo bianco indica il nome dell'istanza del pulsante.



Passaggio 10: Barra dei pulsanti

Una barra dei pulsanti verrà utilizzata per posizionare ed evidenziare il pulsante di ritaglio.

Usa lo strumento Rettangolo per creare un rettangolo di 600x50 px e riempilo con questo riempimento sfumato #AFAFAF su # C4C4C4. Allinea la barra nella parte inferiore del palco.


Per creare un effetto rilievo, disegna due linee 600x1 px e posizionale sopra la barra dei pulsanti, riempi quella superiore con # 858585 e l'altra con # D8D8D8.



Passaggio 11: Pulsante Taglia

Il pulsante Ritaglia avvierà la funzione ActionScript principale che manipolerà le bitmap nello stage.

Con lo strumento rettangolo, crea un rettangolo 33x6 px e 26 x 6 px e utilizzali per formare un angolo retto.


Duplica la forma e ruotala di 180 gradi per formare un quadrato.


Sposta la forma duplicata 5px su e 5px a destra.


Riempi la forma risultante con questo riempimento sfumato: # 444444 a # 222222. Utilizzare lo strumento Trasformazione sfumatura per ruotare il riempimento.


Puoi aggiungere più dettagli aggiungendo un'ombra; duplica la forma corrente e spostala 1 px in basso e 1 px a destra.


Infine, converti la forma in MovieClip e assegnagli il nome cropButton.


Step 12: Crop Shape


La forma del ritaglio è un'immagine che verrà utilizzata per indicare l'area che verrà ritagliata.

Seleziona lo strumento Rettangolo e cambia il colore del tratto in bianco e il colore di riempimento in bianco con 1% alfa (questo ci aiuterà a trascinare la forma del ritaglio). Disegna un quadrato di 10 x 10 px e centralo.


Seleziona una parte 1px del quadrato e cambia il suo colore in nero.


Duplica la forma e fai lo stesso su tutto il lato.


Ripeti questo processo su tutti i lati.


Converti il ​​risultato in MovieClip e chiamalo cropShape, segnare il Esporta per ActionScript scatola.

Fare doppio clic per accedere alla modalità di modifica, creare un nuovo fotogramma chiave nel fotogramma 5 e ruotare la forma di 180 gradi.


Aggiungi altri 4 fotogrammi e esci dalla modalità di modifica.

Questo termina la parte grafica, iniziamo con ActionScript!


Passaggio 13: nuova classe ActionScript

Creare una nuova classe ActionScript 3.0 (Cmd + N) e salvarla come Main.as nella tua cartella di classe.



Step 14: Pacchetto

La parola chiave package ti consente di organizzare il tuo codice in gruppi che possono essere importati da altri script, si consiglia di nominarli partendo da una lettera minuscola e utilizzare gli intercaps per le parole successive, ad esempio: le mie classi. È anche comune denominarli utilizzando il sito Web della tua azienda: com.mycompany.classesType.myClass.

In questo esempio, stiamo usando una singola classe, quindi non c'è davvero bisogno di creare una cartella delle classi.

 pacchetto 

Step 15: Import Directive

Queste sono le classi che dovremo importare affinché la nostra classe funzioni, il importare direttiva rende disponibili classi e pacchetti definiti esternamente al codice.

 import flash.display.Sprite; import 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; importare fl.transitions.Tween; importare fl.transitions.easing.Strong; import flash.net.FileReference; import flash.utils.ByteArray; import com.adobe.images.JPGEncoder; import flash.events.Event;

Passaggio 16: JPGEncoder


Per salvare il ritaglio dell'immagine, useremo una classe che fa parte di as3corelib. Segui il link e scarica la libreria.


Passaggio 17: Dichiarazione ed estensione

Qui dichiariamo la classe usando il classe definizione della parola chiave seguita dal nome che vogliamo per la classe, ricorda che devi salvare il file usando questo nome.

Il si estende keyword definisce una classe che è una sottoclasse di un'altra classe. La sottoclasse eredita tutti i metodi, le proprietà e le funzioni, in questo modo possiamo usarli nella nostra classe.

public class Main estende Sprite 

Passaggio 18: variabili

Queste sono le variabili che useremo, leggere i commenti nel codice per saperne di più su di loro.

private var cropShape: CropShape; // Questa è un'istanza di cropShape creata prima del punto var privatoX: Number; // Questa variabile manterrà la posizione x in cui viene avviata la forma del ritaglio private var pointY: Number; // Questo varterrà la posizione y in cui viene avviata la forma del ritaglio var privata aggiunta: Boolean; // Controlla se la forma del raccolto è nelle immagini var private di stage: Array = new Array (); // Memorizza le immagini delle colture private var bmd: BitmapData; // Un oggetto dati bitmap, utilizzato per manipolare i dati dell'immagine principale private var bmd2: BitmapData; // Un secondo oggetto dati bitmap, questo conterrà i dati dell'immagine che vogliamo salvare private var croppedImage: Sprite; // Contiene le immagini ritagliate private var cropThumb: int = 0; // Il numero di pollici già creato private var thumbPosX: Array = [5, 5, 5, 505, 505, 505]; // Memorizza le posizioni x dei pollici private var thumbPosY: Array = [37, 135, 233, 37, 135, 233]; // Memorizza le posizioni y dei pollici interpolazione privata var: Tween; // Un oggetto interpolato, la libreria di animazione predefinita in flash private var fileRiferimento: FileReference; // Usato per salvare il file su disco private var byteArray: ByteArray; // Memorizza i dati binari, usati per salvare il file su disco private var jpg: JPGEncoder = new JPGEncoder (); // Il codificatore di immagini private var ingrandito: Boolean; // Controlla se l'anteprima è ingrandita o ridotta privativa var currentCrop: Bitmap; // Contiene l'anteprima zoomata corrente, quella che verrà salvata var varicorrente privato: *; // Utilizzato per sapere quale pollice è attivo var privato latestX: Number; // Controlla l'ultima x del pollice ingrandito var privativoY: Numero; // Controlla l'ultima y del pollice ingrandito

Passaggio 19: costruttore

Il costruttore è una funzione che viene eseguita quando viene creato un oggetto da una classe, questo codice è il primo ad essere eseguito quando si crea un'istanza di un oggetto o viene eseguita utilizzando la classe documento.

 funzione pubblica Main (): void 

Passaggio 20: ascoltatori iniziali

Questi sono gli ascoltatori che verranno definiti all'avvio, in pratica aggiungono eventi relativi al mouse ai pulsanti.

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

Passaggio 21: Nascondi pulsanti

Questo codice nasconde i pulsanti che non sono in uso al momento.

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

Passaggio 22: Aggiungi cursore personalizzato

La seguente funzione rende visibile il cursore personalizzato quando il puntatore del mouse si trova sopra l'immagine principale.

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

Passaggio 23: rimuovere il cursore personalizzato

Nasconde il cursore personalizzato quando il puntatore del mouse lascia l'immagine principale.

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

Passo 24: Ottieni punto di partenza

Una funzione molto importante, ottiene e memorizza le coordinate del clic del mouse e posiziona il clip di ritaglio cropShape in essi, il valore corrente verrà utilizzato in un secondo momento per determinare la dimensione della forma del ritaglio.

 funzione privata getStartPoint (e: MouseEvent): void pointX = mouseX; pointY = mouseY; if (! added) cropShape = new CropShape (); cropShape.x = pointX; cropShape.y = pointY; addChild (cropShape); aggiunto = true;  else removeChild (cropShape); cropShape = new CropShape (); cropShape.x = pointX; cropShape.y = pointY; addChild (cropShape); 

Passaggio 25: Ritaglia gli ascoltatori del mouse

Aggiunge un listener nell'immagine principale per espandere la forma del ritaglio sul movimento del mouse e aggiunge all'ascoltatore l'interruzione dell'espansione al passaggio del mouse.

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

Passaggio 26: Disegna forma ritaglio

Espande il cropShape in base alle coordinate salvate e quelle correnti.

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

Passaggio 27: interrompi la forma del ritaglio

Arresta l'espansione della forma del ritaglio e aggiunge alcuni listener che verranno utilizzati dalle funzioni successive.

 funzione privata 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); 

Passaggio 28: Mostra il cursore della mano

Usa la classe Mouse per manipolare il cursore del mouse, questo codice mostrerà il cursore Mano quando il mouse si trova sopra la forma di ritaglio.

 funzione privata showHandCursor (e: MouseEvent): void Mouse.cursor = MouseCursor.HAND; 

Passaggio 29: Nascondere il cursore della mano

Ripristina il comportamento originale del cursore del mouse.

 funzione privata hideHandCursor (e: MouseEvent): void Mouse.cursor = MouseCursor.AUTO; 

Passaggio 30: trascinare il ritaglio

La forma del raccolto sarà trascinabile, questo aiuterà a selezionare l'area che vogliamo facilmente.

 funzione privata dragCrop (e: MouseEvent): void cropShape.startDrag (); 

Passaggio 31: Interrompi Trascina ritaglio

Arresta il trascinamento del mouse verso l'alto.

 funzione privata stopDragCrop (e: MouseEvent): void cropShape.stopDrag (); 

Passaggio 32: Funzione di ritaglio

Questa funzione gestirà il ritaglio dell'immagine, utilizzando i dati bitmap delle immagini e la classe sprite per creare una serie di miniature che saranno elegibili per salvare.

 crop di funzioni private (e: MouseEvent): void 

Passaggio 33: Dati bitmap

Le righe successive gestiscono i dati bitmap richiesti per ritagliare l'immagine.

bmd = new BitmapData (image.width, image.height, false, 0x00000000); // Crea un nuovo oggetto dati bitmap usando la dimensione dell'immagine principale bmd.draw (immagine); // Copia i dati dell'immagine principale sull'istanza bmd2 = new BitmapData (cropShape.width, cropShape.height, false, 0x00000000); // Crea un nuovo dato bitmap utilizzando la dimensione effettiva della forma del ritaglio

Passaggio 34: copia i pixel dell'immagine

La riga successiva copia i pixel dell'immagine principale situati nella posizione della forma di ritaglio sull'oggetto dati bitmap BMP2.

I parametri funzionano come elencato di seguito:

  • BMD: I dati bitmap di origine da cui copiare, l'immagine principale
  • Rettangolo: Specifica la posizione dei pixel da copiare, la posizione della forma di ritaglio
  • Punto: Specifica il punto di inizio della copia, dal punto 0 del rettangolo
bmd2.copyPixels (bmd, new Rectangle (cropShape.x - image.x, cropShape.y - image.y, cropShape.width, cropShape.height), new Point (0, 0));

Passaggio 35: Creare un'anteprima

Lasciamo che l'utente ritiri sei volte e salvi quelle in anteprima a lato dell'immagine principale, per questo creiamo una nuova bitmap che memorizzerà i dati bitmap della miniatura ritagliata e quindi la aggiungiamo come sprite 90x70px.

Aggiungiamo anche un listener per ingrandire e ridurre la miniatura.

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

Passaggio 36: Anteprima di accesso

Quando creiamo un nuovo sprite in ogni crop, l'ultimo sprite sarà inaccessibile usando il suo nome di istanza, il tempo di usare l'array che abbiamo creato prima.

Questo array memorizzerà le miniature create per accedervi al di fuori della funzione.

images.push (pollice);

Passaggio 37: Tween Thumbnails

Quando l'utente preme il pulsante di ritaglio viene creata una miniatura utilizzando l'immagine ritagliata, questa miniatura viene successivamente animata ai lati dell'applicazione in base a una variabile.

La posizione dell'anteprima è determinata da questa variabile e il thumbPos array.

tween = new Tween (thumb, "x", Strong.easeOut, cropShape.x, thumbPosX [cropThumb], 0.5, true); tween = new Tween (thumb, "y", Strong.easeOut, cropShape.y, thumbPosY [cropThumb], 0.5, true); cropThumb ++; // Aggiunge uno al numero di pollici

Passaggio 38: Salva immagine

La funzione successiva viene utilizzata per salvare l'immagine sul disco.

Innanzitutto, utilizza il metodo jpg.encode () e salva i dati risultanti nell'array di byte, quindi l'oggetto fileReference viene utilizzato per visualizzare una finestra di dialogo di salvataggio in cui l'utente può rinominare il file creato (sebbene sia impostato un nome predefinito).

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

Passaggio 39: Salva completato

Una volta salvata l'immagine, le miniature vengono rimosse dallo stage e dall'array. I pulsanti sono nascosti e l'immagine principale ritorna.

 funzione privata 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; 

Passaggio 40: Annulla

C'è anche un pulsante Annulla che ti permetterà di sfogliare le miniature senza salvare nessuno di loro.

Quando viene premuto questo pulsante, restituisce tutte le miniature alla posizione e riporta l'immagine principale per ritagliare più (se possibile).

 funzione privata cancel (e: MouseEvent): void tween = new Tween (currentSprite, "width", Strong.easeOut, currentSprite.width, 90,0.5, true); tween = new Tween (currentSprite, "height", Strong.easeOut, currentSprite.height, 70,0.5, true); tween = new Tween (currentSprite, "x", Strong.easeOut, currentSprite.x, latestX, 0.5, true); tween = new Tween (currentSprite, "y", Strong.easeOut, currentSprite.y, latestY, 0.5, true); tween = new Tween (immagine, "y", Strong.easeOut, image.y, stage.stageHeight / 2 - image.height / 2 - 30,0.5, true); aggiunto = falso; saveButton.visible = false; cancelButton.visible = false; clearButton.visible = false; cropButton.visible = true; ingrandito = falso; 

Passaggio 41: Cancella miniature

Se l'utente ha ritagliato le 6 volte consentite dall'app, e nessuno di loro è il risultato previsto, c'è sempre un modo per ritagliare ancora più volte. Questo è il compito che otterrà il pulsante di cancellazione.

Rimuove tutte le anteprime dal palco e dall'array, restituisce l'immagine principale allo stage e nasconde i pulsanti non utilizzati.

 funzione privata 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; 

Passaggio 42: Classe documento


Faremo uso della Document Class in questo tutorial, se non sai come usarlo o sei un po 'confuso per favore leggi questo QuickTip.


Conclusione

Il risultato finale è una utile applicazione Image Cropping che ti insegna come manipolare le bitmap per modificarle, e quasi senza saperlo, hai anche imparato come creare e implementare un'interfaccia molto bella.

Spero che questo tutorial ti sia piaciuto, grazie per la lettura!