作者:宇之乐
出处:http://www.cnblogs.com/huizhang212/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
在Windows Phone中用于显示图片的是Image控件,不过Image控件目前只支持两种格式的图片,即Png和Jpg。平时我们经常用的图片还有Gif和Bmp两种,对于这两种图片我们无法通过Image来显示。需要用第三方开发的控件来显示,ImageTools是开源社区CodePlex提供的,可以通过http://imagetools.codeplex.com/下载DLL以及源码,通过ImageTools我们可以显示Gif和Bmp图片。
因此对于比较常用的图片格式Png、Jpg、Gif、Bmp,我们需要针对不同的图片格式使用不同的控件来显示,这里就有一个来解析图片格式的问题。我们不能单纯的用文件后缀名.png、.jpg、.jpeg、.gif、.bmp来区分图片格式,因为实际上我们可以直接修改图片后缀名,修改后缀名并不能修改图片的格式,图片还是保持它原来的格式。图片文件的格式结果中,在头部信息(一般都会在图片文件最开始的几个字节)中都会包含图片的格式信息。下面就列车常用的这几种格式图片的头部信息标识(十六进制)。
1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG....。
2.Jpg图片文件包括2字节:FF D8。
3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
4.Bmp图片文件包括2字节:42 4D。即为 BM。
根据图片问题头标识信息我们可以能很方便的判断出文件的格式,首先我们需要获取图片文件的字节流信息,代码如下。
//获取图片文件流,根据图片是资源文件或者独立存储文件分别处理 Stream stream = null; //如果是资源文件处理 StreamResourceInfo info = Application.GetResourceStream(new Uri(path, UriKind.Relative)); if (info != null) { stream = info.Stream; } //如果是独立存储文件处理 using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) { //打开文件 stream = myIsolatedStorage.OpenFile(path, FileMode.Open, FileAccess.Read); }
从图片文件流stream中读取8个字节,然后再根据不同的图片格式做文件头匹配比较具能判断出文件的格式,代码如下。
/// <summary> /// 定义图片格式 /// </summary> public enum ImageType { Null, Png, Jpg, Gif, Bmp } /// <summary> /// 获取图片格式 /// </summary> private ImageType getImageType(Stream stream) { //图片格式 ImageType type = ImageType.Null; //读取图片文件头8个字节,并根据若干个字节来确定图片格式 byte[] header = new byte[8]; stream.Read(header, 0, 8); //确定图片格式 if (header[0] == 0x89 && header[1] == 0x50 && // P header[2] == 0x4E && // N header[3] == 0x47 && // G header[4] == 0x0D && header[5] == 0x0A && header[6] == 0x1A && header[7] == 0x0A) { //Png图片 8字节:89 50 4E 47 0D 0A 1A 0A type = ImageType.Png; } else if (header[0] == 0xFF && header[1] == 0xD8) { //Jpg图片 2字节:FF D8 type = ImageType.Jpg; } else if (header[0] == 0x47 && // G header[1] == 0x49 && // I header[2] == 0x46 && // F header[3] == 0x38 && // 8 (header[4] == 0x39 || // 9 header[4] == 0x37) && // 7 header[5] == 0x61) // a { //Gif图片 6字节:47 49 46 38 39|37 61 type = ImageType.Gif; } else if (header[0] == 0x42 && //B header[1] == 0x4D) //M { //Bmp图片 2字节:42 4D type = ImageType.Bmp; } //关闭字节流 stream.Close(); return type; }
解析到图片格式后,我们就可以根据图片格式选择对应的控件来显示图片了。