位图保存下来是翻转的!怎么正过来
位图保存下来是翻转的!!!!!!!!!!!!!!!!如何正过来
CString str;
str="c:\\temp2.bmp";//目标图像
CBitmap *bitmap;
BITMAP bm;
bitmap=CBitmap::FromHandle((HBITMAP)::LoadImage(0,"c:\\temp1.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION |LR_DEFAULTSIZE |LR_LOADFROMFILE));//调用原始图像
bitmap->GetBitmap(&bm);
BYTE *pBits=new BYTE[bm.bmWidthBytes*bm.bmHeight];
memmove(pBits,bm.bmBits,bm.bmWidthBytes*bm.bmHeight); //读到缓冲区,应该是这里就开始被反了?????可是我无法解决,水平不够
//同态滤波代码
IGPI_Homomorphic(pBits,bm.bmHeight,bm.bmWidthBytes,0.5,2,3,8);//这个外部函数应没问题
bitmap->SetBitmapBits(bm.bmWidthBytes*bm.bmHeight,pBits); //将滤波处理后的回填到原始图像
SaveBitmapToFile(bitmap,(LPSTR)(LPCTSTR)str);//保存位图到temp2
同态滤波的例子
temp1原始图 temp2目标图
最后得到的temp2.bmp是temp1.bmp翻转的图像
保存下来的bmp图像是上下翻转的,如何不翻转?!
求代码修改
------解决方案--------------------
------解决方案--------------------
楼主试试CXImage类,这个可以把buffer中的图像保存成图片的,你看看memmove(pBits,bm.bmBits,bm.bmWidthBytes*bm.bmHeight)之后,pBits里的图像是不是反的。
有一个效率低一些的办法,再把图像反过来:
DWORD dwRGB24BufLen = iWidth * iHeight * 3;
BYTE *pTempBuf = new BYTE[dwRGB24BufLen];
if(NULL == pTempBuf)
{
return;
}
memset(pTempBuf, 0, dwRGB24BufLen * sizeof(BYTE));
DWORD dwLineData = (iWidth * 24) >> 3;
for(DWORD dwLoop = 0; dwLoop < iHeight; dwLoop++)
{
memcpy(pTempBuf + dwLoop * dwLineData, pBits + dwRGB24BufLen - (dwLoop + 1) * dwLineData, dwLineData * sizeof(BYTE));
}
memcpy(pBits, pTempBuf, dwRGB24BufLen);
delete[] pTempBuf;
pTempBuf = NULL;
------解决方案--------------------
高度改成负值
------解决方案--------------------
见4楼。
原因:DDB的图素位是从上到下的,DIB的图素位是从下到上的。
你把SaveBitmapToFile函数里的biHeight字段改称相反的值就行了。
------解决方案--------------------
DIB数据在内存中就是底朝上放的。
你要是想自己控制缓冲区pBits中的数据,自己颠倒过来,可以这样:
BYTE *buf=new BYTE[bm.bmWidthBytes*bm.bmHeight];
for(int i=0; i<bm.bmHeight; i++)
{
memcpy(buf+i*bm.bmWidthBytes ,pBits+(bm.bmHeight-i-1)*bm.bmWidthBytes),bm.bmWidthBytes);
}
------解决方案--------------------
//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = - Bitmap.bmHeight; //改称负的。
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
注意:改称负的只能是用看图软件打开时不颠倒,里面的数据其实仍是倒得。
------解决方案--------------------
DIBSECTION跟bmp文件一样是倒置的。
SetBitmapBits是用填充DDB位,但是你用DIB位区填充式什么意思呢?
此处应该用memmove(bm.bmBits,pBits,bm.bmWidthBytes*bm.bmHeight);
CString str;
str="c:\\temp2.bmp";//目标图像
CBitmap *bitmap;
BITMAP bm;
bitmap=CBitmap::FromHandle((HBITMAP)::LoadImage(0,"c:\\temp1.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION |LR_DEFAULTSIZE |LR_LOADFROMFILE));//调用原始图像
bitmap->GetBitmap(&bm);
BYTE *pBits=new BYTE[bm.bmWidthBytes*bm.bmHeight];
memmove(pBits,bm.bmBits,bm.bmWidthBytes*bm.bmHeight); //读到缓冲区,应该是这里就开始被反了?????可是我无法解决,水平不够
//同态滤波代码
IGPI_Homomorphic(pBits,bm.bmHeight,bm.bmWidthBytes,0.5,2,3,8);//这个外部函数应没问题
bitmap->SetBitmapBits(bm.bmWidthBytes*bm.bmHeight,pBits); //将滤波处理后的回填到原始图像
SaveBitmapToFile(bitmap,(LPSTR)(LPCTSTR)str);//保存位图到temp2
同态滤波的例子
temp1原始图 temp2目标图
最后得到的temp2.bmp是temp1.bmp翻转的图像
保存下来的bmp图像是上下翻转的,如何不翻转?!
求代码修改
------解决方案--------------------
------解决方案--------------------
楼主试试CXImage类,这个可以把buffer中的图像保存成图片的,你看看memmove(pBits,bm.bmBits,bm.bmWidthBytes*bm.bmHeight)之后,pBits里的图像是不是反的。
有一个效率低一些的办法,再把图像反过来:
DWORD dwRGB24BufLen = iWidth * iHeight * 3;
BYTE *pTempBuf = new BYTE[dwRGB24BufLen];
if(NULL == pTempBuf)
{
return;
}
memset(pTempBuf, 0, dwRGB24BufLen * sizeof(BYTE));
DWORD dwLineData = (iWidth * 24) >> 3;
for(DWORD dwLoop = 0; dwLoop < iHeight; dwLoop++)
{
memcpy(pTempBuf + dwLoop * dwLineData, pBits + dwRGB24BufLen - (dwLoop + 1) * dwLineData, dwLineData * sizeof(BYTE));
}
memcpy(pBits, pTempBuf, dwRGB24BufLen);
delete[] pTempBuf;
pTempBuf = NULL;
------解决方案--------------------
高度改成负值
------解决方案--------------------
见4楼。
原因:DDB的图素位是从上到下的,DIB的图素位是从下到上的。
你把SaveBitmapToFile函数里的biHeight字段改称相反的值就行了。
------解决方案--------------------
DIB数据在内存中就是底朝上放的。
你要是想自己控制缓冲区pBits中的数据,自己颠倒过来,可以这样:
BYTE *buf=new BYTE[bm.bmWidthBytes*bm.bmHeight];
for(int i=0; i<bm.bmHeight; i++)
{
memcpy(buf+i*bm.bmWidthBytes ,pBits+(bm.bmHeight-i-1)*bm.bmWidthBytes),bm.bmWidthBytes);
}
------解决方案--------------------
//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = - Bitmap.bmHeight; //改称负的。
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
注意:改称负的只能是用看图软件打开时不颠倒,里面的数据其实仍是倒得。
------解决方案--------------------
DIBSECTION跟bmp文件一样是倒置的。
SetBitmapBits是用填充DDB位,但是你用DIB位区填充式什么意思呢?
此处应该用memmove(bm.bmBits,pBits,bm.bmWidthBytes*bm.bmHeight);