Cree una aplicación de recorte de imágenes en Flash con ActionScript 3

En este Tutorial Premium, aprenderemos a manipular los mapas de bits en ActionScript 3 para producir una aplicación útil de recorte de imágenes. Sigue leyendo!


Vista previa del resultado final

Imagen de Swami Stream con licencia de Creative Commons.


Paso 1: Descripción general

Usando las herramientas de Flash, crearemos una interfaz atractiva que estará activada por varias clases de ActionScript 3 como MouseCursor, Bitmap, BitmapData, Rectangle, Point, Tween, FileReference e incluso bibliotecas externas.

El usuario podrá recortar una imagen varias veces para luego seleccionar la mejor opción y guardarla en el disco..


Paso 2: Configurar Flash

Abra Flash y cree un documento de 600 píxeles de ancho y 400 píxeles de alto. Establecer la velocidad de fotogramas a 24 fps.



Paso 3: Interfaz


Una bonita interfaz parecida a una Mac potenciará nuestro código, esto implica múltiples botones basados ​​en la línea de tiempo, cursores personalizados y más.

Continúe con los siguientes pasos para aprender a crear esta GUI.


Paso 4: Antecedentes


No hay ciencia en el fondo, solo cree un rectángulo negro de 600x400px y céntrelo en el escenario. También puede cambiar el color de fondo en las Propiedades del escenario..


Paso 5: Imagen

Necesitaremos una imagen para recortar, seleccionar su imagen preferida e importarla al escenario (Cmd + R).



Imagen de Swami Stream con licencia de Creative Commons.


Paso 6: Cursor personalizado

Haremos un cursor personalizado para usarlo como retroalimentación para el usuario, permitiéndole saber dónde puede recortar..

Seleccione la herramienta Rectángulo (R) y haga un rectángulo blanco de 3px de ancho y 17px de altura.


Duplica la forma (Cmd + D) y gírala 90 grados para formar una cruz.


Repita este proceso con un rectángulo negro de 1 px de ancho y 15 px de alto.


Convierta la forma final a MovieClip (F8) y establezca su nombre de instancia en cursor.


Paso 7: Botones de acción

Estos botones manejan acciones secundarias basadas en el recorte, estas acciones son:

  • Salvar: Guarda el recorte actual.
  • Cancelar: Devuelve el recorte actual a su posición y devuelve la imagen original.
  • Claro: Borra todos los cultivos y recupera la imagen original..

Seleccione la Herramienta primitiva de rectángulo (R) y cambie el radio de la esquina a 10, dibuje un rectángulo de 70x18px y rellénelo con # 666666.


Duplique la forma (Cmd + D), cambie su tamaño a 68x16px y cambie su color a este gradiente lineal # 222222 a # 444444. Use la herramienta Transformación de degradado (F) para rotar el degradado.


A continuación, use la Herramienta de texto (T) para escribir una etiqueta para el botón. Utilice este formato: Lucida Grande Regular, 12 puntos, #CCCCCC.


Usa la misma técnica para crear los botones Cancelar y Borrar.



Paso 8: Línea de tiempo de botones

Un botón GUI bien hecho tiene 4 estados:

  • Arriba: El estado normal del botón..
  • Terminado: Los gráficos que se muestran cuando el cursor del mouse está sobre el botón.
  • Abajo: Se muestra cuando el mouse hace clic en el botón.
  • Golpear: El área donde el mouse puede hacer clic..

Convierta sus botones a MovieClip y haga doble clic en ellos para ingresar al modo de edición. Abra el panel de línea de tiempo (Ventana> Línea de tiempo).

Notarás que el Arriba El estado ya está creado, estas son las formas que convirtió a MovieClip..


Presione F6 para crear un nuevo Marco y cambie el relleno de degradado de la forma central a # 222222, # 5B5B5B. Este será el Terminado estado.


Para el Abajo Estado, seleccione la forma central y voltéela verticalmente (Modificar> Transformar> Girar vertical).


los Golpear el estado es por defecto, el área de forma más grande, ya que el área que se puede hacer clic es el botón completo, no habrá necesidad de crear un marco para este.


Paso 9: Nombres de posición e instancia

Cuando todos los botones estén listos, salga del modo de edición y colóquelos como se muestra en la siguiente captura de pantalla. El texto blanco indica el nombre de instancia del botón.



Paso 10: Barra de botones

Se utilizará una barra de botones para colocar y resaltar el botón de recorte.

Use la herramienta Rectángulo para crear un rectángulo de 600x50 px y rellénelo con este relleno degradado #AFAFAF a # C4C4C4. Alinea la barra en el fondo del escenario..


Para crear un efecto en relieve, dibuje dos líneas de 600x1px y colóquelas sobre la barra de botones, llene la superior con # 858585 y la otra con # D8D8D8.



Paso 11: Botón de recorte

El botón Recortar iniciará la función de ActionScript principal que manipulará los mapas de bits en el escenario.

Con la herramienta Rectángulo, cree rectángulos de 33x6px y 26x6px y úselos para formar un ángulo recto.


Duplica la forma y gírala 180 grados para formar un cuadrado.


Mueve la forma duplicada 5px hacia arriba y 5px hacia la derecha.


Rellene la forma resultante con este relleno degradado: # 444444 a # 222222. Utilice la herramienta de transformación de degradado para rotar el relleno.


Puedes agregar más detalles agregando una sombra; duplica la forma actual y muévela 1px hacia abajo y 1px hacia la derecha.


Por último, convierte la forma a MovieClip y nómbrela CultBotón.


Paso 12: Forma de la cosecha


La forma del recorte es una imagen que se utilizará para indicar el área que se recortará.

Seleccione la herramienta Rectángulo y cambie el color del trazo a blanco y el color de relleno a blanco con 1% alfa (esto nos ayudará a arrastrar la forma de recorte). Dibuje un cuadrado de 10x10px y céntrelo.


Seleccione una parte de 1px del cuadrado y cambie su color a negro.


Duplica la forma y haz lo mismo en todos los lados..


Repite este proceso en todos los lados..


Convertir el resultado a MovieClip y nombrarlo recortar, marca el Exportar para ActionScript caja.

Haga doble clic para ingresar al modo de edición, cree un nuevo fotograma clave en el marco 5 y gire la forma 180 grados.


Agrega 4 cuadros más y sale del modo de edición.

Esto termina la parte gráfica, comencemos con ActionScript.!


Paso 13: Nueva clase de ActionScript

Cree una nueva clase de ActionScript 3.0 (Cmd + N) y guárdela como Main.as en la carpeta de tu clase.



Paso 14: Paquete

La palabra clave del paquete le permite organizar su código en grupos que pueden ser importados por otros scripts, se recomienda nombrarlos comenzando con una letra minúscula y usar intercaps para las palabras subsiguientes, por ejemplo: mis clases. También es común nombrarlos usando el sitio web de su empresa: com.mycompany.classesType.myClass.

En este ejemplo, estamos usando una sola clase, por lo que realmente no hay necesidad de crear una carpeta de clases.

 paquete 

Paso 15: Directiva de importación

Estas son las clases que necesitaremos importar para que nuestra clase funcione, la importar La directiva hace que las clases y los paquetes definidos externamente estén disponibles para su código..

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

Paso 16: JPGEncoder


Para guardar el recorte de la imagen, usaremos una clase que forma parte de as3corelib. Sigue el enlace y descarga la biblioteca..


Paso 17: Declarar y Extender

Aquí declaramos la clase usando el clase palabra clave de definición seguida del nombre que queremos para la clase, recuerde que debe guardar el archivo con este nombre.

los se extiende palabra clave define una clase que es una subclase de otra clase. La subclase hereda todos los métodos, propiedades y funciones, de esa manera podemos usarlos en nuestra clase.

Clase pública Principal extiende Sprite 

Paso 18: Variables

Estas son las variables que usaremos, lea los comentarios en el código para obtener más información sobre ellas..

privado var cropShape: CropShape; // Esta es una instancia de cropShape que creamos antes de private var pointX: Number; // Esta var mantendrá la posición x donde se inicia la forma del recorte private var pointY: Number; // Esta var mantendrá la posición y donde se inicia la forma del recorte private var added: Boolean; // Comprueba si la forma del recorte está en la etapa imágenes privadas var: Array = new Array (); // Almacena los cultivos de imágenes privado var bmd: BitmapData; // Un objeto de datos de mapa de bits, utilizado para manipular los datos privados de la imagen principal var bmd2: BitmapData; // Un segundo objeto de datos de mapa de bits, este contendrá los datos de la imagen que queremos guardar. Var croppedImage privado: Sprite; // Mantiene las imágenes recortadas private var cropThumb: int = 0; // El número de pulgares ya creados privados var thumbPosX: Array = [5, 5, 5, 505, 505, 505]; // Almacena las posiciones x de los pulgares private var thumbPosY: Array = [37, 135, 233, 37, 135, 233]; // Almacena las posiciones y de los pulgares privados var tween: Tween; // Un objeto de interpolación, la biblioteca de animación predeterminada en flash private var fileReference: FileReference; // Se usa para guardar el archivo en el disco privado var byteArray: ByteArray; // Almacena datos binarios, utilizados para guardar el archivo en el disco privado var jpg: JPGEncoder = new JPGEncoder (); // El codificador de imagen privado var zoomed: Boolean; // Comprueba si la miniatura está ampliada o reducida en privado var currentCrop: Bitmap; // Mantiene la miniatura actual ampliada, la que se guardará en privado var currentSprite: *; // Se usa para saber qué pulgar está activo privado var latestX: Number; // Comprueba la última x del pulgar con zoom private var latestY: Number; // Comprueba la última y del pulgar ampliado

Paso 19: Constructor

El constructor es una función que se ejecuta cuando un objeto se crea a partir de una clase, este código es el primero en ejecutarse cuando se crea una instancia de un objeto o se ejecuta utilizando la Clase de documento.

 Función pública Main (): void 

Paso 20: Oyentes iniciales

Estos son los escuchas que se definirán en el lanzamiento, básicamente agregan eventos relacionados con el mouse a los botones.

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

Paso 21: Ocultar botones

Este código oculta los botones que no están en uso en este momento.

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

Paso 22: Agregar Cursor Personalizado

La siguiente función hace que el cursor personalizado esté visible cuando el puntero del mouse se encuentra sobre la imagen principal.

función privada customCursor (e: MouseEvent): void cursor.visible = true; Mouse.hide (); cursor.startDrag (true); 

Paso 23: quitar el cursor personalizado

Oculta el cursor personalizado cuando el puntero del mouse abandona la imagen principal..

función privada removeCustomCursor (e: MouseEvent): void cursor.visible = false; Mouse.show (); cursor.stopDrag (); 

Paso 24: Obtener punto de inicio

Una función muy importante, obtiene y almacena las coordenadas de clic del mouse y coloca el clip de película de recorte en ellas, el valor actual se usará más adelante para determinar el tamaño de la forma de recorte.

 función privada getStartPoint (e: MouseEvent): void pointX = mouseX; pointY = mouseY; if (! added) cropShape = new CropShape (); cropShape.x = pointX; cropShape.y = pointY; addChild (cropShape); agregado = verdadero;  else removeChild (cropShape); cropShape = nuevo CropShape (); cropShape.x = pointX; cropShape.y = pointY; addChild (cropShape); 

Paso 25: Oyentes de Crop Mouse

Agrega un oyente en la imagen principal para expandir la forma de recorte en el movimiento del mouse y agrega al oyente para que deje de expandirse en el mouse hacia arriba.

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

Paso 26: Dibuja la forma del cultivo

Expande el cropShape de acuerdo con las coordenadas guardadas y las actuales..

 función privada drawCropShape (e: MouseEvent): void cropShape.width = mouseX - pointX; cropShape.height = mouseY - pointY; 

Paso 27: Detener la forma del cultivo

Detiene la expansión de la forma del recorte y agrega algunos escuchas que serán utilizados por las siguientes funciones.

 función privada 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); 

Paso 28: Mostrar el cursor de mano

Utiliza la clase Mouse para manipular el cursor del mouse, este código mostrará el cursor de la mano cuando el mouse esté sobre la forma de recorte.

 función privada showHandCursor (e: MouseEvent): void Mouse.cursor = MouseCursor.HAND; 

Paso 29: Ocultar el cursor de la mano

Restaura el comportamiento original del cursor del mouse..

 función privada hideHandCursor (e: MouseEvent): void Mouse.cursor = MouseCursor.AUTO; 

Paso 30: Arrastrar Cultivo

La forma del recorte se podrá arrastrar, esto ayudará a seleccionar el área que deseamos fácilmente.

 función privada dragCrop (e: MouseEvent): void cropShape.startDrag (); 

Paso 31: Detener Arrastrar Cultivo

Detiene el arrastre en el mouse arriba.

 función privada stopDragCrop (e: MouseEvent): void cropShape.stopDrag (); 

Paso 32: Función de cultivo

Esta función manejará el recorte de la imagen, utilizando los datos de mapa de bits de las imágenes y la clase de sprite para crear una serie de miniaturas que se podrán guardar..

 función privada de cultivo (e: MouseEvent): void 

Paso 33: Datos de mapa de bits

Las siguientes líneas manejan los datos de mapa de bits necesarios para recortar la imagen.

bmd = new BitmapData (image.width, image.height, false, 0x00000000); // Crea un nuevo objeto de datos de mapa de bits utilizando el tamaño de la imagen principal bmd.draw (imagen); // Copia los datos de la imagen principal a la instancia bmd2 = new BitmapData (cropShape.width, cropShape.height, false, 0x00000000); // Crea un nuevo mapa de bits con el tamaño real de la forma de recorte

Paso 34: Copiar píxeles de imagen

La siguiente línea copia los píxeles de la imagen principal situada en la posición de forma de recorte al objeto de datos de mapa de bits bmp2.

Los parámetros funcionan como se detalla a continuación:

  • bmd: Los datos de mapa de bits de origen para copiar, la imagen principal
  • Rectángulo: Especifica la posición de los píxeles para copiar, la posición de forma de recorte
  • Punto: Especifica el punto para comenzar a copiar, desde el punto 0 del rectángulo.
bmd2.copyPixels (bmd, New Rectangle (cropShape.x - image.x, cropShape.y - image.y, cropShape.width, cropShape.height), nuevo Punto (0, 0));

Paso 35: Crear miniatura

Vamos a dejar que el usuario recorte seis veces y guardar esas vistas previas en el lado de la imagen principal, para eso, creamos un nuevo mapa de bits que almacenará los datos de mapa de bits de la miniatura recortada y luego lo agregamos como un sprite de 90x70px.

También agregamos un oyente para acercar y alejar la miniatura..

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

Paso 36: Acceder a la miniatura

A medida que creamos un nuevo sprite en cada recorte, el último sprite será inaccesible usando su nombre de instancia, el tiempo para usar la matriz que creamos antes.

Esta matriz almacenará las miniaturas creadas para acceder a ellas fuera de la función.

images.push (pulgar);

Paso 37: Tween Thumbnails

Cuando el usuario presiona el botón de recorte, se crea una miniatura con la imagen recortada, esta miniatura se anima más tarde a los lados de la aplicación en función de una variable.

La posición de la miniatura está determinada por esta variable y pulgarpos matrices.

tween = new Tween (pulgar, "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 ++; // Suma uno al número de pulgares.

Paso 38: Guardar imagen

La siguiente función se utiliza para guardar la imagen en el disco..

Primero, usa el método jpg.encode () y guarda los datos resultantes en la matriz de bytes, luego el objeto fileReference se usa para mostrar un cuadro de diálogo de guardado donde el usuario puede cambiar el nombre del archivo creado (aunque se establece un nombre predeterminado).

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

Paso 39: Guardar completo

Una vez que se guarda la imagen, las miniaturas se eliminan del escenario y de la matriz. Los botones están ocultos y la imagen principal vuelve..

 Función privada saveComplete (e: Evento): 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; 

Paso 40: Cancelar

También hay un botón de cancelación que le permitirá navegar a través de las miniaturas sin guardar ninguna de ellas..

Cuando se presiona este botón, todas las miniaturas vuelven a la posición seleccionada y la imagen principal vuelve a recortar más (si es posible).

 función privada 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 (imagen, "y", Strong.easeOut, image.y, stage.stageHeight / 2 - image.height / 2 - 30,0.5, true); añadido = falso; saveButton.visible = falso; cancelButton.visible = falso; clearButton.visible = false; cropButton.visible = true; zoom = falso; 

Paso 41: Borrar miniaturas

Si el usuario ha recortado las 6 veces permitidas por la aplicación, y ninguna de ellas es el resultado esperado, siempre hay una forma de recortar incluso más veces. Esta es la tarea que logrará el botón de borrar..

Elimina todas las miniaturas del escenario y de la matriz, devuelve la imagen principal al escenario y oculta los botones no utilizados.

 función privada 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; 

Paso 42: Clase de documento


Haremos uso de la Clase de documento en este tutorial, si no sabe cómo usarlo o si está un poco confundido, lea esta Sugerencia rápida.


Conclusión

El resultado final es una útil aplicación de Recorte de imágenes que le enseña cómo manipular mapas de bits para modificarlos, y casi sin saberlo, también aprendió cómo crear e implementar una interfaz muy agradable..

Espero que te haya gustado este tutorial, gracias por leer.!