我遇到的问题是这样的,我本来要做一个把图片录成AVI的程序,在网上查了很多源码几乎都是用bmp格式的图片录的,但是我手上的图片是jpg格式的,所以我首先需要在程序里把jpg格式的图片转成bmp格式。然后我接着找jpg转bmp的程序源码,找到了几个,试了下可以运行,于是乎我就想把转成的bmp录成avi,可是失败了。但是图片是转成功了的。
我又试着用ACDSEE批量转换图片,也就是批量的把jpg格式的文件转换成bmp格式的,然后拿这些图片进行avi的录像,结果成功了,而且效果很好。
我就纳闷了,为什么我用自己下的程序转的图片就录不成功呢,我对比了一下转换后的两种bmp图片,无论是文件大小,像素大小,还是位深度都是一模一样的。然后我就用二进制的形式打开了文件查看,发现里边文件信息一点都不一样,可是显示的图片却是一模一样的。希望高手给解答一下我的困惑,我把两种bmp格式文件的二进制码贴上来一点,作为对比。以下二进制码为ACDSEE转过来的bmp的前几行
BM6     6   (   €  ?                          BF@BF@DF@DF@GE@HFALFALFARGCQFBTEBTEBZGD\IF_JHaLJZPI
以下二进制码为我下的程序转成的bmp的前几行
BM6     6   (   €  ?            ?  ?          BG>BG>DG>DG>HF>HF>KE>KE>QG@PF?UE?UE?YFA[HC^JE

解决方案 »

  1.   

    在文件大小,像素大小,还是位深度都是一模一样的情况下,用二进制查看文件发现里面的信息是不一样的,但是显示出的效果是一样的,这是完全可能的。这于BMP的制定者的一个默认规定有关:BMP制定者认为屏幕的起点坐标为左下角。在BMP文件的结构中,有这样一个成员:Public Type BITMAPFILEHEADER
            bfType As Integer
            bfSize As Long
            bfReserved1 As Integer
            bfReserved2 As Integer
            bfOffBits As Long
    End Type
    Public Type BITMAPINFOHEADER '40 bytes
            biSize As Long
            biWidth As Long
            biHeight As Long
            biPlanes As Integer
            biBitCount As Integer
            biCompression As Long
            biSizeImage As Long
            biXPelsPerMeter As Long
            biYPelsPerMeter As Long
            biClrUsed As Long
            biClrImportant As Long
    End Type其中如果biHeight 的值为正的,表示下面的图像数据是从图像的左下角开始向由向上保存的,而如果这个biHeight 是负值,则和我们计算机的屏幕坐标一致了,即下面的图像数据是从图像的左上角开始向右向下保存的,这也就是Photoshop中保存BMP图像时的”翻转行序“的意义。
      

  2.   

    貌似找到问题了,我调试发现 他定义的  LPBITMAPINFOHEADER alpbi; 这个变量的alpbi->biSizeImage变量值为0,估计是他转成bmp的时候这个变量没有赋值吧,所以导致有些变量就为0了,我参考了ACDSEE的那个bmp得到了那个值,直接写在里边就好了。哎,问题是他那个jpg转bmp格式的文件是写好的静态和动态链接库,我也没有办法改,就只能换别的方法再赋值了。好在图片的大小是固定的,最笨的办法就是把他写成一个定值就好了,不过还是想想解决办法,希望最后能解决。也感谢2楼的大哥,我又学会了点东西。
      

  3.   

    alpbi->biSizeImage 这个你填不填充都无所谓,结果是一样的。
      

  4.   

    bmp是微软的东西,兼容的bmp READER,或者writer都遵循微软定的规矩。甚至有压缩格式(采用RLE)的BMP。但总的来说是最基本的格式。