はじめに
前回は,
このPhotoCameraクラスには,
プレビューフレームを用いることで,
今回は,
CameraPreviewTest_
Barcode. zip
プレビューしながらリアルタイムエフェクト処理CameraPreviewTest_
ColorEffect. zip
プレビューしながらリアルタイムバーコード解析
ARGB32形式のプレビューフレームを取得してエフェクト処理を行う
冒頭の
Microsoft.
Windows Phone 7でもPCでも同じですが,
上位8ビットにはアルファ値が格納されています。このアルファ値は不透明度を表した値で,
下位24ビットにRGB値が格納されています。RGBとは三原色
プレビューフレームを取得するのは簡単です。例としてプレビューフレームをPhotoCamera.
// プレビューフレームを取得するバッファーを確保する
double pixelSize = camera.PreviewResolution.Width * camera.PreviewResolution.Height;
int[] pixelData = new int[(int)pixelSize];
// プレビューフレームを取得
camera.GetPreviewBufferArgb32(pixelData);
// 分離ストレージへARGBデータへ保存する
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
using (var strm = store.CreateFile("preview.rgb")) {
foreach (int pixel in pixelData) {
var bytes = BitConverter.GetBytes(pixel);
strm.Write(bytes, 0, bytes.Length);
}
}
上記のコードを実行すると,
前回紹介しましたIsolated Strage Explorer Toolを使ってデータを取り出してもよいのですが,
これでは,
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<!-- この矩形にカメラプレビューを表示する -->
<Rectangle x:Name="PreviewRectangle" Tap="PreviewRectangle_Tap">
<Rectangle.Fill>
<VideoBrush x:Name="PreviewBrush" />
</Rectangle.Fill>
</Rectangle>
<!-- エフェクト処理後の画像を表示する -->
<Image Height="310" x:Name="ImageEffect" Stretch="UniformToFill"
VerticalAlignment="Bottom" RenderTransformOrigin="0.5,0.5"
Margin="20,0,20,60" Width="401" />
</Grid>
Expression BlendでXAMLを表示すると下図のようになります。中央の枠がImageコントロールですので,
あとでエフェクト処理を掛けやすいように,
後ほどエフェクト処理を実装しますので,
public class FrameBuffer {
// 画像を格納するバッファ
public int[] Buffer { get; set; }
// バッファに格納する画像の幅
public int Width { get; set; }
// バッファに格納する画像の高さ
public int Height { get; set; }
public FrameBuffer(int width, int height) {
Buffer = new int[width * height];
Width = width;
Height = height;
}
public void EffectSepiaTone() {
// あとで紹介するメソッドです
}
}