使用StretchBlt函式進行影象縮放
[1].[程式碼] [C/C++]程式碼 跳至[1] [2]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
// Resize CImage void
CreateStretchImage(CImage *pImage,CImage *ResultImage, int
StretchHeight, int
StretchWidth){ if (pImage->IsDIBSection()){ // 取得 pImage 的 DC CDC* pImageDC1 = CDC::FromHandle(pImage->GetDC());
// Image 因為有自己的 DC, 所以必須使用 FromHandle 取得對應的 DC CBitmap *bitmap1=pImageDC1->GetCurrentBitmap(); BITMAP bmpInfo; bitmap1->GetBitmap(&bmpInfo); // 建立新的 CImage ResultImage->Create(StretchWidth,StretchHeight,bmpInfo.bmBitsPixel); CDC* ResultImageDC = CDC::FromHandle(ResultImage->GetDC()); // 當 Destination 比較小的時候, 會根據 Destination DC 上的 Stretch Blt mode 決定是否要保留被刪除點的資訊 ResultImageDC->SetStretchBltMode(HALFTONE);
// 使用最高品質的方式 ::SetBrushOrgEx(ResultImageDC->m_hDC,0,0,NULL);
// 調整 Brush 的起點 // 把 pImage 畫到 ResultImage 上面 StretchBlt(*ResultImageDC,0,0,StretchWidth,StretchHeight,*pImageDC1,0,0,pImage->GetWidth(),pImage->GetHeight(),SRCCOPY); // pImage->Draw(*ResultImageDC,0,0,StretchWidth,StretchHeight,0,0,pImage->GetWidth(),pImage->GetHeight()); pImage->ReleaseDC(); ResultImage->ReleaseDC(); } } // 建立指定大小的圖形 // 輸入: 原始圖檔=pBitmap, 指定大小=StretchHeight StretchWidth, 結果圖檔=pResultBmp // Usage: void
reateStretchBmp(CBitmap* pBitmap , int
StretchHeight , int
StretchWidth, CBitmap *pResultBmp){ // 建立顯示螢幕的 DC CDC dcScreen; dcScreen.Attach(::GetDC(NULL)); // 取得原始圖檔的 dc CDC dcMemory; dcMemory.CreateCompatibleDC(&dcScreen); CBitmap *pOldOrgBitmap= dcMemory.SelectObject(pBitmap); // 建立新的結果圖形 (指定大小) pResultBmp->CreateCompatibleBitmap(&dcScreen,StretchWidth,StretchHeight); // 取得結果圖形的 dc CDC dcFixMemory; dcFixMemory.CreateCompatibleDC(&dcScreen); CBitmap *pOldReslutBitmap=dcFixMemory.SelectObject(pResultBmp);
// 讓 dcFixMemory 選擇到 "結果bmp", 任何對 dcFixMemory 的動作都會反映到 pResultBmp // 把原始圖形縮放畫到 Memory DC上面 BITMAP bmpInfo; pBitmap->GetBitmap(&bmpInfo);
// 取得 原始圖檔的寬度與高度 StretchBlt(dcFixMemory,0,0,StretchWidth,StretchHeight,dcMemory,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY); // Set Back dcMemory.SelectObject(pOldOrgBitmap); dcFixMemory.SelectObject(pOldReslutBitmap); } |
[2].[程式碼] 對整個圖片做縮放 跳至[1] [2]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
unsigned char * HCNImage::do_Stretch_Linear( int
w_Dest, int
h_Dest, int bit_depth,unsigned
char *src, int
w_Src, int
h_Src) { int
sw = w_Src-1, sh = h_Src-1, dw = w_Dest-1, dh = h_Dest-1; int
B, N, x, y; int
nPixelSize = bit_depth/8; unsigned char
*pLinePrev,*pLineNext; unsigned char
*pDest = new
unsigned char [w_Dest*h_Dest*bit_depth/8]; unsigned char
*tmp; unsigned char
*pA,*pB,*pC,*pD; for ( int
i=0;i<=dh;++i) { tmp =pDest + i*w_Dest*nPixelSize; y = i*sh/dh; N = dh - i*sh%dh; pLinePrev = src + (y++)*w_Src*nPixelSize; pLineNext = (N==dh) ? pLinePrev : src+y*w_Src*nPixelSize; for ( int
j=0;j<=dw;++j) { x = j*sw/dw*nPixelSize; B = dw-j*sw%dw; pA = pLinePrev+x; pB = pA+nPixelSize; pC = pLineNext + x; pD = pC + nPixelSize; if (B == dw) { pB=pA; pD=pC; } for ( int
k=0;k<nPixelSize;++k) { *tmp++ = ( unsigned
char )(
int )( ( B * N * ( *pA++ - *pB - *pC + *pD ) + dw * N * *pB++ + dh * B * *pC++ + ( dw * dh - dh * B - dw * N ) * *pD++ + dw * dh / 2 ) / ( dw * dh ) ); } } } return
pDest; } |
相關文章
- C++影象縮放C++
- OpenCV(iOS)影象尺寸縮放(14)OpenCViOS
- StretchBlt函式和BitBlt函式的區別和用法函式
- [Python影象處理] 六.影象縮放、影象旋轉、影象翻轉與影象平移Python
- 影象縮放--插值法(opencv,原理)OpenCV
- TransparentBlt、StretchBlt與BitBlt三個函式的區別函式
- 使用SQIP工具和交叉點觀察器進行漸進式影象載入
- 使用 canvas 對影象進行處理Canvas
- 使用 Python 函式進行模組化Python函式
- 【影象演算法】高斯模糊+徑向縮放模糊演算法
- iOS下使用OpenCV進行影象識別iOSOpenCV
- Node.js 對圖片進行裁切、縮放Node.js
- [work] 影象縮放——雙線性插值演算法演算法
- iOS中使用opencv進行影象識別操作iOSOpenCV
- 使用AngularJS中的filterFilter函式進行過濾AngularJSFilter函式
- C#影象顯示實現拖拽、錨點縮放功能【轉】C#
- 前端進階-執行時函式前端函式
- Matplotlib 系列之【繪製函式影象】函式
- 幾個令人驚歎的函式影象函式
- Android 中實現圖片平移、縮放、旋轉同步進行Android
- CAD如何使用縮放命令
- Sql Server函式全解(3):資料型別轉換函式和文字影象函式SQLServer函式資料型別
- cad縮放快捷鍵命令 cad縮放快捷鍵使用的方法
- 使用Oracle CEIL函式進行萬位四捨五入HGOracle函式
- 【數字影象處理】六.MFC空間幾何變換之影象平移、映象、旋轉、縮放詳解
- 一個 Pillow 實現的影象填充函式函式
- 如何檢測頁面是否進行了縮放
- 使用CLR函式壓縮(Gzip)ntext型別欄位函式型別
- 影象縮放的雙線性內插值演算法的原理解析演算法
- Django中views資料查詢使用locals()函式進行優化DjangoView函式優化
- 使用 BZ2Compressor 進行增量壓縮
- 縮放比
- OpencV_Python影象濾波函式小結OpenCVPython函式
- 一元、二元函式影象繪製函式
- javascript函數語言程式設計: 優雅的使用underscore進行函式程式設計JavaScript函數程式設計函式
- ios使用openlayer地圖縮放時卡頓iOS地圖
- JPEG影象的解壓縮操作
- php自定義函式放哪兒PHP函式