Flash:BitmapData.draw(视频)忽略视频高度

时间:2010-03-04 16:10:14

标签: flash actionscript-3 actionscript webcam bitmapdata

对于Flash来说,我几乎是最新秀。

这是actionscript(3):

// Here's the dumb-dumb:
/*****************************************************************/
/*****************************************************************/
function captureImage(e:MouseEvent):void {
    // The video still-image is captured and drawn...but at 320x240? Oh, and the real kicker is that it gets squeezed (resized), not cropped.
    bitmapData.draw(video);
}
/*****************************************************************/
/*****************************************************************/


// Here's the other relevant code...
/*****************************************************************/
var bandwidth:int = 0;
var quality:int = 100; 

var myWidth:int = 320; // the width for camera, video, and bitmaps.
var myHeight:int = 320; // the height for camera, video, and bitmaps.

var cam:Camera = Camera.getCamera();
cam.setQuality(bandwidth, quality);
cam.setMode(myWidth,myHeight,30,false); // (width, height, FPS, favorSize)

var video:Video = new Video();
    video.attachCamera(cam);
    video.x = 20;
    video.y = 20;
    // setting the video.width and video.height here makes the video appear in the desired aspect-ratio (1:1). If this is not set it defaults to 320x240.
    video.width = myWidth;
    video.height = myHeight;
addChild(video);

// 0xff0000 sets a red background just so I can see that the BitmapData "element" is 320x320 like it should be.
var bitmapData:BitmapData = new BitmapData(myWidth, myHeight, false, 0xff0000);

var bitmap:Bitmap = new Bitmap(bitmapData);
    bitmap.x = 360;
    bitmap.y = 20;
    bitmap.width=myWidth;
    bitmap.height=myHeight;
addChild(bitmap);


// capture_mc is my take-a-picture button. :-)
capture_mc.buttonMode = true;
capture_mc.addEventListener(MouseEvent.CLICK,captureImage);

那么,我在这里错过了什么。我知道Flash制造商并不坚持所有图像都应以4:3的宽高比显示,对吧? :O)

无论如何,感谢您帮助“n00b”。

P.S。 Flash使用Ctrl + Y来“重做”而不是Ctrl + Shift + Z(如Photoshop)这一事实让我想要flash.events.destroy(flash)或其他东西。

更新

我想出了如何将视频从240扩展到320.但是这样做的质量显着下降。以下代码包含 BOLD

中的更新部分

var bitmapData:BitmapData = new BitmapData(myWidth, 240 , false, 0xff0000);

var bitmap:Bitmap = new Bitmap(bitmapData);
bitmap.x = 360;
bitmap.y = 20;
bitmap.width=myWidth;
bitmap.height=240;
bitmap.scaleY=1.333; // ADDED scaleY
addChild(bitmap);

所以我仍然希望找到一种能够最大限度提高质量的解决方案。

3 个答案:

答案 0 :(得分:2)

有人问我是否找到了问题的解决方案,答案是肯定的。我只是复制+粘贴我的.fla中的动作脚本所以我不打算解释下面的代码(我实际上不记得一切都做了)。显然舞台上有物体,所以你无法插拔......对不起。请随意解释评论中发生的事情。 : - )

import flash.display.Bitmap;
import flash.display.BitmapData;
import com.adobe.images.PNGEncoder;
// for javascript
import flash.external.ExternalInterface;

var snd:Sound = new camerasound(); //new sound instance for the "capture" button click

var bandwidth:int = 0; // Maximum amount of bandwidth that the current outgoing video feed can use, in bytes per second.
var quality:int = 100; // This value is 0-100 with 1 being the lowest quality. 

var myWidth:int = 240;
var myHeight:int = 240;

var hiderD:BitmapData = new BitmapData(myWidth+4,myHeight+4,false,0xffffff);
var borderBox1:Bitmap = new Bitmap(hiderD);
borderBox1.x = 22;
borderBox1.y = 52;
borderBox1.width=hiderD.width;
borderBox1.height=hiderD.height;

var borderBox2:Bitmap = new Bitmap(hiderD);
borderBox2.x = 287;
borderBox2.y = 52;
borderBox2.width=hiderD.width;
borderBox2.height=hiderD.height;


addChild(borderBox1);
addChild(borderBox2);






var cam:Camera = Camera.getCamera();
cam.setQuality(bandwidth, quality);
cam.setMode(320, myHeight, 30, true); // setMode(videoWidth, videoHeight, video fps, favor area)

var video:Video = new Video();
video.attachCamera(cam);
video.x = -500;
video.y = -500;
addChild(video);

// display mode ONLY
var video2:Video = new Video();
video2.attachCamera(cam);
video2.x = -16;
video2.y = 54;
video2.width=320;
video2.height=myHeight;
var m:Shape = new Shape();
m.graphics.beginFill(0x0);
m.graphics.drawRect( 24, 54, 240, 240 ); // draw the mask
m.graphics.endFill(); // end the fill
video2.mask = m;

addChild(video2);


// used for sending
var bitmapData:BitmapData = new BitmapData(320,myHeight,false,0xFF0000);

// used for display
var bitmapData2:BitmapData = new BitmapData(320,myHeight,false,0xAAAAAA);
var bitmap2:Bitmap = new Bitmap(bitmapData2);
bitmap2.x = 249;
bitmap2.y = 54;
bitmap2.width=320;
bitmap2.height=myHeight;
var m2:Shape = new Shape();
m2.graphics.beginFill(0x0);
m2.graphics.drawRect( 289, 54, 240, 240 ); // draw the mask
m2.graphics.endFill(); // end the fill
bitmap2.mask=m2;
addChild(bitmap2);

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

function captureImage(e:MouseEvent):void {
    snd.play();

    bitmapData2.draw(video);

    bitmapData.draw(video);

    warn.visible = false;

    save_mc.buttonMode = true;
    save_mc.addEventListener(MouseEvent.CLICK, onSaveJPG);
    save_mc.alpha = 1;
}

save_mc.alpha = .5;


function onSaveJPG(e:Event):void{

    saving.visible = true;

    var byteArray:ByteArray = PNGEncoder.encode(bitmapData);

    var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");

    var saveJPG:URLRequest = new URLRequest("/utilities/saveImage.aspx");
    saveJPG.requestHeaders.push(header);
    saveJPG.method = URLRequestMethod.POST;
    saveJPG.data = byteArray;

    var urlLoader:URLLoader = new URLLoader();
    urlLoader.addEventListener(Event.COMPLETE, sendComplete);
    urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
    urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
    urlLoader.load(saveJPG);

    function sendComplete(event:Event):void{
        var loader:URLLoader = URLLoader(event.target);
        ExternalInterface.call("updateImageInputWithFileName",loader.data.filename);
        warn.visible = true;
        saving.visible = false;


        setTimeout(function(){warn.visible=false},10000);
    }
    function onIOError(event:Event):void{
        saving.visible = false;
        ExternalInterface.call("error", "Error", "Could not save image." ,"There was a problem saving the image. You can try again or contact an administrator for assistance.");
    }
}

warn.visible = false;
saving.visible = false;

答案 1 :(得分:0)

对于AS2应用矩阵变换:

import flash.display.BitmapData;
import flash.geom.Matrix;

capture_btn.onPress = function() {
   var cameraBMP= new BitmapData(video.width, video.height);
   var myMatrix:Matrix = new Matrix();
   myMatrix.scale(1.5, 1.5);
   cameraBMP.draw(video,myMatrix);
}

答案 2 :(得分:-1)

首先,Ctrl + Shift + Z只需“撤消”Photoshop中的操作即可。 Ctrl + Y重做:)

其次,视频的高度和宽度取决于它所连接的相机。换句话说,如果您的相机设置为320 x 240,那么它将保持这种状态,除非您更改相机的高度和宽度。另外你犯了一个错误:它是

video.videoHeight = myHeight;
video.videoWidth = myWidth;

因此,这意味着您必须更改相机的高度和宽度。