From window, to wind

趣味のゲームとJavaプログラムなどについて 適当に書き綴るブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

モザイクプレイヤー作ってみた

東芝のMindTuneとWPFを使ってモザイクプレイヤーを作ってみました。
脳波センサから集中力を計測して、集中力が低いとモザイク状に動画が表示されます。
脳波センサのデータ取得は前に書いたブログの記事中のリンクを参考にしてください。



動画の中でちょっとだけ触れていますが、モザイク状に描画する処理がこちらになります。
        private void drawMosaicImage() {
getbmp = new RenderTargetBitmap((int)mediaElement1.ActualWidth, (int)mediaElement1.ActualHeight, 96, 96, PixelFormats.Pbgra32);
getbmp.Render(mediaElement1);

viewbmp = new WriteableBitmap(getbmp);


int channel = 4;
int width = getbmp.PixelWidth;
int height = getbmp.PixelHeight;
int stride = width * ((getbmp.Format.BitsPerPixel + 7) / 8);
byte[] pxdata = new byte[width * height * channel];
byte[] outdata = new byte[width * height * channel];
getbmp.CopyPixels(pxdata, stride, 0);

for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int x = (i / square) * square;
int y = (j / square) * square;
double Y;
switch (viewcase) {
case 1://反転
outdata[(i + j * width) * channel + 0] = (byte)(255 - pxdata[(x + y * width) * channel + 0]);
outdata[(i + j * width) * channel + 1] = (byte)(255 - pxdata[(x + y * width) * channel + 1]);
outdata[(i + j * width) * channel + 2] = (byte)(255 - pxdata[(x + y * width) * channel + 2]);
outdata[(i + j * width) * channel + 3] = pxdata[(x + y * width) * channel + 3];
break;
case 2://白黒
Y = (byte)(0.299 * pxdata[(x + y * width) * channel + 2] + 0.587 * pxdata[(x + y * width) * channel + 1] + 0.114 * pxdata[(x + y * width) * channel + 0]);
outdata[(i + j * width) * channel + 0] = (byte)Y;
outdata[(i + j * width) * channel + 1] = (byte)Y;
outdata[(i + j * width) * channel + 2] = (byte)Y;
outdata[(i + j * width) * channel + 3] = pxdata[(x + y * width) * channel + 3];
break;
case 3://セピア
Y = (0.299 * pxdata[(x + y * width) * channel + 2] + 0.587 * pxdata[(x + y * width) * channel + 1] + 0.114 * pxdata[(x + y * width) * channel + 0]);
double blue = (Y - 40.372);//b
if (blue > 255) blue = 255; else if (blue < 0) blue = 0;
double green = (Y - 2.17549);//g
if (green > 255) green = 255; else if (green < 0) green = 0;
double red = (Y + 20.10767);//r
if (red > 255) red = 255; else if (red < 0) red = 0;
outdata[(i + j * width) * channel + 0] = (byte)blue;//b
outdata[(i + j * width) * channel + 1] = (byte)green;//g
outdata[(i + j * width) * channel + 2] = (byte)red;//r
//outdata[(i + j * width) * channel + 0] = (byte)(Y*0.4);//b
//outdata[(i + j * width) * channel + 1] = (byte)(Y*0.7);//g
//outdata[(i + j * width) * channel + 2] = (byte)(Y);//r
outdata[(i + j * width) * channel + 3] = pxdata[(x + y * width) * channel + 3];
break;
default://非処理
outdata[(i + j * width) * channel + 0] = pxdata[(x + y * width) * channel + 0];
outdata[(i + j * width) * channel + 1] = pxdata[(x + y * width) * channel + 1];
outdata[(i + j * width) * channel + 2] = pxdata[(x + y * width) * channel + 2];
outdata[(i + j * width) * channel + 3] = pxdata[(x + y * width) * channel + 3];
break;
}

}


}

viewbmp.WritePixels(new Int32Rect(0, 0, width, height), outdata, stride, 0);

image1.Source = viewbmp;
}
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://kagenyan.blog69.fc2.com/tb.php/144-1131c1b2
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。