メモ帳

備忘録

BitmapSourceの変換

なんかBitmapに比べると情報が少ない。WPF、全般的に情報が少ない。なんか苦労したので自分用にまとめておく。

ファイルから読み込み

var uri = new Uri("dir/image.jpg", UriKind.Relative);

// load
var bitmap= new BitmapImage(uri);

ファイルへの書き込み

using (var fs = new FileStream(path, FileMode.Create))
{
	BitmapEncoder encoder = new BmpBitmapEncoder();
	encoder.Frames.Add(BitmapFrame.Create(bitmap));
	encoder.Save(fs);
}

切り出し

// crop
var croppedBitmap = new CroppedBitmap(bitmap,
	new Int32Rect(0, 64, 704, 448));

System.Drawing.Bitmapでやるときは、先に切り出したあとの大きさのBitmapを作成しておいて、Graphicsで選択した部分を描画したりしていた記憶がある。それに比べるとBitmapSourceの方が楽かもしれない。

リサイズ

// resize
double scale = 1d / 2d;
var transformedBitmap= new TransformedBitmap(bitmap,
	new ScaleTransform(scale, scale));

どのようなフィルタリング方法が使われるかはまだよく分かってない。TransformedBitmapを使えば、回転などの操作もできるらしい。が、使ったことがないのでよく分からない。

ピクセルフォーマットの変更

var formatConvertedBitmap= new FormatConvertedBitmap(bitmap,
				PixelFormats.Gray2, null, 0);

System.Drawing.Bitmapより、指定できるフォーマットの種類が多い。PixelFormats.Gray2みたいな4階調グレースケールもある。でも、こういうフォーマットを選ぶと、System.Drawing.Bitmapに変換するのが面倒になりそう。

ピクセルデータの配列からBitmapImageを作成

byte[] data = (元となるピクセルデータの配列);

var bitmap = BitmapImage.Create(width, height,
	dpiX, dpiY,
	format, null, data, stride);

BitmapImageからピクセルデータの配列を取得

BitmapImage bitmap = (元となるBitmapImage);

int width = bitmap.PixelWidth;
int height = bitmap.PixelHeight;
int stride = width * bitmap.Format.BitsPerPixel / 8;
byte[] data= new byte[stride * height];
bitmap.CopyPixels(data, stride, 0);

width * bitmap.Format.BitsPerPixelが8の整数倍ではない場合に、うまく動かないと思う。