C++影象縮放
轉自:http://blog.csdn.net/welcome_xu/article/details/7251316
VC++中自帶的影象縮放函式兩個:
1、
BOOL StretchBlt ( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );
2、
int StretchDIBits( HDC hdc, // handle to DC int XDest, // x-coord of destination upper-left corner int YDest, // y-coord of destination upper-left corner int nDestWidth, // width of destination rectangle int nDestHeight, // height of destination rectangle int XSrc, // x-coord of source upper-left corner int YSrc, // y-coord of source upper-left corner int nSrcWidth, // width of source rectangle int nSrcHeight, // height of source rectangle CONST VOID *lpBits, // bitmap bits CONST BITMAPINFO *lpBitsInfo, // bitmap data UINT iUsage, // usage options DWORD dwRop // raster operation code );
這兩個函式的作用是將影象的一部分或全部複製到另一個框架裡面去,如果新框架比原來的部分大,則將影象進行放大,否則縮小。(聽說這兩個函式縮放效果不好,容易引起影象失真)
自己編寫影象縮放程式碼:
int NewWidth=int(Width*fx+0.5);
int NewHeight=int(Height*fy+0.5);
int NewLineBytes=WIDTHBYTES(NewWidth*8);
HDIB hNewDIB=(HDIB)::GlobalAlloc(GHND,40+4*256+NewLineBytes*NewHeight);//分配控制程式碼空間
if(hNewDIB==NULL) return;
LPBYTE lpDIBnew=(LPBYTE)::GlobalLock((HGLOBAL)hNewDIB);//由新控制程式碼得到第二部分指標
memcpy(lpDIBnew,lpDIB,1064);//複製資訊頭和調色盤
BYTE* lpDIBBitsnew=(BYTE*)(lpDIBnew+40+4*256);//得到第四部分指標
int i0,j0;//影象在原DIB中的座標
int i,j;//影象在新DIB中的座標
float m,n;
for(i=0;i<NewHeight;i++)//雙線性插值
for(j=0;j<NewWidth;j++)
{
i0=(int)(i/fy+0.5);j0=(int)(j/fx+0.5);//計算該象素在原DIB中的座標
if((j0>=0)&&(j0<Width)&&(i0>=0)&&(i0<Height))//判斷是否在原影象範圍內
int NewHeight=int(Height*fy+0.5);
int NewLineBytes=WIDTHBYTES(NewWidth*8);
HDIB hNewDIB=(HDIB)::GlobalAlloc(GHND,40+4*256+NewLineBytes*NewHeight);//分配控制程式碼空間
if(hNewDIB==NULL) return;
LPBYTE lpDIBnew=(LPBYTE)::GlobalLock((HGLOBAL)hNewDIB);//由新控制程式碼得到第二部分指標
memcpy(lpDIBnew,lpDIB,1064);//複製資訊頭和調色盤
BYTE* lpDIBBitsnew=(BYTE*)(lpDIBnew+40+4*256);//得到第四部分指標
int i0,j0;//影象在原DIB中的座標
int i,j;//影象在新DIB中的座標
float m,n;
for(i=0;i<NewHeight;i++)//雙線性插值
for(j=0;j<NewWidth;j++)
{
i0=(int)(i/fy+0.5);j0=(int)(j/fx+0.5);//計算該象素在原DIB中的座標
if((j0>=0)&&(j0<Width)&&(i0>=0)&&(i0<Height))//判斷是否在原影象範圍內
{
m=(float)(i/fy+0.5)-i0;n=(float)(j/fx+0.5)-(int)j0;
BYTE x1,x2,y1,y2;
x1=*(lpDIBBits+int(LineBytes*(Height-i0-1)+j0));
x2=*(lpDIBBits+int(LineBytes*(Height-i0-1)+j0+1));
y1=*(lpDIBBits+int(LineBytes*(Height-i0)+j0));
y2=*(lpDIBBits+int(LineBytes*(Height-i0)+j0+1));
*(lpDIBBitsnew+NewLineBytes*(NewHeight-i-1)+j)=(BYTE)((1-m)*(1-n)*x1+(1-m)*n*x2+m*(1-n)*y1+m*n*y2);
m=(float)(i/fy+0.5)-i0;n=(float)(j/fx+0.5)-(int)j0;
BYTE x1,x2,y1,y2;
x1=*(lpDIBBits+int(LineBytes*(Height-i0-1)+j0));
x2=*(lpDIBBits+int(LineBytes*(Height-i0-1)+j0+1));
y1=*(lpDIBBits+int(LineBytes*(Height-i0)+j0));
y2=*(lpDIBBits+int(LineBytes*(Height-i0)+j0+1));
*(lpDIBBitsnew+NewLineBytes*(NewHeight-i-1)+j)=(BYTE)((1-m)*(1-n)*x1+(1-m)*n*x2+m*(1-n)*y1+m*n*y2);
}
else
*((unsigned char*)(lpDIBBitsnew+NewLineBytes*i+j))=255;//對於原影象中沒有的畫素,直接賦值為255
}
LPBITMAPINFOHEADER h=(LPBITMAPINFOHEADER)lpDIBnew;//獲得指向新影象資訊頭的指標
h->biHeight=NewHeight;//更新資訊頭的資訊
h->biWidth=NewWidth;
h->biSizeImage=NewWidth*NewHeight;
pDoc->hDib=hNewDIB;
pDoc->dWidth=NewWidth;pDoc->dHeight=NewHeight;
OnInitialUpdate();
Invalidate(TRUE);
delete dlg;
else
*((unsigned char*)(lpDIBBitsnew+NewLineBytes*i+j))=255;//對於原影象中沒有的畫素,直接賦值為255
}
LPBITMAPINFOHEADER h=(LPBITMAPINFOHEADER)lpDIBnew;//獲得指向新影象資訊頭的指標
h->biHeight=NewHeight;//更新資訊頭的資訊
h->biWidth=NewWidth;
h->biSizeImage=NewWidth*NewHeight;
pDoc->hDib=hNewDIB;
pDoc->dWidth=NewWidth;pDoc->dHeight=NewHeight;
OnInitialUpdate();
Invalidate(TRUE);
delete dlg;
裡面用到的是雙線性內插法。(比最鄰近法好,減少失真)
相關文章
- [Python影象處理] 六.影象縮放、影象旋轉、影象翻轉與影象平移Python
- [work] 影象縮放——雙線性插值演算法演算法
- 縮放比
- 如何縮放SVGSVG
- 淺析Android平臺影象壓縮方案Android
- cad縮放快捷鍵命令 cad縮放快捷鍵使用的方法
- 水平縮放的原因
- AUTOCAD——視窗縮放
- 一文讀懂影象壓縮演算法演算法
- 第二屆學習影象壓縮挑戰賽
- CAD如何使用縮放命令
- 圖鴨科技獲CVPR 2018影象壓縮挑戰賽單項冠軍,技術解讀端到端影象壓縮框架框架
- win10游標怎麼縮放_win10游標縮放方法Win10
- 深度學習影象視訊壓縮演算法——TNG深度學習演算法
- Java中縮放緩衝影像Java
- wpf viewbox整體縮放介面View
- 極端影象壓縮的生成對抗網路,可生成低位元速率的高質量影象
- win10怎麼開啟自定義縮放 win10怎麼自定義縮放Win10
- Canvas 縮放圖片中細節消失Canvas
- Flutter 自定義縮放控制元件Flutter控制元件
- Python tkinter矩形縮放測試程式Python
- android imageview 縮放檢視圖片AndroidView
- unity3d縮放物體Unity3D
- js如何監聽頁面縮放?JS
- 影像縮放、旋轉、翻轉、平移
- Flutter螢幕適配 - 等比縮放Flutter
- 影象壓縮哪家強?請看這份超詳細對比
- meta設定h5禁止縮放H5
- opencv 圖片幾何變換-縮放OpenCV
- 禁止web頁面縮放解決方案Web
- CKKS Part5: CKKS的重縮放
- IINA 設定字幕縮放快捷鍵教程
- SwiftUI圖片處理(縮放、拼圖)SwiftUI
- ZoomIt 螢幕縮放和批註工具OOMMIT
- win10螢幕字型縮放模糊怎麼辦_win10縮放後字型模糊如何解決Win10
- JavaScript DOM元素長寬等比例縮放JavaScript
- 滑鼠懸浮圖片實現縮放效果
- JavaScript圖片簡單等比例縮放JavaScript
- 教你如何進行Prometheus 分片自動縮放Prometheus