bmp图在XP上显示错误?求分析

bmp图在XP上显示异常?!求分析!
如图是XP系统预览和画图软件看到的同一张BMP图(同一个文件啊!),效果竟然不一样。这是一张我自己编码生成的8位位图,虽然只用了黑白色,但是为了方便缩放,所以用的8位。
重点来了,为什么效果会不一样?画图中的效果是正常的效果(win7上显示的就都是这样),但是预览的效果竟然不是这样,画到emf中也是那个预览的效果,导致打印出来扫不出来啊!
bmp图在XP上显示错误?求分析
从图上可以看出,图片数据是正常的,就是位置发生了错位。似乎预览软件是从数据段中间开始取数据了,如果是这样,那他怎么还能正常的取到前面的数据呢?这说明应该不是我的BMP头中数据偏移位置指错了吧。
不知道又没人遇到过这个问题,求分析,求帮助bmp图在XP上显示错误?求分析]

另外附上源文件下载链接:http://download.****.net/detail/a2619308/8156629
------解决思路----------------------
也许是你没考虑一行像素数据需要四字节对齐。
------解决思路----------------------
typedef struct tagBITMAPFILEHEADER {
  WORD  bfType;
  DWORD bfSize;
  WORD  bfReserved1;
  WORD  bfReserved2;
  DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

红的不对
------解决思路----------------------
       // 颜色表
        RGBQUAD ldColorTable[256] = {{0,0,0,0},{255,255,255,0}};
        for(int i = 0; i < 256; ++i)
        {
            ldColorTable[i].rgbBlue = i;
            ldColorTable[i].rgbGreen = i;
            ldColorTable[i].rgbRed = i;
            ldColorTable[i].rgbReserved = 0;
        }
// 256 grey color
而 

+ 2 * sizeof(RGBQUAD) 
只有 2个 ?
------解决思路----------------------
69行
ldBmpInfoHeader.biSizeImage = 0;
改为
ldBmpInfoHeader.biSizeImage = ((lulPixelWidth + 3) & ~3)  * lulPixelHeight;
试试看