0

当谈到 Flash 时,我几乎是最菜鸟的菜鸟。

这是动作脚本(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”。

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

所以我仍然想找到一个最大限度地提高质量的解决方案。

4

3 回答 3

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;
于 2010-04-14T13:27:40.550 回答
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);
}
于 2012-04-06T02:15:36.420 回答
-1

First off, Ctrl+Shift+Z simply "undoes" the actions in Photoshop. Ctrl+Y redoes :)

Secondly, the height and width of your video depend on the camera it is attached to. In other words, if your camera is set to 320 by 240, then it will stay that way, unless you change the camera's height and width. Plus you made a mistake: it's

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

Thus, this means that you have to change your camera's height and width.

于 2010-03-04T16:21:21.693 回答