请问一下,你做的将32位转成24位位图的程序
下面的代码实现从32位向24位转换:widthbytes1=w*4;
widtybytes2=(w*24+31)/32*4;//double word alignedunsigned long* raster = (unsigned long*)GlobalAlloc(GMEM_FIXED, (w * h * sizeof (uint32)));
HGLOBAL TempBuff = GlobalAlloc(GHND,(h*widtybytes2));char* pOutBuf = (char*)TempBuff;
char* pData = (char*)raster;if(bitcount==32){
for(i=0; i<h; i++){
int m1=i*widthbytes1;
int m2=i*widthbytes2;
for(j=0; j<w; j++){
int offset1=m1+j*4;
int offset2=m2+j*3;
pOutBuf[offset2+0]=pData[offset1+0];//blue
pOutBuf[offset2+1]=pData[offset1+1];//green
pOutBuf[offset2+2]=pData[offset1+2];//red
}
}
}
其中pData和pOutBuf是char*型的指针对么?我这样做这么总是在i=2,j=243时,
pOutBuf[offfset2+1]=pData[offset1+1];//green
这一行溢出啊?请问应该注意什么地方啊?
下面的代码实现从32位向24位转换:widthbytes1=w*4;
widtybytes2=(w*24+31)/32*4;//double word alignedunsigned long* raster = (unsigned long*)GlobalAlloc(GMEM_FIXED, (w * h * sizeof (uint32)));
HGLOBAL TempBuff = GlobalAlloc(GHND,(h*widtybytes2));char* pOutBuf = (char*)TempBuff;
char* pData = (char*)raster;if(bitcount==32){
for(i=0; i<h; i++){
int m1=i*widthbytes1;
int m2=i*widthbytes2;
for(j=0; j<w; j++){
int offset1=m1+j*4;
int offset2=m2+j*3;
pOutBuf[offset2+0]=pData[offset1+0];//blue
pOutBuf[offset2+1]=pData[offset1+1];//green
pOutBuf[offset2+2]=pData[offset1+2];//red
}
}
}
其中pData和pOutBuf是char*型的指针对么?我这样做这么总是在i=2,j=243时,
pOutBuf[offfset2+1]=pData[offset1+1];//green
这一行溢出啊?请问应该注意什么地方啊?
解决方案 »
- 一个Html与对话框的问题
- 一个巨奇怪的问题,关于对话框
- 请问在同一台机器上可以同时并发多少个客户端socket连接??
- 消息捕捉
- 如何使CSplitterWnd不能拖拉改变切割好的视图的尺寸?大虾请进!在线急等!
- 一个新手问题 读取缓冲区内容
- 急,请问用GlobalAlloc分配CString变量指针数组的问题
- 简单问题:怎样修改程序显示的标题
- 求救高手:开发的简单atl组件,在IE中无法使用ActiveXObject创建
- 大家好,谁有关于BMP图像的灰度变换的程序啊?急用啊。。。
- “Windows 优化大师”类似软件中的“内存整理”功能是怎么实现的?
- CRichEditCtrl有实现类似CListBox.AddString功能的函数么?
BITMAPFILEHEADER sbf;
PBYTE pImgData;
DWORD SrcImgSize; if((fp1=fopen(SrcFileName,"rb"))==NULL)
{
MessageBox(NULL,"File cann't open","error",MB_OK);
return false;
}
fread(&sbf,1,14,fp1);
SrcImgSize=sbf.bfSize-14;
pImgData=new BYTE[SrcImgSize];
fread(pImgData,1,SrcImgSize,fp1);
fclose(fp1); LPBITMAPINFOHEADER lpbi=(LPBITMAPINFOHEADER)pImgData;
if(lpbi->biBitCount==32)//如果是32位则转为24位
{
lpbi->biBitCount=24;
lpbi->biCompression=0;
lpbi->biSizeImage=lpbi->biWidth*lpbi->biHeight*3;
SrcImgSize=lpbi->biSizeImage+40;
PBYTE ptr1,ptr2;
ptr1=ptr2=pImgData+40;
for(int i=0;i<lpbi->biWidth*lpbi->biHeight;i++)
{
*ptr1++=*(ptr2);
*ptr1++=*(ptr2+1);
*ptr1++=*(ptr2+2);
ptr2+=4;
}
} if((fp1=fopen(DstFileName,"wb"))==NULL)
{
MessageBox(NULL,"File cann't open","error",MB_OK);
return false;
}
fwrite(&sbf,1,14,fp1);
fwrite(pImgData,1,SrcImgSize,fp1);
fclose(fp1); delete[] pImgData;
return true;