我要将8位 位图转化为24位 位图,但公司要求必须在内存中转换,所以我用了CMemFile类,但是现在遇到了一个问题,请看这段代码:void CXXXX::MakeDIB8To24 ( LPBYTE p_data , int width , int height )
{
// 24位图像字节宽
int widthBytes = width * 3 ; // 原图像像素指针
LPBYTE lpSrc ;
// 目标像素指针。
LPBYTE lpDst ; // 目标图像蓝色值
BYTE * lpDstBlue ;
// 目标图像绿色值
BYTE * lpDstGreen ;
// 目标图像红色值
BYTE * lpDstRed ; // 新图像缓冲区
LPBYTE temp = new BYTE [ widthBytes * height ] ;
// 初始化新分配的内存为255。
memset ( temp , 255 , widthBytes * height ) ; // 转换开始
for( int j = 1 ; j < height - 1 ; j++ )

for( int i = 1 , k = 1 ; i < width - 1 ,k < widthBytes - 1 ; i++ , k += 3 ) 
{
// 获得8位原图像像素指针
lpSrc = p_data + width * j  + i ;
// 获取目标像素指针
lpDst = temp + widthBytes * j + k ;
// 
lpDstBlue = lpDst ++ ;
lpDstGreen = lpDst ++ ;
lpDstRed = lpDst ++ ; lpDstBlue =  lpSrc ;
lpDstGreen =  lpSrc ;
lpDstRed =  lpSrc ;
}
} // 复制处理后的图像。
         // p_data为原8位图像的数据首地址,也是在CMemFile中得到的。
memcpy ( p_data , temp , widthBytes * height ) ; // 这句出错 delete temp;
}
这段代码会出错,原因是p_data的所指的大小比temp所指的大小要小,所以复制图像时出错,p_data是在加载8位图像时得到的(p_data的大小为 图像的 数据部分+图像头+颜色地址表  的大小 ),现在 我的问题是:有没有办法在内存中调整这个8位图像的大小,好让p_data的所指的大小比temp所指的大小相等?或者让上面出错的那句不出错(当然要实现功能为前提)  帮帮忙吧,真的很着急,因为都难了我好几天了。

解决方案 »

  1.   

    搂住的代码我仔细看过了,思路是对的,不过就是有点小问题,我的建议是修改一下函数参数这样:
    void CXXXX::MakeDIB8To24 ( LPBYTE p_data , int width , int height, LPBYTE p_DataBuffer24Bit )
    ,然后在函数内部去掉最后一行的memcpy ( p_data , temp , widthBytes * height ) 和delete temp,改为
    if ( NULL != temp )
    {
     p_DataBuffer24Bit = temp;
    }
    else
    {
    p_DataBuffer24Bit = NULL;
    }
    当你在外部使用完后记得要释放p_DataBuffer24Bit指向的内存就可以了.
    另外搂住最好在LPBYTE temp = new BYTE [ widthBytes * height ] ;之后判断一下temp是否为NULL,这样更为保险一些.
      

  2.   

    首先,我想说
    for( int j = 1 ; j < height - 1 ; j++ )
    你这个循环能不能全都遍历到?
    别的不说,加入j有1行,
    岂不是
    j=1;j<0了。
    所以说,你的遍历可能有问题。
    这只是结果正确与否得问题。
    再谈,内存出错得问题。
    p_data 为8位图片得指针,肯定要比24位得小。
    memcpy ( p_data , temp , widthBytes * height ) ; // 这句出错
    所以不能像上面那么用的。
    你可以设置一个全局指针p_DataBuffer24Bit,在这个函数里面申请内存,在程序结束时候再释放。如是。程序不难。
    注意细节。
    int widthBytes = width * 3 ;
    也有可能出现字节对齐问题。
      

  3.   

    感谢楼上的各位,所言极是呀!.
      但是我的程序中不能用你们所说的全局指针,因为公司要求,转换为数后,的数据还要存回原来的内存图像的地址中,也就是在内存中改变8位图像的数据,但图像首地址不便,这样就好用一个CMemFile对像操作了.
      不知各位有无好建议?   ^|^
      

  4.   

    那代码就得复杂点了,我给你个思路吧:
    首先,再次开辟一个跟p_data同样大小的内存区域作为"缓冲区",将p_data内容memcpy过去;
    然后,计算出24Bit位图实际需要的空间大小并用ReAlloc调整p_data大小;
    然后,循环"缓冲区"并将结果写入p_data;
      

  5.   

    BTW,我发现公司的头头们总是喜欢出些古怪的idea让别人完成,而且还沾沾自喜以为聪明,哎!无奈呀~~~~
      

  6.   

    非常感谢  rfa(实况狐狸) ,虽然问题没有解决,但是起码多了一些可试验的方法。感谢。