実現したい内容
画像について、画素(ピクセル)の情報の確認や、色や明るさなどの変更を行いたい。そのため、SoftwareBitmap
で管理する画像の画素情報をbyte
配列に格納し、BGRAの操作をできるようにする。
対処その1
SoftwareBitmap
から、WritableBitmap
のIBuffer
にデータをコピーし、IBuffer
からstream
を介して、byte
配列に読み込む。
Microsoft DocsのSoftwareBitmap.CopyToBuffer()
のRemarksをヒントにした方法
WriteableBitmapのIBufferを活用
WriteableBitmap wb = new WriteableBitmap(_SourceBitmap.PixelWidth, _SourceBitmap.PixelHeight);
using (SoftwareBitmap sb = SoftwareBitmap.Copy(_SourceBitmap))
{
sb.CopyToBuffer(wb.PixelBuffer);
}
int n = (int)wb.PixelBuffer.Length;
_SourceByteArray = new byte[n];
using (Stream stream = wb.PixelBuffer.AsStream())
{
await stream.ReadAsync(_SourceByteArray,0,n);
}
-
_SourceBitmap
: コピー元のSoftwareBitmap
-
_SourceByteArray
: コピー先のbyte
配列
逆手順:byte配列からSoftwareBitmapの生成
同様にWritableBitmapを用いて逆の手順を実現できる。
WriteableBitmap
のIBuffer
にstream
を介してbyte
配列からデータを読み込み、IBuffer
からSoftwareBitmap
にデータをコピーする。
byte配列からSoftwareBitmapを生成
WriteableBitmap wb = new WriteableBitmap(w, h);
SoftwareBitmap tgt = new SoftwareBitmap(BitmapPixelFormat.Bgra8, w, h);
using (var stream = wb.PixelBuffer.AsStream())
{
await stream.WriteAsync(_TargetByteArray, 0, _TargetByteArray.Length);
tgt.CopyFromBuffer(wb.PixelBuffer);
_TargetBitmap = SoftwareBitmap.Copy(tgt);
}
-
_TargetByteArray
: コピー元のbyte
配列 -
_TargetBitmap
: コピー先のSoftwareBitmap
対処その2
以前、やや苦し紛れに書いたもの。対処その1より効率は落ちると思うが、何らか別の用途があるかもしれない。
-
SoftwareBitmap
をBitmapEncoder
にセットしstream
に書き出し。 -
stream
を用いてBitmapDecoder
を生成。 -
BitmapDecoder
からPixelDataProvider
を生成。 -
PixelDataProvider
からbyte
配列を得る。
BitmapEncoder,BitmapDecoderを活用
using (SoftwareBitmap sb = SoftwareBitmap.Copy(_SourceBitmap))
{
BitmapEncoder encoder;
InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream();
encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, ras);
encoder.SetSoftwareBitmap(sb);
try
{
await encoder.FlushAsync();
}
catch (Exception e) {
Debug.WriteLine("err in encoding image: {0}", e.Message);
return 0;
}
ras.Seek(0);
BitmapDecoder decoder;
decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.BmpDecoderId, ras);
PixelDataProvider provider = await decoder.GetPixelDataAsync();
_SourceByteArray = provider.DetachPixelData();
}
-
_SourceBitmap
: コピー元のSoftwareBitmap -
_SourceByteArray
: コピー先のbyte配列