我要将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所指的大小相等?或者让上面出错的那句不出错(当然要实现功能为前提) 帮帮忙吧,真的很着急,因为都难了我好几天了。
{
// 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所指的大小相等?或者让上面出错的那句不出错(当然要实现功能为前提) 帮帮忙吧,真的很着急,因为都难了我好几天了。
解决方案 »
- 个人发一贴,怀念即将逝去的、充满收获的2012年,期待充满希望的2013年.
- 大家帮我看看这段C++基础功能怎么实现 急。。。
- 请教高手,如何在同一打印任务中打印两页不同方向的文档?
- 我想设置一个CClientDC的颜色,为什么不行
- 高分求解, VC的SDK编程碰到的一个问题,,SDK高高手请进.......
- 急:怎样改变静态框(Static Box)中字体的大小
- 请问ip多波如何实现
- MFC简单问题:(OnPaint与OnDraw消息?)
- 要写用户说明书,谁有这方面得资料?
- 最简单的一个程序,在vc里连接出错,请问牛人们,怎么回事?
- 【请教】如何将ORACLE中读取的Date类型转换为time_t/struct tm类型.详见内.
- 如何让MDI程序在切换不同类型的视时显示不同的工具栏?
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,这样更为保险一些.
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 ;
也有可能出现字节对齐问题。
但是我的程序中不能用你们所说的全局指针,因为公司要求,转换为数后,的数据还要存回原来的内存图像的地址中,也就是在内存中改变8位图像的数据,但图像首地址不便,这样就好用一个CMemFile对像操作了.
不知各位有无好建议? ^|^
首先,再次开辟一个跟p_data同样大小的内存区域作为"缓冲区",将p_data内容memcpy过去;
然后,计算出24Bit位图实际需要的空间大小并用ReAlloc调整p_data大小;
然后,循环"缓冲区"并将结果写入p_data;