我要对位图缩放,比如我有一个320X240的MFC的CBitmap,我象将其缩为160X120,怎么处理啊
或者是我有320X240的位图文件的头结构BITMAPINFOHEADER和数据部分缓冲,怎么变成
160X120的头和数据缓冲呢
最好有代码了,谢谢
或者是我有320X240的位图文件的头结构BITMAPINFOHEADER和数据部分缓冲,怎么变成
160X120的头和数据缓冲呢
最好有代码了,谢谢
解决方案 »
- WM_CHAR的处理函数中刷新屏幕,太频繁,屏幕闪烁,怎么解决呀!
- 怎样自动填充图案
- 用CMSWinsockControl的对象,连接的时候总是弹出“Unsupported variant types”报错对话框
- 求助鼠标pick 3d对象问题
- 世界上有很多奇怪的问题,没有遇到这个问题的人肯定会说楼主肯定疯了
- vc6.0 连接SQL 数据库时,数据库表的名字为什么是数字时连不上啊!
- 请教怎么改变静态文本字体大小?
- 在VC里如何实现QQ的界面啊,急急急急急急急急急急急?
- 求助,,,,从一个vc做的 Dll中传回值的问题,急。。。。。。
- 伤痕!!男子汉的勋章!!(关于多任务编程的噩梦般的颤抖难题)
- 一个很简单的问题,谢谢帮助
- 关于在线教育系统网络的开发
就可以实现对位图的缩放了!
不过失真比较严重!
应该对数据进行重新采样
int horizon; int vertical; CScale dlg;
//读取放大或者缩小的比例
if(dlg.DoModal()==IDOK)
{
horizon = dlg.m_horizon;//水平的比例
vertical = dlg.m_vertical;//垂直的比例
}
else
{
return ;
} LPBITMAPINFOHEADER lpbmi; //BYTE* lpDIBBits; lpbmi = (LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)pDoc->m_Dib.m_hDIB); LPSTR lpDIB; lpDIB = (LPSTR)GlobalLock((HGLOBAL) pDoc->m_Dib.m_hDIB); unsigned char* lpDIBBits = (unsigned char *)::FindDIBBits(lpDIB); //lpDIBBits = (BYTE*)(lpbmi + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256); HANDLE buffer; LPSTR bufdata;
//分配一块内存,用来存放信息头和调色板
buffer = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, sizeof(BITMAPINFO) + 256*sizeof(RGBQUAD)); bufdata = (LPSTR) GlobalLock((HGLOBAL) buffer);
//将信息头和调色板暂时存放在刚分配的内存中
for(int k=0; k<sizeof(BITMAPINFO) + 256*sizeof(RGBQUAD); k++)
{
*(bufdata + k) = *(lpDIB + k);
} HANDLE datahandle; LPSTR data; int height = lpbmi->biHeight; int width = lpbmi->biWidth; int lWidthBytes = WIDTHBYTES(width*8);
//取出图像中原来的数据
datahandle = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, height*lWidthBytes); data = (LPSTR) GlobalLock((HGLOBAL) datahandle); for(int i=0; i<height; i++)
{
for(int j=0; j<width; j++)
{
*(data + i*lWidthBytes + j) = *(lpDIBBits + i*lWidthBytes + j);
}
}
int Sheight = height*vertical/100; //缩小后的图像
int Swidth = width*horizon/100;
int lwidthbytes = WIDTHBYTES(Swidth*8);//缩小后的
//释放掉原来的内存快,重新分配内存。
GlobalUnlock((HGLOBAL) pDoc->m_Dib.m_hDIB); GlobalFree((HGLOBAL) pDoc->m_Dib.m_hDIB); pDoc->m_Dib.m_hDIB = (HDIB)GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, sizeof(BITMAPINFO) + 256*sizeof(RGBQUAD) + Sheight*lwidthbytes);
lpDIB = (LPSTR)GlobalLock((HGLOBAL) pDoc->m_Dib.m_hDIB);
//将暂存的信息头和调色板重新放到新的内存中。
for(int l=0; l<sizeof(BITMAPINFO) + 256*sizeof(RGBQUAD); l++)
{
*(lpDIB + l) = *(bufdata + l);
}
//调整信息头
lpbmi = (LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)pDoc->m_Dib.m_hDIB); lpbmi->biSizeImage = (lpbmi->biSizeImage*vertical*horizon)/10000; //lpbmi->biSize = lpbmi->biSize - (3*height*width/4); lpbmi->biHeight = Sheight; lpbmi->biWidth = Swidth; lpDIBBits = (unsigned char*)::FindDIBBits(lpDIB);
//调整图像, 进行缩放。
for( int a=0; a<Sheight; a++)
{
for(int b=0; b<Swidth; b++)
{
*(lpDIBBits + a*lwidthbytes + b) = *(data + (int)(a*100/vertical)*lWidthBytes + (int)(b*100/horizon));
}
}
pDoc->SetModifiedFlag(TRUE); GlobalUnlock((HGLOBAL) buffer); GlobalFree((HGLOBAL) buffer); GlobalUnlock((HGLOBAL) datahandle); GlobalFree((HGLOBAL) datahandle); GlobalUnlock((HGLOBAL) pDoc->m_Dib.m_hDIB);
//OnDoRealize((WPARAM)m_hWnd,0); OnInitialUpdate(); pDoc->UpdateAllViews(NULL);