2017-06-12 80 views
0

我試圖獲得AtlImage的字節緩衝區。類型爲CImage 此代碼將只是規模從路徑szFilePath 這裏裝載的圖像,它是:從CImage獲取緩衝區數組AtlImage

int iNewWidth = 60; 
int iNewHeight = 60; 

CImage image; 
image.Load(szFilePath); 

CDC *screenDC = GetDC(); 
CDC *pMDC = new CDC; 
pMDC->CreateCompatibleDC(screenDC); 

CBitmap *pb = new CBitmap; 
pb->CreateCompatibleBitmap(screenDC, iNewWidth, iNewHeight); 

CBitmap *pob = pMDC->SelectObject(pb); 
image.StretchBlt(pMDC->m_hDC, 0, 0, iNewWidth, iNewHeight, 0, 0, image.GetWidth(), image.GetHeight(), SRCCOPY); 
pMDC->SelectObject(pob); 

CImage new_image; 
new_image.Attach((HBITMAP)(*pb)); 

int bytesnbr = abs(new_image.GetPitch()) * new_image.GetHeight(); 
mSize = bytesnbr; 
mBuffer = new BYTE[bytesnbr]; 
DWORD dwValue = pob->GetBitmapBits(bytesnbr, mBuffer); 

new_image.Detach(); 
ReleaseDC(screenDC); 

我發現了一個異常isDibSection() 我想獲得緩衝對它進行編碼以base64。 也許是有另一種方式......無論如何,我需要縮放圖像。 感謝您的幫助

+0

你是什麼意思「_我得到異常'isDibSection()'_」?我沒有看到你的代碼中提到的那個名字的功能。例外發生在哪裏? – Rook

+0

此異常是從atlimage.h當我打電話GetPitch – DevAndroid

+0

爲什麼不使用保存方法與提供了CreateStreamOnHGlobal – xMRi

回答

1

對於DIB部分的圖像,您不能使用GetBitmapBits。它僅適用於與設備相關的位圖(DDB)。據推測,MFC從這個bug中保存了一個斷言,該斷言在內部驗證該對象不是DIB部分。

你應該使用什麼是GetDIBits,這是你應該使用什麼反正,因爲GetBitmapBits變得過時了大約90年代中期引進32位的Windows。

更一般地說,您的代碼看起來像是由Java翻譯的人編寫的。你不需要new所有這些對象。只需使用自動分配在堆棧上創建它們即可。

+0

創建如何使用的GetDIBits用的CImage一個IStream? – DevAndroid