From window, to wind

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

スポンサーサイト

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

ニコニコ実況ガジェット

プログラムのネタがなかったので久しぶりにVistaのサイドバーガジェットを作りました。

ガジェットの内容は
・ニコニコ実況の各テレビ局のコメント速度を表示する
という物です。

ちょうどブラビアでニコニコ実況を表示できるようになったので
ネタ的に乗っかってみました。

最近PCばかりでテレビを見る機会が少なくなったので、
ニコニコ実況のコメント速度を常に確認できれば、
話題のTV番組を探せるのでは無いかと思って作りました。

ガジェット1

利用の際にはニコニコ実況SDKを導入する必要があります。
下記URLよりニコニコ実況SDKをダウンロードしてReadMeを読んで導入してください。
http://help.nicovideo.jp/jksdk/about/#006601

Windows Live Galleryは廃止されたので下記のシュガーシンクよりダウンロードください。
https://www.sugarsync.com/pf/D6841373_8623958_684574

追記)
Twitterの方で悪戦苦闘していたように、
作ったガジェットがWindows7の64bit版ではうまく動作しませんでした。
牟田口さんからのアドバイスでサイドバーに32bit版と64bit版があることを初めて知りました。
ニコニコ実況のjkNiCOM.dllの場所も確認したところProgram Files (x86)の方に入っており、
サイドバーを32bit版で起動しなくてはならないことが分かりました。

32bit版のサイドバーを動かす方法
http://www.youtube.com/watch?v=5usQpALRMwA
今後は32bit版のサイドバーを使っていく予定です。
でも、もし64bit版でしか動かない物が出てきたらどうするんだろう?
(既にNorton先生のガジェットが64bit版でしか表示されないのを確認しているのは内緒w)
スポンサーサイト

処理時間の謎

WPFのRectangleを大量に使ってStrokeでグリッド線を描いているのですが、
グリッド線の表示の有無の変更した際にかかる時間がかなり遅くて困っています。

下のコードでコメントアウトしている部分だけだと描画までにものすごく時間が掛ります(数十秒)。
一方でRectangleが入っている子要素を一度取り除いてから再度子要素を追加する処理を加えると
何故か描画時間が短くなります(それでも数秒掛りますが)。

理由が分かる方がいたら教えてください。

        //グリッド線の有無
private void gridCheck_Click(object sender, RoutedEventArgs e) {
//bitmap[resolutionIndex].setGridLine((bool)gridCheck.IsChecked);
if (interViewGrid != null) {
interViewGrid.Children.Clear();
interViewGrid.Children.Add(bitmap[resolutionIndex]);
bitmap[resolutionIndex].setGridLine((bool)gridCheck.IsChecked);
}
}

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

東芝の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;
}

HTML5のCanvasで画像表示(嘘)

えーと、タイトルにある通り嘘ですw

HTML5のCanvasを使っているのですが、
画像をJavaScriptで1ピクセルずつ四角形で塗りつぶしています。
(普通は画像ファイルを読み込んで描画)

ですのでファイルサイズがとっても大きいです(スクリプトのコード中に画像データが埋め込まれていると考えてください)。開く際はご注意を・・・
http://kagenyan.web.fc2.com/canvastest/canvastest.htm

このファイルを作る際に利用したツールのソースコードを置いておきます。
もともとはHTMLのテーブルタグで画像を表示するために作ったツールを流用した物なので、
テーブルタグ生成のコードも含まれているので、テーブルタグで描画したい人は
そちらをご利用してください(たぶんいない)。

ファイルサイズ的には Canvas > テーブルタグ ですねw

なお、このツールではプログレスバーは計算時間だけなので、
計算終了後コードをテキストボックスに表示するのに時間がかかるのでご注意ください。

まあ誰得って奴ですねw

【追記】
ファイルサイズが大きいのと処理が遅い原因として
ピクセルの書きだしのコードが一つ一つ埋め込まれていることにあります。

そこで画像のRGBデータを配列として、
for文で回すことにしました。
ファイルサイズもだいぶ小さくなり計算処理も早くなりました。
修正したメソッドも置いておきます。

まあ普通に気付けよってところですねw

ファミコンカラーで描画する処理[C#・WPF]

WPFのWriteableBitmapをファミコンカラー54色で描画する処理を作りました。
ファミコンカラーは下記のブログの色見本の画像からRGBデータを調べました。
NESカラー色見本ファイル(ファミコンカラー色見本ファイル

処理自体は単純で54色すべてについてRGBデータの距離を計算し、
一番近い色に置き換える処理となっています。
一部色斑が出るみたいなので前後左右の色と比較するような処理を組み込むべきかもしれませんね。
NESColor.jpg

他の言語の方でも似たような処理で出来ると思いますので、
RGBデータを含めてソースコードを置いておきます。
続きからご確認ください。

FC2Ad

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