2017-06-12 7 views
0

AtlImageのバイトバッファを取得しようとしています。タイプは、このコードは、単にパスszFilePath からロードされた画像を拡大縮小しますCImage ここにあるさ: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); 

私はBASE64でそれをエンコードするためのバッファを取得したいと思い例外isDibSection() を取得しています。 別の方法があるかもしれません...とにかく、画像を拡大縮小する必要があります。 ありがとうございました

+0

"isDibSection()' _ "という例外が発生しましたか?あなたのコードにその名前で言及されている関数は表示されません。例外はどこで発生するのですか? – Rook

+0

この例外はGetPitchを呼び出すとatlimage.hからです – DevAndroid

+0

CreateStreamOnHGlobalで作成されたIStreamを提供するSaveメソッドを使用しない理由 – xMRi

答えて

1

GetBitmapBitsはDIBセクションの画像には使用できません。デバイス依存のビットマップ(DDB)を使用してのみが動作します。おそらく、MFCは、CImageオブジェクトがDIBセクションではないことを内部的に検証するアサーションを使用して、このバグからあなたを救いました。あなたが使用する必要がありますどのような

GetBitmapBitsは、32ビットWindowsの導入により、1990年代半ばごろ時代遅れになってから、あなたはとにかくを使用すべきかである、GetDIBitsです。

もっと一般的には、あなたのコードは、Javaから翻訳した人が書いたようです。これらのオブジェクトをすべてnewまで上げる必要はありません。自動割り当てを使用してスタックに作成するだけです。

+0

CImageでGetDIBitsを使用する方法 – DevAndroid

関連する問題