Guarde los datos de mapa de bits originales del video escalado en AS3

Tengo una aplicación de fotomatón flash (cámara web) que estoy tratando de terminar, pero parece que tengo problemas para guardar una imagen de 640x480 desde una ventana de video reducida. Parece que el video se está reduciendo bien, pero cuando lo dibujo en un mapa de bits, la foto se reduce aún más, así que tuve que crear una escala de matriz de 2.0 para cambiar el tamaño a 640x480 y no estoy seguro de si hacerlo está dañando el calidad de la imagen. No quiero usar ningún truco de cambio de tamaño (especialmente el aumento de escala).

Soy nuevo en AS3 así que por favor perdóname.

import flash.display.Bitmap;
import flash.display.BitmapData;
import com.adobe.images.JPGEncoder;

var cam:Camera = Camera.getCamera();
cam.setQuality(0, 100);
cam.setMode(640,480,30,true); // setMode(videoWidth, videoHeight, video fps, favor   area)
var video:Video = new Video();
video.attachCamera(cam);
video.x = 382;
video.y = 225;
video.width = 256;
video.height = 192;
addChild(video);

var bitmapData:BitmapData = new BitmapData(640,480);

var bitmap:Bitmap = new Bitmap(bitmapData);
bitmap.x = 648;
bitmap.y = 225;
bitmap.width = 256;
bitmap.height = 192;
addChildAt(bitmap, 18);

photoCapture.buttonMode = true;
photoCapture.addEventListener(MouseEvent.CLICK,captureImage);

aquí está la parte sucia...

function captureImage(e:MouseEvent):void {
var scale:Number=2.0;
var matrix:Matrix = new Matrix();
matrix.scale(scale, scale);
bitmapData.draw(video, matrix, null, null, null, true);

var jpgEncoder:JPGEncoder=new JPGEncoder(100);
var byteArray:ByteArray=jpgEncoder.encode(bitmapData);

var fileReference:FileReference=new FileReference();
fileReference.save(byteArray, ".jpg");
}

Básicamente, solo quiero dos cuadros pequeños de aproximadamente 256x192 que muestren la transmisión de video (640x480) y la foto capturada (640x480) y cuando guardo, en realidad guarda una imagen de 640x480.

preguntado el 22 de mayo de 12 a las 14:05

3 Respuestas

var video:Video = new Video(640, 480);

Esto debería evitar tener que usar una matriz. El video por defecto es 320x240.

contestado el 22 de mayo de 12 a las 17:05

  • Primero creas un video 256x192
  • luego creas un bitmapData 640x480
  • luego reduce estos datos de mapa de bits (bueno, el mapa de bits en realidad) a 256x192
  • luego intenta dibujar un video pequeño en un mapa de bits grande (datos); no es de extrañar que tenga que mejorar

Cree BitmapData, Bitmap y Video en el mismo tamaño y todo debería estar bien.

Si desea que la imagen final sea de 640x480, debe crear video, mapa de bits, datos de mapa de bits en este tamaño, luego agregar el video a un MovieClip/Sprite (contenedor) vacío y escalar el contenedor para que quepa en la pantalla.

contestado el 22 de mayo de 12 a las 17:05

Terminé usando video.scaleX/Y para reducir el tamaño en el escenario, dejando los datos de video/mapa de bits en sus dimensiones originales. - bfritz

private var cam:Camera;
private var myVideo:Video;

    private function attachCamera():void
    {

        cam = Camera.getCamera();
        cam.setMode(8192,6144,30,true);
        cam.setQuality(0,100);


        myVideo = new Video(160,120);


        //Flip preview on camera and result!
        var flip:Matrix = new Matrix();
        flip.scale(-1,1)
        flip.translate(myVideo.width,0)


        myVideo.transform.matrix = flip;

        myVideo.attachCamera(cam);

        videoDisplay.addChild(myVideo);

    }

    private function takePicture():void
    {

        var bd:BitmapData = new BitmapData(cam.width,cam.height);
            //fill db with source bitmap!!!
            cam.drawToBitmapData(bd)

        //Then the bd contains the highest possible camera source!
        // But videoDisplay show's small preview!


    }   

contestado el 18 de mayo de 14 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.