1

クリック イベントでビデオブラシ表示の「スナップショット」を取得しようとしていますが、何らかの理由でこのスナップショットを正しく表示できません。

double height = Application.Current.Host.Content.ActualHeight;

//Capture the screen           
private void freeze_Click(object sender, EventArgs e)
{
        // Takes the preview buffer pixel array from camera and returns
        // an array of pixels representing the camera's preview buffer
        int[] previewBuffer = GetPreviewBuffer();

        //Process the preview image
        int[] imageData = PhotofunDataContext.SelectedEffect.Effect.ProcessImage(previewBuffer);

        //Copy to WriteableBitmap
        //previewWriteableBitmap = new WriteableBitmap((int)camera.PreviewResolution.Width, (int)camera.PreviewResolution.Height);
        WriteableBitmap freezeWriteableBitmap = new WriteableBitmap((int)camera.PreviewResolution.Width, (int)camera.PreviewResolution.Height);

        imageData.CopyTo(freezeWriteableBitmap.Pixels, 0);

        freezeWriteableBitmap.Invalidate();  

        //Display that on the screen
        FreezeImage.Source = freezeWriteableBitmap;

        //height of device
        FreezeImage.Width = height;
        //width to maintain 4:3 aspect ratio
        FreezeImage.Height = height * (.75);

        FreezeImage.Opacity = 1;

        }

}

//Get the preview buffer
private int[] GetPreviewBuffer()
{
        int[] pixelData = new int[(int)(camera.PreviewResolution.Width * camera.PreviewResolution.Height)];
        //int[] pixelData = new int[(int)width * (int)height];
        camera.GetPreviewBufferArgb32(pixelData);
        return pixelData;
}

上記のコードは、ビデオブラシのスナップショットを取得し、現在アクティブなビデオブラシの上にフリーズ フレームとして表示するためのものです。

<Rectangle x:Name="videoRectangle" Width="1" Height="1" HorizontalAlignment="Center">
            <Rectangle.Fill>
                <VideoBrush x:Name="viewfinderBrush" >
                    <VideoBrush.RelativeTransform>
                        <CompositeTransform x:Name="viewfinderTransform" Rotation="90"
                                            CenterX="0.5" CenterY="0.5"/>
                    </VideoBrush.RelativeTransform>
                </VideoBrush>                    
            </Rectangle.Fill>
        </Rectangle>

        <Image x:Name="FreezeImage" Opacity="0" HorizontalAlignment="Center" Stretch="Fill" Canvas.ZIndex="900">
            <Image.Projection>
                <PlaneProjection RotationZ="-90"/>
            </Image.Projection>
        </Image>        

FreezeImage は現在、アクティブなビデオブラシにオーバーレイされていますが、画像のサイズは電話のサイズと一致しません。FreezeImage を縦長モードで電話画面全体に引き延ばさずに合わせたいと思います。

画像が電話の画面に合わせてサイズ変更されたときに、カメラの自然な 4:3 縦横比を設定FreezeImage.Width = height;FreezeImage.Height = height * (.75);て維持しようとしましたが、これはプレビューバッファと FreezeWriteableBitmap のサイズ (640x480) を上書きしません。

また、プレビューバッファと FreezeWriteableBitmap の width(=1064) と height(=800) の寸法をハードコーディングしようとしましたが、画像がまったく表示されません (writeableBitmap がカメラの寸法以外の値を受け入れないように)。

カメラの初期化で遊んだ後、解像度の設定に関係なく、writeableBitmaps は常にデフォルトで 640x480 になることがわかりました。これは、このアスペクト比が電話に実際に表示されるものであるように思われるため、問題があるに違いないと思います。画面。結果のfreezeImageの高さが電話画面の高さと一致し、幅が調整されてストレッチが実行されないように、この実装を修正するにはどうすればよいですか?

注: 設定時の高さの値は、現在の標準である 480x800 以外のサイズの将来の WP7 デバイスを考慮して、設定FreezeImage.Width = height;によってFreezeImage.Height = height * (.75);検出されます。double height = Application.Current.Host.Content.ActualHeight;

4

0 に答える 0