0

したがって、DLLから画像を取り出して画像コントロールに配置すると、それはBitmapImageになります。dllにパッケージ化するには、イメージに変換し直す必要があります。どうすれば画像に戻すことができ、どのようにdllに再パッケージすることができますか?これはすべてc#で書かれたwpfにあります。

private void compileDLL_Click(object sender, RoutedEventArgs e)
    {
        string sourcePath = Directory.GetCurrentDirectory() + "\\PCAngelResources.dll";
        //destination path
        string dllname = textBox1.Text + "_PCAngelResources.dll";
        string targetPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        string destFile = System.IO.Path.Combine(targetPath, dllname);
        System.IO.File.Copy(sourcePath, destFile, true);

        //lstImages = new Dictionary<string, Bitmap>();
        //string filename = "PCAngelResources.dll";
        Assembly pcangdll = Assembly.LoadFile(sourcePath);
        System.Globalization.CultureInfo culture = Thread.CurrentThread.CurrentCulture;
        ResourceManager rm = new ResourceManager("PCAngelResources.DynResources", pcangdll);
        rs = rm.GetResourceSet(culture, true, true);
        ResourceWriter writer = new ResourceWriter(destFile);

        foreach (DictionaryEntry resource in rs)
        {
            resources.Add((string)resource.Key);
            if (resource.Key.Equals("Branding") || resource.Key.Equals("Advertising"))
            {
                if (resource.Key.Equals("Branding"))
                {
                    writer.AddResource("Branding", image5.Source);
                    //System.Object obj = rm.GetObject((string)resource.Key);
                    //lstImages.Add((string)resource.Key, (Bitmap)obj);
                }
                else
                    if (resource.Key.Equals("Advertising"))
                    {
                        writer.AddResource("Advertising", image6.Source);
                    }
            }
        }
        writer.Generate();
        System.Windows.MessageBox.Show("Done", "Process Finished", MessageBoxButton.OK, MessageBoxImage.Asterisk, MessageBoxResult.OK);
    }

writer.Generate()を実行して新しいdllを作成すると、次のエラーが発生します。mscorlib.dllで「System.Runtime.Serialization.SerializationException」タイプの未処理の例外が発生しました。

追加情報:アセンブリ'PresentationCore、Version = 3.0.0.0、Culture = neutral、PublicKeyToken=31bf3856ad364e35'に「System.Windows.Media.Imaging.BitmapFrameDecode」と入力してもシリアル化可能としてマークされていません。

4

1 に答える 1

1

「DLL に再パッケージ化する」という意味がわかりませんが、WPF イメージを BitmapSource から System.Drawing.Image に変換する簡単な方法があります。次のメソッドはそれを実現します。

/// <summary>
/// Converts a WPF bitmap to a System.Drawing.Bitmap
/// </summary>
/// <param name="wpfBitmap">BitmapSource to convert</param>
/// <returns>A GDI Bitmap</returns>
public static System.Drawing.Bitmap GdiBitmapFromWpfBitmap(BitmapSource wpfBitmap)
{
    PngBitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(wpfBitmap));
    MemoryStream imageStream = new MemoryStream();
    encoder.Save(imageStream);
    System.Drawing.Bitmap gdiBitmap = new System.Drawing.Bitmap(imageStream);

    imageStream.Close();
    imageStream.Dispose();

    return gdiBitmap;
}
于 2009-07-28T19:56:56.703 に答える