‘C#’ タグのついている投稿

C# - FeliCaリーダでIDを読む

2008 年 8 月 11 日 月曜日

felicalibとC#用ラッパーを使ってFelicaのIDを読んだ。
参考:felicalib C#での利用方法

Reading felica ID
MNPして使わなくなった(財布機能1回も使ってない)auのお財布ケータイW51Sを乗せたところ。

普段使ってるSuicaを読むと違うIDが出てきた。

■作ったもの
080811_Felica.zip (VisualStudio2008 / C#3.0)
.NET Framework3.5が必要

■準備
RC-S320を使った。付属のCDからドライバだけインストールしておく。

SONY RC-S320 非接触ICカードリーダ/ライタ PaSoRi 「パソリ」
ソニー
売り上げランキング: 99
おすすめ度の平均: 4.5

4 あれば便利かもしれないが、無くても困らない製品
5 便利アイテムです
5 便利です。
5 飛行機に乗れなくてもマイルが貯まる
4 edyを常用してる人ならお勧め

felicalibをダウンロードしてくる。中にC#用ラッパー(FelicaLib.cs)も入っているので自分のプロジェクトに追加。
felicalib.dllは「参照の追加」から使うのではなく、bin/Debug, bin/Releaseなどにファイルを直接コピペして置く。実行時にFelicaLib.csからP/Invokeで読み込まれる。

■コード
ラッパーを読み込んで

using FelicaLib;

IDmを読むとbyte配列が来るので、Stringに直す。

try
{
  using (Felica felica = new Felica())
  {
    felica.Polling(0xFFFF);
    byte[] data = felica.IDm();
    String id = "";
    for (int i = 0; i < data.Length; i++)
    {
      id += data[i].ToString("X2");
    }
    Console.WriteLine(id); // ID出力
  }
}
catch (Exception ex)
{
  Console.Error.WriteLine(ex.Message);
}

C#3.0 - DirectShow.NET2.0でwebcam撮影、JPEG保存する

2008 年 6 月 17 日 火曜日

Windowsでカメラからの画像入力を使うには、Flash(Air)Processing、Max/MSPを除くとDirectXかVideo for Windowsを使わなければならないんだけど、これらをC#から直接使うのはとてもめんどい。

で、DirectX自体はラッパーを介して使えるので問題ないんだけど、DirectShow(カメラの入力に使う)だけはなぜかC#用のラッパーが無いのでDirectShow.NETの出番になる。このライブラリはs.h.log » DirectShow.NETで静止画キャプチャでも使ったんだけど、去年ぐらいからDirectShow.NETがver 2.0になってさらに良くなっていた。

ちょっといじってみたが、C++が苦手な馬鹿には便利すぎて感動したので、
webcam撮影→JPEG画像に保存のサンプルを作って置いておきます

■作ったもの
Download (VisualStudio 2008 + C#3.0)

昨日の朝にDirectShow.NET2.0でwebcamキャプチャ、JPEG保存 - 橋本詳解で書いたのとほぼ同じだが、デバイスの選択ができるようになった。
select capture devices

あと、DirectShow.NETを使えば、インストールすると1GBぐらいになるDirectX SDKを入れなくても済むのも嬉しい。

■プログラムの準備
まず準備としてDirectShow.NETのサイトからDirectShowLib-2005.dll本体と、サンプルを手に入れる。
DirectShowLib-2005.dllにパスを通し、sampleに入っているCapture.csもpublic domainなのでコピーしてありがたく使わせていただく。

そして、いくつか使うnamespaceを通す
using DirectShowLib;
using SnapShot;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;

■カメラデバイスを取得してプレビュー表示する
なんでもいいが、System.Windows.Forms.Controlを継承しているPanelやPictureBoxやFormなどを、カメラのプレビュー用に用意しなければならない。プレビューを画面に出したくなければVisible = falseしておけばいい。
そのコントロールをCaptureクラスのコンストラクタに渡してやると、cameraのプレビュー表示がリアルタイムに表示されるようになる。
Panel panelPreview = new Panel();
this.Controls.Add(panelPreview);
Capture cam = new Capture(0, 640, 480, 24, panelPreview); // device, x, y, 24FPS, preview

Capture()の第一引数は画像入力デバイスのindexで、0からはじまる。存在しないデバイスindexを選んでしまうとエラーになるので注意。FPSやカメラのXYサイズも指定できる。

■現在のカメラ表示を保存する
別のコントロールを用意して、そっちに保存する。今回のサンプルアプリの場合は、左の動画が右に静止画としてキャプチャされる。
PictureBoxにキャプチャするなら
PictureBox picBox = new PictureBox();
this.Controls.Add(picBox);
IntPtr m_ip = cam.Click();
Bitmap b = new Bitmap(cam.Width, cam.Height, cam.Stride, PixelFormat.Format24bppRgb, m_ip);
b.RotateFlip(RotateFlipType.RotateNoneFlipY); // 上下反転しているので直す
picBox.Image = b;

Image型で静止画をコピーできたので、JpegファイルやPNGファイルなどに書き出すのも簡単。
picBox.Image.Save("captured.jpg", ImageFormat.Jpeg);

もちろんPictureBoxを経由しないで、直接保存もできる
b.Image.Save("captured.jpg", ImageFormat.Png);

カメラを閉じるのを忘れずに。
FormのFormClosedイベント内などでDispose()を呼べば良い
cam.Dispose();

ちなみに、現在接続してあるデバイスの一覧はDsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)の中に入っている。
今回のサンプルでコンボボックスの中にデバイス名一覧を突っ込んだのはこんな感じでやった
comboBoxDevices.Items.Clear();
foreach (DsDevice ds in DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice))
{
  comboBoxDevices.Items.Add(ds.Name);
}
comboBoxDevices.SelectedIndex = 0;

ComboBox.SelectedIndexで現在選ばれたデバイス名のindexがわかって、それをCaptureのコンストラクタのデバイスindexとして使えば良い。

C# - Flickr.NETでFlickrアップローダ

2008 年 1 月 14 日 月曜日

前の記事に続き、Flickr.NETを使う。

今度はFlickr Uploaderを作ってみた。Flickr.NETには
・Flickr APIへの認証(read/write/delete権限の取得)
・ファイル名を指定してアップロード
などの機能が揃っているのでさくっと作れた。

できたもの => Archive
ドラッグアンドドロップした写真1枚をアップロードする
uploader

tagやtitleなどが適当に付いている
using Flickr.NET

■oAuthでの認証のためのtoken発行
今回はAPI keyに加えて、secretも使ってfrobを作ってtokenの発行を行わないといけない。
まずkeyとsecretを取りに行く→Flickr Services
その辺の仕組みは1つ前の記事と、
Flickr API の認証 - まちゅダイアリー (2005-11-01)
s.h.log: Flickr::Uploadで写真をアップロード
を参考に。

■プログラムを書く
まずfrobを作る。あとで使うのでとっておく(2回作ると違う値ができてしまうので)

Flickr flickr = new Flickr();
flickr.ApiKey = “your-api-key”;
flickr.ApiSecret = “your-api-secret”;
String flickr_frob = flickr.AuthGetFrob(); // frobの作成

で、認証画面をwebブラウザで開いて「OK」ボタンを押してもらう

System.Diagnostics.Process.Start(flickr.AuthCalcUrl(flickr_frob, AuthLevel.Write)); // 認証画面をブラウザで開く

OK押してもらってから、さっき作ったfrobを使ってtokenを取りに行く。

try{
Auth auth = flickr.AuthGetToken(flickr_frob);
flickr.AuthToken = auth.Token; // token取得
}
catch (FlickrApiException ex)
{
Console.WriteLine(ex.Message);
}

無事tokenを取って、Flickrオブジェクトにセットできたら、ファイル名を指定すればアップロードできる。tagやtitleやdescriptionを適当に付けてみた。

Photo p = new Photo();
p.PhotoId = flickr.UploadPicture(”PhotoFileName”, “test photo”, “これはてすとです”, “test,uploadertest”);
p.UserId = auth.User.UserId;
System.Diagnostics.Process.Start(p.WebUrl);

uploadされた写真のphotoIdが返ってくるので、それを使ってWeb上でのURLを求めることも出来る。今回はまたブラウザで開いてみた。

UploadPictureメソッドはどうやら内部でThread.Sleep()を呼んでいるみたいなので、そのままThreadで実行すればマルチスレッド化できる。
uploadを途中で止めるメソッドが無いみたいだけど、途中で止めたい時はスレッドで実行してAbort()してしまえば止まった。

詳しくは今回作ったアプリのソース参照

(more…)

C# - Flickr.NETでtag検索

2008 年 1 月 14 日 月曜日

Flickr.NETという.NET Framework用のライブラリを使って、Flickr APIからタグ検索してみた。2年ぐらい前に使った時より、dllのファイルサイズが1.5倍に増えててた。

できたもの => Archive
using Flickr.NET

■dllを手に入れる
FlickrNet API Library - Home
[Release]から2.1.5をダウンロードしてきた。
んで、[参照の追加]でリンクして、

using FlickrNet;

する。

■API keyを手に入れる
Flickr ServicesからAPI keyを手に入れないといけない。メールアドレスを登録してすぐ発行してもらえる。
今回は「デスクトップアプリ用」を選択。
(検索だけなら、secretとtokenを使ってoAuthで認証する必要は無い)

■プログラムを書く
Flickr APIのラッパーなので、基本的な仕様はFlickr APIの方を見た方が良い。
今回はflickr.photos.searchを叩いてみた。

まずFlickrというクラスが全ての根になっている

using FlickrNet;
Flickr flickr = new Flickr(”your-api-key”);

flickr.photos.searchでは色々なパラメータを渡すが、Flickr.NETではPhotoSearchOptionsクラスで集約されている。今回はタグだけでeveryoneから検索するのでこれだけだけど、もっと色々パラメータが指定できる。

PhotoSearchOptions opt = new PhotoSearchOptions();
opt.Tags = “food, sfc”;
opt.TagMode = TagMode.AllTags;
Photos photos = flickr.PhotosSearch(opt); // 検索

Photosクラスで返ってきた結果からURLを取り出して、表示する。
PictureBox.Imageにストリームから読み込ませるための関数 DownloadPicture(”URL”) を利用してダウンロードする。

Photo p = photos.PhotoCollection[0]; // 1枚目
pictureBox.Image = Image.FromStream(flickr.DownloadPicture(p.MediumUrl));
textBoxPhotoUri.Text = p.WebUrl;

(more…)