?? 圖像縮放.txt
字號:
////////////////////////////////////////////////////////////////
//參數說明:
// HWND hWnd:窗口句柄
//程序說明:進行圖像的縮放
BOOL Zoom(HWND hWnd)
{
//窗口處理函數
DLGPROC dlgInputBox = NULL;
//偏移、源和目標內存大小、每行字節數
DWORD OffBits,SrcBufSize,DstBufSize,DstLineBytes;
//圖像信息頭指針和數據區指針
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
//圖像新舊寬度和高度
DWORD Wold,Hold,Wnew,Hnew;
HDC hDc;
//文件句柄
HFILE hf;
//用來定位象素數據位置
DWORD x0,y0,x1,y1;
float num1;
//定義兩個文件頭結構
BITMAPFILEHEADER DstBf;
BITMAPINFOHEADER DstBi;
//實例化對話框
dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox, ghInst );
DialogBox (ghInst, "INPUTBOX", hWnd, dlgInputBox);
FreeProcInstance ( (FARPROC) dlgInputBox );
//得到縮放系數
num1=(float)(1.0/ZoomRatio);
//得到原來的寬度高度
Wold=bi.biWidth;
Hold=bi.biHeight;
//計算新圖像的寬度高度
Wnew = (DWORD)(Wold*ZoomRatio+0.5);
Hnew = (DWORD)(Hold*ZoomRatio+0.5);
//計算數據區到文件信息頭的偏移
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
//計算源圖像所需的內存大小
SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
ImgWidth=Wnew;
ImgHeight=Hnew;
//得到目標圖像中每行象素的字節數
DstLineBytes=(DWORD)WIDTHBYTES(Wnew*bi.biBitCount);
//目標圖像所需內容大小
DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*Hnew);
if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
//得到數據區指針
lpPtr=(char *)lpImgData;
lpTempPtr=(char *)lpTempImgData;
//初始化內存
memset(lpTempPtr,(BYTE)255,DstBufSize);
//保存源數據
memcpy(lpTempPtr,lpPtr,OffBits);
//創建新的文件頭和文件信息頭
memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));
memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));
DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);
DstBi.biWidth=Wnew;
DstBi.biHeight=Hnew;
//用新的文件信息覆蓋原來的值
memcpy(lpTempPtr,(char *)&DstBi,sizeof(BITMAPINFOHEADER));
//計算新文件數據區的數據
for(y1=0;y1<Hnew;y1++)
for(x1=0;x1<Wnew;x1++){
//得到橫坐標、縱坐標位置在源圖像中的值
x0= (DWORD)(x1*num1);
y0= (DWORD)(y1*num1);
//臨界判斷
if( (x0>=0) && (x0<Wold) && (y0>=0) && (y0<Hold))
{
//得到數據去位置
lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y0*LineBytes)+x0;
lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y1*DstLineBytes)+x1;
//賦值
*lpTempPtr=*lpPtr;
}
}
hDc=GetDC(hWnd);
if(hBitmap!=NULL)
DeleteObject(hBitmap);
//創建位圖
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
//新建圖像
hf=_lcreat("c:\\zoom.bmp",0);
//保存新圖像內容
_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);
_lclose(hf);
//釋放資源
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -