WP TIPS に戻る

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 ファイルの出力

以下のコードでは、

  1. プロジェクトのコンテンツ(リソース) JPEG ファイルから BitmapImage→ WritableBitmap を経由して、ExtendedImage クラスに読み込む。
  2. 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
    ToImageExtendedImage を WritableBitmap に変換
    ToStreamExtendedImage のデータを読み込む/書き込むストリームを取得
    WritableBitmap
    ToImageWritableBitmap を 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 イベントが立ち上がってくるにもかかわらずデータが入っていない事があるため、バイナリダウンロード自体は別途行った方が良いかもしれません。