HDIB是原始圖像的句柄, nWidth和nHeight就是縮小或放大后的大小.直接調(diào)用就行.
WaitCursorBegin()
WaitCursorEnd();兩句刪掉;
急!在線等~~C++怎么把圖象縮小或放大一倍?
急!在線等~~C++怎么把圖象縮小或放大一倍?
HDIB ChangeDIBSize(HDIB hDIB, int nWidth, int nHeight)
{ LPBITMAPINFO lpbmi = NULL;
LPBYTE lpSourceBits, lpTargetBits, lpResult;
HDChDC = NULL, hSourceDC, hTargetDC;
HBITMAPhSourceBitmap, hTargetBitmap, hOldTargetBitmap, hOldSourceBitmap;
DWORDdwSourceBitsSize, dwTargetBitsSize, dwTargetHeaderSize;
HDIB hNewDIB;
DWORD dwSize;
WaitCursorBegin()
if (! hDIB)
{WaitCursorEnd();
return NULL;}
LPBITMAPINFO lpSrcDIB = (LPBITMAPINFO)GlobalLock(hDIB);
if (! lpSrcDIB)
{WaitCursorEnd();
return NULL;}
dwTargetHeaderSize = sizeof( BITMAPINFOHEADER ) + PaletteSize(lpSrcDIB);
lpbmi = (LPBITMAPINFO)malloc( dwTargetHeaderSize );
memcpy(lpbmi, lpSrcDIB, dwTargetHeaderSize);
lpbmi->bmiHeader.biWidth = nWidth;
lpbmi->bmiHeader.biHeight = nHeight;
hDC = GetDC( NULL );
hTargetBitmap = CreateDIBSection( hDC, lpbmi, DIB_RGB_COLORS, (VOID **)&lpTargetBits, NULL, 0 );
hSourceBitmap = CreateDIBSection( hDC, lpSrcDIB, DIB_RGB_COLORS, (VOID **)&lpSourceBits, NULL, 0 );
hSourceDC = CreateCompatibleDC( hDC );
hTargetDC = CreateCompatibleDC( hDC );
dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight * BytesPerLine((LPBYTE)&(lpSrcDIB->bmiHeader));
dwTargetBitsSize = lpbmi->bmiHeader.biHeight * BytesPerLine((LPBYTE)&(lpbmi->bmiHeader));
memcpy( lpSourceBits, FindDIBBits((LPBYTE)lpSrcDIB), dwSourceBitsSize );
lpbmi->bmiHeader.biSizeImage = dwTargetBitsSize;
hOldSourceBitmap = (HBITMAP)SelectObject( hSourceDC, hSourceBitmap );
hOldTargetBitmap = (HBITMAP)SelectObject( hTargetDC, hTargetBitmap );
SetStretchBltMode( hTargetDC, COLORONCOLOR );
StretchBlt( hTargetDC, 0, 0, lpbmi->bmiHeader.biWidth, lpbmi->bmiHeader.biHeight, hSourceDC, 0, 0, lpSrcDIB->bmiHeader.biWidth, lpSrcDIB->bmiHeader.biHeight, SRCCOPY );
SelectObject( hSourceDC, hOldSourceBitmap );
SelectObject( hTargetDC, hOldTargetBitmap );
DeleteDC( hSourceDC );
DeleteDC( hTargetDC );
ReleaseDC( NULL, hDC );
GdiFlush();
dwSize = dwTargetHeaderSize + dwTargetBitsSize;
hNewDIB = GlobalAlloc(GHND, dwSize);
lpResult = (LPBYTE)GlobalLock(hNewDIB);//malloc( dwTargetHeaderSize + dwTargetBitsSize );
memcpy( lpResult, lpbmi, dwTargetHeaderSize );
memcpy( FindDIBBits( (LPBYTE)lpResult ), lpTargetBits, dwTargetBitsSize );
DeleteObject( hTargetBitmap );
DeleteObject( hSourceBitmap );
free( lpbmi );
GlobalUnlock(hDIB);
GlobalUnlock(hNewDIB);
WaitCursorEnd();
return hNewDIB;}
以上是圖象縮放函數(shù)的源代碼,我現(xiàn)在需要直接把圖象縮小到原來的一半和放大一倍.請問需要改動哪里,具體怎么改?用自己的代碼也可以~謝謝啦
HDIB ChangeDIBSize(HDIB hDIB, int nWidth, int nHeight)
{ LPBITMAPINFO lpbmi = NULL;
LPBYTE lpSourceBits, lpTargetBits, lpResult;
HDChDC = NULL, hSourceDC, hTargetDC;
HBITMAPhSourceBitmap, hTargetBitmap, hOldTargetBitmap, hOldSourceBitmap;
DWORDdwSourceBitsSize, dwTargetBitsSize, dwTargetHeaderSize;
HDIB hNewDIB;
DWORD dwSize;
WaitCursorBegin()
if (! hDIB)
{WaitCursorEnd();
return NULL;}
LPBITMAPINFO lpSrcDIB = (LPBITMAPINFO)GlobalLock(hDIB);
if (! lpSrcDIB)
{WaitCursorEnd();
return NULL;}
dwTargetHeaderSize = sizeof( BITMAPINFOHEADER ) + PaletteSize(lpSrcDIB);
lpbmi = (LPBITMAPINFO)malloc( dwTargetHeaderSize );
memcpy(lpbmi, lpSrcDIB, dwTargetHeaderSize);
lpbmi->bmiHeader.biWidth = nWidth;
lpbmi->bmiHeader.biHeight = nHeight;
hDC = GetDC( NULL );
hTargetBitmap = CreateDIBSection( hDC, lpbmi, DIB_RGB_COLORS, (VOID **)&lpTargetBits, NULL, 0 );
hSourceBitmap = CreateDIBSection( hDC, lpSrcDIB, DIB_RGB_COLORS, (VOID **)&lpSourceBits, NULL, 0 );
hSourceDC = CreateCompatibleDC( hDC );
hTargetDC = CreateCompatibleDC( hDC );
dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight * BytesPerLine((LPBYTE)&(lpSrcDIB->bmiHeader));
dwTargetBitsSize = lpbmi->bmiHeader.biHeight * BytesPerLine((LPBYTE)&(lpbmi->bmiHeader));
memcpy( lpSourceBits, FindDIBBits((LPBYTE)lpSrcDIB), dwSourceBitsSize );
lpbmi->bmiHeader.biSizeImage = dwTargetBitsSize;
hOldSourceBitmap = (HBITMAP)SelectObject( hSourceDC, hSourceBitmap );
hOldTargetBitmap = (HBITMAP)SelectObject( hTargetDC, hTargetBitmap );
SetStretchBltMode( hTargetDC, COLORONCOLOR );
StretchBlt( hTargetDC, 0, 0, lpbmi->bmiHeader.biWidth, lpbmi->bmiHeader.biHeight, hSourceDC, 0, 0, lpSrcDIB->bmiHeader.biWidth, lpSrcDIB->bmiHeader.biHeight, SRCCOPY );
SelectObject( hSourceDC, hOldSourceBitmap );
SelectObject( hTargetDC, hOldTargetBitmap );
DeleteDC( hSourceDC );
DeleteDC( hTargetDC );
ReleaseDC( NULL, hDC );
GdiFlush();
dwSize = dwTargetHeaderSize + dwTargetBitsSize;
hNewDIB = GlobalAlloc(GHND, dwSize);
lpResult = (LPBYTE)GlobalLock(hNewDIB);//malloc( dwTargetHeaderSize + dwTargetBitsSize );
memcpy( lpResult, lpbmi, dwTargetHeaderSize );
memcpy( FindDIBBits( (LPBYTE)lpResult ), lpTargetBits, dwTargetBitsSize );
DeleteObject( hTargetBitmap );
DeleteObject( hSourceBitmap );
free( lpbmi );
GlobalUnlock(hDIB);
GlobalUnlock(hNewDIB);
WaitCursorEnd();
return hNewDIB;}
以上是圖象縮放函數(shù)的源代碼,我現(xiàn)在需要直接把圖象縮小到原來的一半和放大一倍.請問需要改動哪里,具體怎么改?用自己的代碼也可以~謝謝啦
其他人氣:179 ℃時間:2020-05-10 20:36:20
優(yōu)質(zhì)解答
我來回答
類似推薦
- 把圖a按比例放大得到圖b,按比例縮小得到圖c.圖中的數(shù)據(jù)組成比例
- 圖形的放大與縮小.
- 圖形的放大和縮小是按( )進(jìn)行的.
- 把圖A放大后得到圖B,縮小后得到圖C,根據(jù)圖中的數(shù)據(jù)組成比例.
- 生活中還有哪些圖形放大和縮小的例子
- 英語翻譯
- 將粉筆頭輕放在以2m/s運(yùn)動的傳送帶上,傳送帶留下一條長度為4米的劃線.請問,為什么劃線的長度等于傳送帶的位移減去物體的位移?請?jiān)斀?
- <<湯姆索亞歷險(xiǎn)記>>以什么為線索,鞭撻了什么?
- 桂花雨主要內(nèi)容?30字以上
- 誰能幫我想個詞來形容這個人
- (找等量關(guān)系列方程)
- 等比數(shù)列{an}中,a1+a2=8,a3-a1=16,則a3等于( ?。?A.20 B.18 C.10 D.8
猜你喜歡
- 1自天然藥物提取液中識別生物堿是否存在的主要反應(yīng)及其試劑有哪些
- 2已知函數(shù)f ( x )等于(cos x)的四次方減去2sin xcos x減去(sin x)的四次方.1)求f ( x ) 的最小正周期;...
- 3在9 8 7 6 5 4 3 2 1=20添上加減乘除使等式成立
- 4用“攛掇”“絮叨”“怠慢”造句
- 5△ABC中,B>90° a=2x-5 b=x+1 c=4 求 x的取值范圍.
- 6Experience more than sufficiently teaches that men govern nothing with more difficult than their tongues.問govern sth wit
- 7氧化銅與稀硫酸反應(yīng)的化學(xué)方程式
- 8為什么高中化學(xué)先學(xué)的離子反應(yīng)再學(xué)氧化還原反應(yīng) 離子反應(yīng)里面有好多寫的時候要用到氧化還原的知識的啊
- 9已知:關(guān)于x的方程kx^2-(4k+1)x+3k+3=0
- 10語文作文:如何審題?如何理解話題?
- 11先生的讀音,生是讀一聲還是輕聲
- 12額定電壓220V、容量100L、電阻24.2Ω的電熱水器,它的電功率是多少?