FANDOM


.NET での画像の扱い 編集

Object
DispathcerObject
DependencyObject
Freezable
Animatable
ImageSource
BitmapSource
BitmapFrame
BitmapImage
DrawingImage

画像の読み込み 編集

WPFではBitmapImageまたはBitmapFrameを使って画像を読み込みます。 このBitmapImageやBitmapFrameには、ローカルディスクからだけでなくインターネット上の画像もURLを指定することで自動的にダウンロードを行い画像を取得することができます。

BitmapImageやBitmapFrameはWPFアプリケーションへ簡単に画像を表示することを目的とした設計となっています。 よって、画像自体に処理を施すことはできません。(例えば、画像にテキストを入れるなどの処理は、このクラスを使って行うことはできない)

BitmapImage image = new BitmapImage();  
image.BeginInit();  
image.UriSource = new Uri(@"/resources/assets/image/folder.png");  
image.EndInit();  
 
// MXMLのImage(System.Windows.Controls.Image)へ画像を表示  
myImage.source = image;


URLの画像をダウンロードして読み込み 編集

WebClient.DownloadData関数を使ってURLが示す画像をダウンロードし変数に格納します。
1度にすべてのバイトを読み込み変数に格納するため大きな画像を読み込む場合は、使用メモリ量に注意が必要となります。

Uri uri = new Uri("ここにダウンロードする画像のURLを入力");
 
BufferImage LoadNetImage(Uri uri)
{
	try{
		using(WebClient web = new WebClient())
		{
			var buffer = web.DownloadData(uri); // 画像をダウンロード。
												// ダウンロードした画像はバイト列として変数に格納される。
			using(MemoryStream memory = new MemoryStream(buffer))
			{
				BitmapImage bi = new BitmapImage();
				bi.BeginInit();
				bi.CacheOption = BitmapCacheOption.OnLoad;
				bi.StreamSource = memory;
				bi.EndInit();
				bi.Freeze();
				return bi;
			}
		}
	}
	catch(WebException exp)
	{
		if(exp.Status == WebExceptionStatus.ProtocolError)
		{
			// HTTPプロトコルエラー。
			// 500や505などのHTTPプロコトルエラー
			return null;
		}
		return null;
	}
	catch(Exception exp)
	{
		return null;
	}
 
}


バイト列で読み込み 編集

ファイル操作にあるようなバイトストリームを使ってバイナリを読み込みます。

private byte[] LoadImage(string filePath)
{
    FileStream fs = new FileStream(filePath, FileMode.Open,FileAccess.Read);
 
    BinaryReader br = new BinaryReader(fs);
    byte[] imageBytes = br.ReadBytes((int)fs.Length);
 
    br.Close();
    fs.Close();
 
    return imageBytes;
}

BitmapImageとBitmapFrame 編集

この2つのクラスはどちらも画像をファイルまたはインターネット上から取得することができますが、この2つのクラスには微妙な違いがあるので注意が必要です。

取得する画像ファイルを示すパスで相対パスを使用する際、BitmapImageはアプリケーションリソースをカレントディレクトリとした相対パスを指定する必要があり、 BitmapFrameはファイルシステムとしての相対パスを指定しなければなりません。

また、いずれのクラスでもローカルディスクからファイルを読み込んだ場合、そのファイルへのアクセス権をロックしてしまいます。オブジェクトのインスタンスが生存している間は、他のアプリケーションからそのファイルへの書き込みモードでのアクセスができなくなるため注意が必要です。

画像の書き込み 編集

保存したい画像がBitmapImageクラスであるならば非常に簡単にディスクへの書き込みができます。
.NET Frameworksでは幾つかのエンコーダーが定義済みで、使用するエンコーダーを変更することで任意の画像形式に変換して画像ファイルを出力します。

BitmapImage bi = GetBitmapImage() // 画像が書き込まれているBitmapImageを返すユーザー関数
 
using (FileStream stream = new FileStream("img.jpeg", FileMode.Create))
{
	// JPEG形式に変換して、ディスクに書き出す。
    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bi));
    encoder.Save(stream);
    stream.Close();
}


画像操作 編集

画像形式(エンコーダー/デコーダー) 編集

WPFでは画像をWPF用の画像クラスであるBitmapSourceやImageとして扱いますが、これらの画像をファイル保存する場合や他のアプリケーションに渡す場合は 何らかの画像形式に変換して渡す必要があります。

.NETFrameworks4では次の画像形式に変換(エンコード)または解読(デコード)をサポートしています。

Jpeg形式 JpenBitmapEncoder
Bmp形式 BmpBitmapEncoder
Png形式 PngBitmapEncdoder
Tiff形式 TiffBitmapEncoder
Gif形式 GifBitmapEncoder
WMP形式 WmpBitmapEncoder


リサイズ 編集

画像を表すバイト列から新しいImageSourceを作成します。

private ImageSource CreateImage(byte[] imageData,
	int decodePixelWidth, 
	int decodePixelHeight)
{
	BitmapImage result = new BitmapImage();
	result.BeginInit();
 
	if(decodePixelWidth > 0)
		result.DecodePixelWidth  = decodePixelWidth;
	if(decodePixelHeight > 0)
		result.DecodePixelHeight = decodePixelHeight;
 
	result.StreamSource = new MemoryStream(imageData);
	result.CacheOption = BitmapCacheOption.Default;
	result.EndInit();
	return result;
}

バイト列への変換 編集

BitmapImage → byte配列 編集

BitmapImage bi = GetBitmapImage() // BitmapImageを取得するユーザー関数
Stream stream = bi.StreamSource;
Byte[] imageByte = null;
using (BinaryReader reader = new BinaryReader(stream))
{
    imageByte = reader.ReadBytes((Int32)stream.Length);
}


byte配列 → BitmapImage 編集

Byte[] imageByte = GetImageByte(); // 画像のバイト列を取得するユーザー関数
using(MemoryStream ms = new MemoryStream(imageByte))
{
	ms.Seek(0, SeekOrigin.Begin); // 念のためカーソル位置を先頭番地に移動
 
	BitmapImage bi = new BitmapImage();
	bi.BeginInit();
	bi.CacheOption = BitmapCacheOption.OnLoad;
	bi.StreamSource = ms;
	bi.EndInit();
	bi.Freeze();
}


Image → byte配列(相互変換) 編集

Imageクラスをbyte[]に変換する。また、byte[]をImageクラスに変換する。

using System.Drawing;
///<summary>
///バイト配列をImageに変換する
///</summary>
public static Image ByteArrayToImage(byte[] b)
{
	ImageConverter imgconv = new ImageConverter();
	Image img = (Image)imgconv.ConvertFrom(b);
 
	return img;
}
 
///<summary>
///Imageをバイト配列に変換する
///</summary>
public static byte[] ImageToByteArray(Image image) {
  ImageConverter imgconv = new ImageConverter();
  byte[] b = (byte[])imgconv.ConvertTo(image, typeof(byte[]));
  return b;
}

外部リンク 編集

広告ブロッカーが検出されました。


広告収入で運営されている無料サイトWikiaでは、このたび広告ブロッカーをご利用の方向けの変更が加わりました。

広告ブロッカーが改変されている場合、Wikiaにアクセスしていただくことができなくなっています。カスタム広告ブロッカーを解除してご利用ください。

FANDOMでも見てみる

おまかせWiki