当前位置: 移动技术网 > IT编程>移动开发>WP > Windows Phone 解析图片尺寸之png

Windows Phone 解析图片尺寸之png

2018年10月05日  | 移动技术网IT编程  | 我要评论

火石结晶,绿箭侠下载,日记 300字

前面介绍过windows phone 解析图片格式 ,通过解析图片格式,我们可以根据图片格式使用相关控件展示。在windows phone开发中,无论是image控件,还是imagetools中提供的图片控件,加载图片都是异步过程,这样就使得我们无法立即获得图片的尺寸大小,而必须等图片加载完成后才能获得。然后在开发过程中,有时候我们需要在加载图片完成之前就获取图片的尺寸。同前面解析图片格式的处理方法类似,我们需要解析图片文件的头信息,并从中获取图片的宽度和高度信息。
  要解析png图片的宽度和高度信息,首先需要了解png图片的数据块结构,png图片的尺寸信息存放在文件头数据块中,所以我们需要了解文件头的数据块结构。
  文件头数据块ihdr(header chunk):它包含有png文件中存储的图像数据的基本信息,并要作为第一个数据块出现在png数据流中,而且一个png数据流中只能有一个文件头数据块。 文件头数据块由13字节组成,其中前8个字节即为图片的宽度和高度信息,各占4个字节。
  文件头数据块是第一个数据块,但是在数据块前,也就是png图片文件的最开始位置首先存储的是png文件署名域,占8个字节,即:89 50 4e 47 0d 0a 1a 0a ( .png....),通过这个可以判断图片是否为png格式,接下来是文件头数据块的长度和标识,各占4个字节,文件头数据块的长度为13,所以文件头数据块的长度固定为 00 00 00 0d,而文件头数据块的标识为49 48 44 52,即“ihdr”。
  通过上面的解析,我们可以分一下几步来解析png图片的宽度和高度。
  1.首先读取起始位的8个字节,即png文件署名域,判断图片是否为png格式,如果不是,则退出。
  view code
        //读取图片文件头8个字节,并根据这8个字节来判断是否为png图片
        byte[] header = new byte[8];
        stream.read(header, 0, 8);
        //png图片 8字节:89 50 4e 47 0d 0a 1a 0a
        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图片
            return;
        }

  2.然后跳过8个字节,即文件头数据块的长度值 00 00 00 0d,以及文件头数据块标识 49 48 44 52(ihdr)。
  view code
        //数据域长度  4    指定数据域的长度,固定为00 00 00 0d
        //数据块符号  4    49 48 44 52,是“ihdr”的 ascii 码
        stream.seek(8, seekorigin.current);

  3.接下来要读取就是图片的宽度和高度值,读取8个字节,由于是按照高低位调换存储,所以需要做高低位转换,转换后通过bitconverter类直接将字节类型转换为整数型即为图片的尺寸。
  view code
        //读取宽度,高度 各4字节
        byte[] buffer = new byte[8];
        stream.read(buffer, 0, buffer.length);

        array.reverse(buffer, 0, 4);
        array.reverse(buffer, 4, 4);

        width_ = bitconverter.toint32(buffer, 0);


 

摘自  宇之乐

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网