如何以编程方式访问资源文件中的图像?

5
我有一个资源文件里面有30个PNG图像,我想在一个计时器中循环它们。这个计时器会将表单的背景图像设置为序列中的下一个PNG图像,以产生基本动画。
我找不到一种简单的方法来枚举资源文件并获取实际的图像。我也很想保持对图像的引用不固定在它们的文件名上,这样在资源文件中更新图像的命名不需要我更新代码的这部分。
注: - 资源文件中的图像按顺序命名('image001.png','image002.png',...)。 - 此资源文件专门用于存储这些图像。

看看这个博客:Social MSDN - rfonn
4个回答

2
    private void Form1_Load(object sender, EventArgs e)
    {
        var list = WindowsFormsApplication1.Properties.Resources.ResourceManager.GetResourceSet(new System.Globalization.CultureInfo("en-us"), true, true);
        foreach (System.Collections.DictionaryEntry img in list)
        {
            System.Diagnostics.Debug.WriteLine(img.Key);
            //use img.Value to get the bitmap
        }

    }

我了解资源文件的使用。我的问题是如何扩展这种用法,比如“在当前图像的基础上,如何移动到下一个图像”?您可以提供一个代码示例吗? - InvertedAcceleration

1
Assembly asm = Assembly.GetExecutingAssembly();
for(int i = 1; i <= 30; i++)
{
  Stream file = asm.GetManifestResourceStream("NameSpace.Resources.Image"+i.ToString("000")+".png");
  // Do something or store the stream
}

获取所有嵌入资源的名称:
string[] resourceNames = Assembly.GetManifestResourceNames();
foreach(string resourceName in resourceNames)
{
    System.Console.WriteLine(resourceName);
}

另外,在Form1_Load函数中,请查看示例


这种方法的唯一问题(它是可行的)是,如果我重命名图像(在这个项目中相对可能发生),我必须回来更新代码。你觉得这是不可避免的吗? - InvertedAcceleration
您可以获取嵌入式资源列表,但如果您正在寻找特定文件,则我认为没有绕过此问题的方法。如果您知道资源中仅有图像文件,那么您可以使用GetManifestResourceNames()函数。 - SwDevMan81
谢谢,GetManifestResourceNames和GetManifestResourceStream的组合将让我非常接近最终解决方案。 - InvertedAcceleration

1

这里有一个关于如何提取CodeProject上嵌入资源的好教程here,以及如何将图像用作alpha混合,并展示如何将其加载到图像列表中how。这是一个帮助类,可以使加载嵌入式资源更加容易here

希望这能帮到你, 最好的问候, 汤姆。


0

谢谢您提供的信息,使用这种方法我需要指定文件的确切名称,有没有办法避免这种情况? - InvertedAcceleration

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接