- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- wp7/tips/image_readwrite_png へ行く。
- 1 (2011-12-08 (木) 19:33:32)
- 2 (2011-12-08 (木) 20:00:46)
PNG ファイルの出力、GIF ファイルの読み込み
サンプルプロジェクト Image_readwrite_png.zip
たいていの画像操作は JPEG で行うのですが、たまに PNG で出力したり GIF を読み込まなければならない事があります。
Silverlight では PNG の読み込みは出来ますが出力は出来ません。また GIF は読み書き両方ともサポートしていません。
が、.NET Image Tools というオープンソースライブラリを使用すると、PNG はもちろん GIF, BMP の入出力が出来ます。
.NET Image Tools のインストール
Nuget にも用意されているのですが Invalid NuGet package> という事なので、.NET Image Tools からパッケージをダウンロードし、bin\Phone\にある DLL を適当にコピーします。
あとは必要な DLL をプロジェクトの参照設定で追加して下さい。
必須 DLL は、
- ImageTools.dll
- ImageTools.Utils.dll
- PhoneCodeContractsAssemblies.dll
- ICSharpCode.SharpZLib.Phone.dll
で、
- ImageTools.IO.Png.dll
- ImageTools.IO.Gif.dll
などはエンコーダ/デコーダが必要なフォーマットの物だけ参照設定して下さい。
PNG ファイルの出力
以下のコードでは、
- プロジェクトのコンテンツ(リソース) JPEG ファイルから BitmapImage→ WritableBitmap を経由して、ExtendedImage クラスに読み込む。
- PngEncoder で ExtendedImage のデータをファイルストリームに出力
を行っています。
// リソースの Jpeg を読み込み PNG ファイルに出力する private void ReadJpegToPng() { // ストリームから JPEG を読み込む StreamResourceInfo info = Application.GetResourceStream(uri); BitmapImage bitmap = new BitmapImage(); bitmap.SetSource(info.Stream); WriteableBitmap wb = new WriteableBitmap(bitmap); // JPEG を ExtendedImage 形式に変換する ExtendedImage image = wb.ToImage(); // ストリームに PNG を出力する using (IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream stream = iso.OpenFile(output, System.IO.FileMode.Create)) { PngEncoder enc = new PngEncoder(); enc.Encode(image, stream); } } }
.NET Image Tools では、ImageTools.ExtendedImage クラスが画像フォーマットに限らない画像そのものを扱うクラスになっていて、このクラスと BitmapImage とのやりとりは、Stream や WriteableBitmap クラスを介して行います。
やりとりのメソッドは ExtendedImage.ToImage や ToStream メソッド、ImageTools.Utils.DLL を参照設定すると WritableBitmap クラスに追加される ToImage 拡張メソッドを使用します。
これとは別にストリームにあるデータをエンコード/デコードするのは、***Decoder / ***Encoder クラスを使用します。
- 拡張メソッドのリスト
ExtendedImage ToImage ExtendedImage を WritableBitmap に変換 ToStream ExtendedImage のデータを読み込む/書き込むストリームを取得 WritableBitmap ToImage WritableBitmap を ExtendedImage に変換
GIF ファイルの読み込み
この例では PNG とは違いストリームに入っている GIF を、ストリーム経由で使用して BitmapImage に読み込んでいます。
// 指定した URL の GIF をダウンロードして、表示する。 private void ReadGif(string url) { // デコーダを追加する ImageTools.IO.Decoders.AddDecoder<GifDecoder>(); // ExtendedImage を作成。ダウンロード完了したら表示する。 ExtendedImage image = new ExtendedImage(); image.DownloadCompleted += (s, args) => { try { // ExtendedImage から BitmapImage を作成。 ExtendedImage i = s as ExtendedImage; BitmapImage bitmap = new BitmapImage(); bitmap.SetSource(i.ToStream()); // 表示する。 this.image2.Source = bitmap; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } }; // ダウンロード開始 image.UriSource = new Uri(url, UriKind.Absolute); }
※ExtendedImage クラス単体で画像のダウンロードが出来るのですが、DownloadCompleted イベントが立ち上がってくるにもかかわらずデータが入っていない事があるため、バイナリダウンロード自体は別途行った方が良いかもしれません。