您的位置:首页 > 其它

[WPF] 嵌入资源到DLL,并解决PNG图片问题

2014-01-06 16:46 357 查看
在WPF有很多种资源文件存储的方式,就图片的存储就麻烦到极点。

最近自己弄一个项目就遇到这样那样的问题,现在把自己的使用方法总结出来给大伙借鉴借鉴!

在我的项目中,我并不想把所有的图片都存放在文件夹下,因为这样用户如果图片文件没有拷贝到就悲剧了。

最初我是把图片资源拖到主程序的资源中,这样就能主动嵌入进去,不必生成到文件夹中,但是我又发现这样主程序太大了。

这当然不是我想看到的,所以有了新建一个类库项目,把图片资源都压缩到类库项目中,然后在主程序中引用!

步骤如下:

1.新建类库项目

2.添加图片资源:直接拖动图片到项目中即可,当然你可以有自己的文件夹

3.编写主程序访问类。

4.主程序访问

简单来说就是4步;但是这样你肯定不会,并且在这里也有两种方法:

清单:两个项目,两个图片,一个类!

第一种:



第一个图片属性:



打开类库属性,资源,把第一个图片拖动进去!



编写代码:

public static BitmapSource GetBitmapImage_001()
        {
            BitmapSource returnSource;
            try
            {
                //直接获取资源
                Bitmap bmap = TestResource.Properties.Resources.I_001;
                //转换格式
                returnSource = Imaging.CreateBitmapSourceFromHBitmap(bmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                bmap.Dispose();
            }
            catch
            {
                returnSource = null;
            }
            return returnSource;
        }


第二种:

设置第二个图片属性:嵌入资源



编写代码:

public static BitmapSource GetBitmapImage_002()
        {
            //获取文件流
            Assembly myAssembly = Assembly.GetExecutingAssembly();            
            //格式为:项目名称-文件夹地址-文件名称
            Stream myStream = myAssembly.GetManifestResourceStream("TestResource.Resource.I_002.png");
            //图片格式
            BitmapImage image = new BitmapImage();
            image.BeginInit();
            image.StreamSource = myStream;
            image.EndInit();
            myStream.Dispose();
            myStream.Close();
            return image;
        }


比较:

两种都是各有所长,第一种先设置为内置资源然后引用,第二种,直接读取流使用!

两种的方法都可以,第一种由于要从Bitmap转为BitmapImage所以存在PNG图片透明度丢失问题。

所以如果针对图片,第二种要比较好控制一些!

而假如针对音频等文件,你会发现第一种比较好,因为第一种对音频等文件会默认返回Stream类型,这个可以直接返回给主程序使用!



以上只是个人观点,如有错误,还请指正!

免费奉上源码:

WPF资源文件在DLL中的使用方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: