• 追加された行はこの色です。
  • 削除された行はこの色です。
#setlinebreak(on);
[[WP TIPS に戻る>wp7/tips]]

*PNG ファイルの出力、GIF ファイルの読み込み [#vf067792]
サンプルプロジェクト [[Image_readwrite_png.zip>https://skydrive.live.com/redir.aspx?cid=793b87c06d2f0cd5&resid=793B87C06D2F0CD5!1898&parid=793B87C06D2F0CD5!223]]

たいていの画像操作は JPEG で行うのですが、たまに PNG で出力したり GIF を読み込まなければならない事があります。
Silverlight では PNG の読み込みは出来ますが出力は出来ません。また GIF は読み書き両方ともサポートしていません。

が、[[.NET Image Tools>http://imagetools.codeplex.com/]] というオープンソースライブラリを使用すると、PNG はもちろん GIF, BMP の入出力が出来ます。

**.NET Image Tools のインストール [#icc9f966]
Nuget にも用意されているのですが [[Invalid NuGet package>>http://imagetools.codeplex.com/discussions/275972]] という事なので、[[.NET Image Tools>http://imagetools.codeplex.com/]] からパッケージをダウンロードし、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 ファイルの出力 [#gdd7d34e]
以下のコードでは、

+プロジェクトのコンテンツ(リソース) 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 ファイルの読み込み [#u8f04cf9]
この例では 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 イベントが立ち上がってくるにもかかわらずデータが入っていない事があるため、バイナリダウンロード自体は別途行った方が良いかもしれません。