##前提
環境:VS2019
言語:C# WPF
##分からない事
byte[]型からBitmapSourceを作成した場合に画像の背景が黒くなってしまうが、透明なままにするにはどうすればよいか。
##具体的な内容
画像をシリアライズする方法がわからず、過去に以下の質問をさせていただきました。
MessagePack for C# でBitmapSource型をシリアライズするには?
BitmapSourceを直接シリアライズする事ができないので、一度byte[]型へ変換したものをシリアライズするという方法で実装しました。簡易的ですが、以下の様に実装しています。
C#
1//アイコンの取得(BitmapSource型) 2var icon = Utility.GetIcon(filePath); 3 4//byte[]型へ変換 5var byteArray = icon.ToByteArray(); 6 7/// <summary> 8/// ファイルパスのアイコンを取得する 9/// </summary> 10/// <param name="filePath"></param> 11/// <returns></returns> 12public static BitmapSource GetIcon(string filePath) 13{ 14 using (var file = ShellFile.FromFilePath(filePath)) 15 { 16 file.Thumbnail.FormatOption = ShellThumbnailFormatOption.IconOnly; 17 return file.Thumbnail.SmallBitmapSource; 18 } 19} 20/// <summary> 21/// BitmapSourceをbyte[]型へ変換 22/// </summary> 23/// <param name="bs"></param> 24/// <returns></returns> 25public static byte[] ToByteArray(this BitmapSource bs) 26{ 27 using (var ms = new MemoryStream()) 28 { 29 var encoder = new BmpBitmapEncoder(); 30 encoder.Frames.Add(BitmapFrame.Create(bs)); 31 encoder.Save(ms); 32 return ms.GetBuffer(); 33 } 34}
byte[]型でシリアライズできたので、シリアライズしたものを以下のメソッドでbyte[]型からBitmapSource型へ変換しました。
C#
1/// <summary> 2/// byte[]型をBitmapSourceへ変換 3/// </summary> 4/// <param name="byteArray"></param> 5/// <returns></returns> 6public static BitmapSource ToBitmapSource(this byte[] byteArray) 7{ 8 using (var ms = new MemoryStream(byteArray)) 9 { 10 var image = new BitmapImage(); 11 12 ms.Seek(0, SeekOrigin.Begin); 13 image.BeginInit(); 14 image.CacheOption = BitmapCacheOption.OnLoad; 15 image.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 16 image.StreamSource = ms; 17 image.EndInit(); 18 image.Freeze(); 19 return image; 20 21 //上記だとFormatがBgr32だったのでBgra32に変換するが、これもダメ 22 var bitmap = new FormatConvertedBitmap(image, PixelFormats.Bgra32, null, 0); 23 return bitmap; 24 } 25}
どのようにすれば、画像の背景を透明なままに、byte[]型からBitmapSource型へ変換できるのでしょうか。
###調べた事
・背景色を透明にできるかどうかは、α値を持っているかどうかに依るということです。α値を持っているのは、GIF・PNG・ICONなのでそれ以外は背景色が透明の場合は黒くなってしまう。
・アイコンを取得した直後と、デシリアライズしたbyte[]型からアイコンを生成した場合のプロパティを全て比較してみました。違いとしては一点で、
- アイコンを取得した直後のフォーマットがBgra32 だったのに対して、
- デシリアライズしたbyte[]型からアイコンを生成した場合のフォーマットがBgr32 でした。
なので、FormatConvertedBitmapでBgra32へ変換してみたが、それでも背景は黒いままでした。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/31 13:02