#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://http://imagetools.codeplex.com/]] というオープンソースライブラリを使用すると、PNG はもちろん GIF, BMP の入出力が出来ます。
が、[[.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://http://imagetools.codeplex.com/]] からパッケージをダウンロードし、bin\Phone\にある DLL を適当にコピーします。
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 イベントが立ち上がってくるにもかかわらずデータが入っていない事があるため、バイナリダウンロード自体は別途行った方が良いかもしれません。