2011-06-29 4 views
0

私は自分のウェブカメラを使用して自分自身のスナップショットを撮ってから、スケールと回転を変換して結果を保存することでこの画像を編集できるプロジェクトに取り組んでいます。ビットマップデータ.Draw()変換行列

私はほとんどの機能を持っています。ユーザーは自分自身のスナップショットを撮り、SenocularのTransform Toolを使用してオブジェクトを変換し、.draw()を使用してこの変形オブジェクトを保存します。問題は.draw()がステージの左上隅からデータを取得することだけです。変換されたオブジェクトを描画していますが、左上隅からのみ描画します。

なぜ左上隅から描画するのですか?キャプチャしたイメージが設定されている領域から描画するように座標を設定するにはどうすればよいですか?

ありがとうございました。

であるとしてあなたは、ファイルを表示することができます。http://s46264.gridserver.com/dev/dave/pb-photo/index.html

と私はあなたがステージ全体を描画して、あなたが使用したいピクセルを選択することができhttp://s46264.gridserver.com/dev/dave/pb-photo/pb-photo.zip

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.display.Sprite; 
import flash.geom.Matrix; 
import flash.net.FileReference; 
import com.adobe.images.JPGEncoder; 
import com.senocular.display.transform.*; 

// create container for captured image to apply Transform Tool to 
var box:Sprite = new Sprite(); 
addChild(box); 
box.graphics.beginFill(0xAACCDD); 
box.graphics.drawRect(-160, -120, 320, 240); // xreg, yreg, width, height (x-y = width-height/2 to set centered registration point) 
box.x = 520; 
box.y = 140; 

// create the Transform Tool 
var tool:TransformTool = new TransformTool(new ControlSetStandard()); 
addChild(tool); 

// select the box with the transform tool when clicked. 
// deselect when clicking on the stage 
box.addEventListener(MouseEvent.MOUSE_DOWN, tool.select); 
stage.addEventListener(MouseEvent.MOUSE_DOWN, tool.deselect); 

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 cam:Camera = Camera.getCamera(); 
cam.setQuality(bandwidth, quality); 
cam.setMode(320,240,30,false); // setMode(videoWidth, videoHeight, video fps, favor area) 
var video:Video = new Video(); 
video.attachCamera(cam); 
video.x = 20; 
video.y = 20; 
addChild(video); 

// create bitmap to hold initial capture and addChild to transform box 
var bitmapData:BitmapData = new BitmapData(video.width,video.height); 

var bitmap:Bitmap = new Bitmap(bitmapData); 
bitmap.x = -160; 
bitmap.y = -120; 
box.addChild(bitmap); 

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

function captureImage(e:MouseEvent):void { 
    snd.play(); 
    bitmapData.draw(video); 
    save_mc.buttonMode = true; 
    save_mc.addEventListener(MouseEvent.CLICK, onSaveJPG); 
    save_mc.alpha = 1; 
} 

save_mc.alpha = .5; 

// save transformed bmp to new object and addChild to holder_mc 
function onSaveJPG(e:Event):void{ 

    var m:Matrix = box.transform.matrix; 
    trace(m); 

    var bmp:BitmapData = new BitmapData(320, 240, true, 0xCCCCCCCC); 
    bmp.draw(box, m); 

    var newbmp:Bitmap = new Bitmap(bmp); 
    holder_mc.addChild(newbmp); 

} 

答えて

3

でFLAと関連するクラスをzip形式で圧縮しましたcopyPixels()。この方法は、:)

private function drawImage():void 
{ 
    var bmp:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight) 
    bmp.draw(stage); 

    var _newBmp:BitmapData = new bitmapData(WidthOfTheImage, HeightOfTheImage, TransParancy, FillColor); 
    _newBmp.copyPixels(bmp, new Rectangle(XofTheImage, YOftheImage, WidthOfTheImage, HeightOfTheImage), new point()); 
} 

_newBmp下に表示され、あなたが欲しいのBitmapDataです:)

+0

ありがとうございます。 – digitalpencil

5

Funnily十分な私は、現時点では非常に類似した何かに取り組んでいます。あなたは、マトリックスの一部として引き分けにxとyのオフセットを渡すことによって、あなたのターゲットの特定のエリアを描くことができます:

var bmd:BitmapData = new BitmapData(target.width,target.height,true,0); 
var mat:Matrix = new Matrix(1,0,0,1,-target.x,-target.y); 
bmd.draw(this,mat); 

注意をparticualrにマトリックスに渡されたxとyが負に設定されていること。

0

クリップの境界を取得すると、コピーしたい領域が正確に表示されます。

var bounds:Rectangle = mc.getBounds(mc); 
var bitmapData:BitmapData = new BitmapData(int(bounds.width + 0.5), int(bounds.height + 0.5), true, 0); 
bitmapData.draw(mc, new Matrix(1, 0, 0, 1, -bounds.x, -bounds.y)); 
関連する問題