2011-02-14 2 views
8

나는 CImageList의 아이콘으로 표시하고자하는 바이트 배열 (.bmp에서 직접 스트림을 통해 읽은 다음 데이터베이스의 BLOB로 저장)을 가지고 있습니다. 따라서 어떻게 든 내 데이터를 HBITMAP 또는 CBitmap에로드하려고합니다. 바이트 배열에 대한배열 [byte] from HBITMAP 또는 CBitmap

hPic = (HBITMAP)LoadImage(NULL, strPath, IMAGE_BITMAP, dwWidth, dwHeight, LR_LOADFROMFILE | LR_VGACOLOR); 
... 
CBitmap bitmap; 
bitmap.Attach(hPicRet); 

을하지만 분명 만이 파일을 작동,하지만 : 나는 파일 읽기, 지금까지 이런 식으로 일을했다. 같은 결과를 얻을 수 있지만 바이트 배열에서 읽는 방법은 무엇입니까?

편집 : 내 배열 그냥 색상 정보를 포함하지 않는, 오히려 그것으로 전체 파일이 모든 헤더와 메타 데이터를 포함, 디스크에 기록 참고. 그 모든 정보를 버리는 것은 나쁜 생각입니다.

+0

관련 : (반대 방향)? BYTE 배열에는 GDIPlus :: 맵 (http://stackoverflow.com/questions/3340017/gdiplusbitmap-to -byte-array) – jrh

답변

16

BITMAPFILEHEADER* bmfh; 
bmfh = (BITMAPFILEHEADER*)bytes; 

BITMAPINFOHEADER* bmih; 
bmih = (BITMAPINFOHEADER*)(bytes + sizeof(BITMAPFILEHEADER)); 
BITMAPINFO* bmi; 
bmi = (BITMAPINFO*)bmih; 

void* bits; 
bits = (void*)(bytes + bmfh->bfOffBits); 

HDC hdc = ::GetDC(NULL); 

HBITMAP hbmp = CreateDIBitmap(hdc, bmih, CBM_INIT, bits, bmi, DIB_RGB_COLORS) ; 

::ReleaseDC(NULL, hdc); 

그것은 좀 지저분 그리고 오류 검사의 무거운 복용량을 사용할 수 있습니다 .... 당신이 바이트라는 바이트 배열에로드 된 정보를 가정하지만, 기본적인 아이디어는 소리입니다.

+0

상자에서 일했습니다! 고맙습니다! 내가 제안 할 오류 검사의 종류를 묻습니다. –

+3

@kdansky bmi, bmih 및 비트가 모두 바이트 배열 내에 있는지 확인하십시오. GetDC가 성공했는지 확인하십시오. CreateDIBitmap이 성공했는지 확인하십시오. DC를 얻으려면보다 적절한 호출로 GetDC (NULL)를 스와핑하는 것이 좋습니다. GetDC (NULL)는 전체 화면의 DC를 사용하여 적절한 색 농도를 계산합니다.이 색 농도는 h 비트 맵을 사용할 계획에 따라 적절할 수도 적절하지 않을 수도 있습니다. – Jon

+0

내가 이것을 더 많이 투표 할 수 있다면 나는 할 것이다. 시간을 절약 해 줬어. – acraig5075

2

다음 샘플은 당신을 도울 수 있습니다. 이 같은

BITMAPINFO bmInfo; 
BITMAPINFOHEADER &bmInfohdr = (BITMAPINFOHEADER)bmInfo.bmiHeader; 

bmInfohdr.biSize = 40 + 255; //I think it's not of use 
bmInfohdr.biWidth = x; 
bmInfohdr.biHeight = y; 
bmInfohdr.biPlanes=1; 
bmInfohdr.biBitCount=8; 
bmInfohdr.biCompression=0; 
bmInfohdr.biSizeImage=0; 
bmInfohdr.biXPelsPerMeter = 0; 
bmInfohdr.biYPelsPerMeter = 0; 
bmInfohdr.biClrUsed = 0; 
bmInfohdr.biClrImportant = 0; 

      // should I allocate memory further than the 
      // bmColors[1]?? anyway the compiler gives an 
      // error for type mismatch! 
//bmInfo.bmiColors = (RGBQUAD *) 
        malloc(sizeof(RGBQUAD) * 256); 

// here I define the 256 graylevel palette 
for (int i=0; i<256; i++) 
{ 
    bmInfo.bmiColors[i].rgbRed = i; 
    bmInfo.bmiColors[i].rgbGreen = i; 
    bmInfo.bmiColors[i].rgbBlue = i; 
} 


BYTE *matrix; 
matrix = (BYTE*)malloc(size*sizeof(BYTE)); 
// here I put the BYTE values of the pixels 

CDC *pdcDest = this->GetDC(); 

HBITMAP hBmp = CreateDIBitmap(pdcDest->m_hDC, 
       &bmInfohdr, 
       CBM_INIT, 
       matrix,  
       &bmInfo, 
       DIB_RGB_COLORS); 
m_bmpBitmap.Attach(hBmp); 
0

뭔가 나를 위해 일한 :


    int bitmap[WX*WY]; // truecolor bitmap data 
    BITMAPINFO bm = { sizeof(BITMAPINFOHEADER), WX, WY, 1, 32, BI_RGB, 0, 0, 0, 0, 0 }; 
    HBITMAP bmp = CreateDIBSection(GetDC(win), &bm, DIB_RGB_COLORS, (void**)&bitmap, 0,0); 

을 (이 특별히 32 비트 색상을 설정하지만, 어떤 종류를 지정할 수 있습니다).

+0

나는이 코드를 쓰고 싶을 때 (실용적인) 윈도우 핸들을 가지고 있지 않다고 믿는다. GetDC() 부분에 대한 해결 방법이 있습니까? –

+0

@Kdansky :'GetDC (NULL)'에 의해 반환 된 화면 DC 만 사용할 수 있습니다. – casablanca

+0

이것은 충돌하지 않거나 다른 악의적 인 일을하지는 않지만 모든 사진이 비어있게됩니다. 배열에 모든 헤더를 포함하여 전체 비트 맵이 포함되어있을 때 제대로 작동합니까? 나는 정말로 DB에 파일을 저장하고 있는데, 픽셀 색상뿐만 아니라 모든 메타 데이터가 있습니다. –

0

좋아, 여기서 전체 예제 : http://nishi.dreamhosters.com/u/so_bmp_v0.zip

#include <stdio.h> 
#include <windows.h> 

#pragma comment(lib,"gdi32.lib") 
#pragma comment(lib,"user32.lib") 

char buf[1<<22]; 

int main(int argc, char **argv) { 

    FILE* f = fopen("winnt.bmp", "rb"); if(f==0) return 1; 
    fread(buf, 1,sizeof(buf), f); 
    fclose(f); 

    BITMAPFILEHEADER& bfh = (BITMAPFILEHEADER&)buf[0]; 
    BITMAPINFO& bi = (BITMAPINFO&)buf[sizeof(BITMAPFILEHEADER)]; 
    BITMAPINFOHEADER& bih = bi.bmiHeader; 
    char* bitmap = &buf[bfh.bfOffBits]; 

    int WX=1024, WY=512; // window's width/height 
    int SX=bih.biWidth, SY=bih.biHeight; 

    HWND win = CreateWindow("STATIC", "Bitmap test", 0x90C0, 0,0, WX,WY, 0,0, GetModuleHandle(0), 0); 

    MSG msg; 
    PAINTSTRUCT ps; 
    HDC DC = GetDC(win); // window's DC 
    HBITMAP dib = CreateDIBitmap(DC, &bih, CBM_INIT, bitmap, &bi, DIB_RGB_COLORS); 
    HDC dibDC = CreateCompatibleDC(DC); SelectObject(dibDC, dib); 

    ShowWindow(win, SW_SHOWNOACTIVATE); 
    SetFocus(win); 

    while(GetMessage(&msg,win,0,0)) { 
    int m = msg.message; 
    if(m==WM_PAINT) { 
     DC = BeginPaint(win, &ps); 
     StretchBlt(DC, 0,0,WX,WY, dibDC,0,0,SX,SY, SRCCOPY); 
     EndPaint(win, &ps); 
    } else if((m==WM_KEYDOWN) || (m==WM_SYSKEYDOWN)) { 
     break; 
    } else { 
     DispatchMessage(&msg); 
    } 
    } 

    return 0; 
} 
관련 문제