您的位置:首页 > 产品设计 > UI/UE

如何根据字符串获取嵌入到程序中的图片等资源

2008-03-31 11:20 429 查看
一般每一个程序都有大量的资源。对于这些图片资源的存放一般有三种方法:

 

1. 将这些资源一个一个专门放在一个文件夹中,程序调用的时候直接根据文件名读取文件夹里的图片即可

 

2. 将这些资源分别放在各个子程序的程序集中,运行时直接通过资源文件的调用即可

 

3. 将这些资源专门整合在一个文件中,如dll文件,运行时通过dll调用来获得相应的资源即可

 

第一种方法方便明了但不利于图片的保护,第二种方法虽然保护好图片了,但是可能会造成重复的文件重复存放,所以感觉第三种方法方便实惠也利于保护。

 

 

然而,采用了第三种方法后,问题又来了,如何获得所需要的资源呢?通常如果资源存放在同一程序集的资源文件中的话可以直接使用

global::<namespace>.Properties.<资源文件类名>.资源名
来获取,返回的类型根据资源类型的不同而不同。但是当前情况是另一个程序来调用资源文件,而传入的参数一般都是文件名,从而获取同文件名的资源,那又该怎么实现这个功能呢?总不至于通过几十个case来一个一个判断吧,劳心劳力,一不小心还会出错,吃力不讨好。

 

 

其实,.Net强大的反射机制能够帮助我们自动完成所需要的这个功能——

System.Reflection.Assembly类中有两个重要的方法:GetManifestResourceNames和GetManifestResourceStream,看名字大家都应该很清楚了,前者是获得程序集中所有资源的名字,而后者则是获得资源的流。有了这两样,还愁得不到所需要的资源么?呵呵,别急,在这之前还有一步:那就是将所导入的资源的Build Action属性改成Embedded Resource(嵌入的资源),这样GetManifestResourceNames才能够获得这些资源的名称。

 

 

最后,是实现的代码,不管你有多少图片,这段代码都能搞定(这段代码中的imageName是不带扩展名的)

 


        public System.Drawing.Bitmap GetImage(string imageName)




        ...{


            System.Drawing.Bitmap requestPic = null;


            Assembly assembly = Assembly.GetExecutingAssembly();


            string[] resNames = assembly.GetManifestResourceNames();


            foreach (string aResName in resNames)




            ...{


                string[] resNameSplit = aResName.Split('.');


                if (resNameSplit[resNameSplit.Length - 2] == imageName)




                ...{


                    Stream aResStream = assembly.GetManifestResourceStream(aResName);


                    requestPic = new System.Drawing.Bitmap(aResStream);


                    break;


                }


            }


            return requestPic;


        }



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息