0

次の2つのサービスを実装したい:(問題にはWeb APIを使用)

  1. サーバーから画像を取得します。
  2. サーバーに新しい画像を追加します。

サーバーは画像を DB iun varbinary に保存します。写真は bmp、jpg、ico のいずれかです。

私の関数の署名は

AddIcon(string Id, byte[] IconFile)

そして、それをデータベースに挿入することを考えました。ここで、DTO を介して BitmapImage を渡すと、多くのオブジェクトへの参照が必要になり、ベスト プラクティスではないと思います。それが私がバイト[]を好む理由です。

  1. その構造を知らずに BitmapImage を Byte[] に変換する方法はありますか?
  2. ファイルを取得するときに、その構造を知らずに Byte[] を BitmapImage に変換する方法はありますか (ディスクからロードする場合など)。
4

1 に答える 1

1

BitmapImage は最適化されており、コーデック情報などの詳細が隠されています。以下を使用できます。

    public static byte[] SaveToPng(this BitmapSource bitmapSource)
    {
        return SaveWithEncoder<PngBitmapEncoder>(bitmapSource);
    }

    private static byte[] SaveWithEncoder<TEncoder>(BitmapSource bitmapSource) where TEncoder : BitmapEncoder, new()
    {
        if (bitmapSource == null) throw new ArgumentNullException("bitmapSource");

        using (var msStream = new MemoryStream())
        {
            var encoder = new TEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
            encoder.Save(msStream);
            return msStream.ToArray();
        }
    }


    public static BitmapSource ReadBitmap(Stream imageStream)
    {
        BitmapDecoder bdDecoder = BitmapDecoder.Create(imageStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
        return bdDecoder.Frames[0];
    }
于 2012-12-30T11:00:30.933 に答える