Flash: BitmapData.draw (Video) игнорирует высоту видео - PullRequest
0 голосов
/ 04 марта 2010

Я во многом новичок, когда дело доходит до 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, верно? : О)

В любом случае, спасибо за помощь "n00b".

p.s. Тот факт, что Flash использует Ctrl + Y для «возврата» вместо Ctrl + Shift + Z (как в Photoshop), заставляет меня хотеть flash.events.destroy(flash) или что-то в этом роде.

UPDATE

Я разобрался, как растянуть видео с 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 ]

2 голосов
/ 14 апреля 2010

Меня спросили, нашел ли я решение проблемы, и ответ - да.Я просто копирую и вставляю код действия из моего .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;
0 голосов
/ 06 апреля 2012

Для 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);
}
0 голосов
/ 04 марта 2010

Прежде всего, Ctrl + Shift + Z просто «отменяет» действия в Photoshop. Ctrl + Y повторяет:)

Во-вторых, высота и ширина вашего видео зависят от камеры, к которой оно прикреплено. Другими словами, если ваша камера установлена ​​на 320 на 240, она останется такой, если вы не измените высоту и ширину камеры. Плюс вы ошиблись: это

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

Таким образом, это означает, что вам нужно изменить высоту и ширину вашей камеры.

...