2010-05-22 18 views
5

Bir Win32 uygulamasında bir resim (.bmp) dosyası yüklemek istiyorum, ancak Windows API'dan standart LoadBitmap/LoadImage kullanmak istemiyorum: Bu dosyanın yüklemesini istiyorum. zaten bellekte olan bir arabellek. Doğrudan bir dosyadan bir bitmapi kolayca yükleyebilir ve ekranda yazdırabilirim, ancak bu sorun beni sıkıştırabilir.Win32 C/C++ Görüntüyü bellek arabelleğinden yükleme

Ne aradığım bu gibi çalışır bir işlevdir: Hayır

HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height); 

cevap

5

Nevermind, çözümümü buldum! İşte başlangıç ​​kodu:

std::ifstream is; 
is.open("Image.bmp", std::ios::binary); 
is.seekg (0, std::ios::end); 
length = is.tellg(); 
is.seekg (0, std::ios::beg); 
pBuffer = new char [length]; 
is.read (pBuffer,length); 
is.close(); 

tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)pBuffer; 
tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(pBuffer+sizeof(tagBITMAPFILEHEADER)); 
RGBQUAD    rgb = *(RGBQUAD*)(pBuffer+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER)); 

BITMAPINFO bi; 
bi.bmiColors[0] = rgb; 
bi.bmiHeader = bih; 

char* pPixels = (pBuffer+bfh.bfOffBits); 

char* ppvBits; 

hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0); 
SetDIBits(NULL, hBitmap, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS); 

GetObject(hBitmap, sizeof(BITMAP), &cBitmap); 
+0

Merhaba ben java geliştiriciyim, fakat uygulamada C++ 'dan resim yüklemem gerekiyor ve nasıl yapılacağını bilmiyorum. İnternette uzun zamandır araştırma yapıyorum ama yine de bunu başaramıyorum. bu yüzden lütfen tüm kodunuzu sağlamanızı rica ediyorum. Lütfen – Jony

0

, ancak yeni bir bitmap bellekte geçerli birinin boyutunu oluşturmak ve üzerine bellek yapısını yazabilirsiniz o.

CreateBitmap işlevini arıyorsunuz. Verilerinize lpvBits ayarlayın.

HBITMAP LoadBitmapFromBuffer(char *buffer, int width, int height) 
{ 
    return CreateBitmap(width, height, 1, 24, buffer); 
} 
3

CreateBitmap() deneyin . Verilmiş, zaten bitmap bitleriyle dolu bir tamponunuz var, ancak en azından verileri kopyalayabilirsiniz.

biraz spekülasyon: CreateDIBSection ayrıca dosya nesneleri bitmapleri oluşturabilir ve size doğrudan yapılmış bir bit eşlem vermeleri için CreateDIBSection kandırabilecek, Windows size bellek yığını temsil eden bir dosya nesnesini vermek almanın bir yolu, muhtemelen orada senin tampon.

3

CreateDIBSection kullanmak biraz karmaşık olabilir, ancak yapabileceği şeylerden biri aygıttan bağımsız bir bitmap oluşturabilir ve bitmap bit size tampona gösterici vermek:

+0

CreateDIBSection, kullanılacak doğru API'dır. Kullandığı bellek belirli bir çekirdek bellek türüne (grafik aygıt sürücüsünün erişmesi gerektiğinden) sahip olmak zorundadır. Bu, bir dosya bölümünden (çekirdek yapısının kendisi) ya da CreateDIBSection belleğini ayırmasına izin verilerek karşılanabilir. –

İlgili konular