#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("Class");

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
      ,LPSTR lpszCmdParam,int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst=hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=(WNDPROC)WndProc;
 WndClass.lpszClassName=lpszClass;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  NULL,(HMENU)NULL,hInstance,NULL);
 ShowWindow(hWnd,nCmdShow);
 hWndMain=hWnd;

 while(GetMessage(&Message,0,0,0)) {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;

 switch(iMessage)
 {
 case WM_CREATE:
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd, &ps);
  EndPaint(hWnd, &ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
/*
http://blog.daum.net/cprogramer/10178315 <- api 정복...

http://tong.nate.com/ljh9477/25163557
비트맵은 DDB방식과 DIB방식이 있습니다.
디스크상에 저장된 비트맵은 DIB방식으로 저장이 되어 있죠.
DIB방식으로 저장된 비트맵은 BITMAPFILEHEADER 구조체를 읽어들여 비트맵 파일정보를 분석하고 BITMAPINFOHEADER 구조체를 읽어들여
비트맵의 크기, 색상, 포멧정보를 읽어들인뒤에 SetDIBitsToDevice 함수로 출력하면 됩니다.
즉 비트맵은 다음과 같은 방식으로 디스크에 저장되어 있는 것이죠

_____________________________
BITMAPFILEHEADER
_____________________________
BITMAPINFOHEADER
_____________________________
RGBQUARD 배열
_____________________________
비트정보


~~~~~~~~~~~~~~~~~~~~

아래는 비트맵을 읽어들이고 출력하는 코드입니다.
*/
BITMAPFILEHEADER *pBFH;
BITMAPINFOHEADER *pBIH;
PBYTE pRaster;
HANDLE hFile;
DWORD dwFileSize, dwRead;
HDC hDC;

void LoadBitmap()
{
 // 파일을 열고 비트맵 파일의 크기를 얻어온다
 hFile = CreateFile( "C:\\test.bmp", GENERIC_READ, FILE_SHARE_READ, NULL,
  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

 if( INVALID_HANDLE_VALUE == hFile )
  return FALSE;

 dwFileSize = GetFileSize( hFile, NULL );

 // 비트맵 크기만큼 메모리를 할당
 pBFH = VirtualAlloc( NULL, dwFileSize, MEM_RESERVE | MEM_COMMIT, PAGE_READONLY );
 if( NULL == pBFH )
  return FALSE;

 // 비트맵을 읽어들임
 ReadFile( hFile, pBFH, dwFileSize, &dwRead, NULL );

 // 비트정보가 들어있는 포인터를 얻어냄
 pBIH = (BITMAPINFOHEADER *)( (PBYTE)pBFH + sizeof(BITMAPFILEHEADER) );
 pRaster = (PBYTE)pBFH + pBFH->bfOffBits;
}

void PrintBitmap()
{
 // 윈도우의 핸들을 얻고 DIB를 출력
 hDC = GetDC( hWnd );
 SetDIBitsToDevice( hDC, 0, 0, pBIH->biWidth, pBIH->biHeight, 0, 0,
  pBIH->biHeight, pRaster, (BITMAPINFO *)pBIH, DIB_RGB_COLORS );

 ReleaseDC( hWnd, hDC );
}
/*
## 출처 : http://www.devpia.com
## 쓴이 : oOOo(oselo79)


비트맵 핸들 얻기
 
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, strFilePath, IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);  //strFilePath는
비트맵파일의 풀네임
 
CBitmap으로 가져오기
 
CBitmap *pbitmap=CBitmap::FromHandle(hBitmap);
 
비트맵 정보 얻기
 
BITMAP bmInfo;
pbitmap->GetBitmap(&bmInfo);
 
bmInfo 를 이용해서 다음과 같은 정보를 얻을 수 있습니다.
 
ttypedef struct tagBITMAP
{  // bm
   LONG   bmType;
   LONG   bmWidth;
   LONG   bmHeight;
   LONG   bmWidthBytes;
   WORD   bmPlanes;
   WORD   bmBitsPixel;
   LPVOID bmBits;
} BITMAP;
 
비트맵의 각 픽셀값 가져오기
 
DWORD bmpSize = bmInfo.bmHeight * bmInfo.bmWidthBytes;
BYTE* pbiBitData  = new BYTE[bmpSize];
 
pbitmap->GetBitmapBits(bmpSize, pbiBitData);
 
이렇게 하면 pbiBitData에 비트맵의 모든 pixel 값들이 들어옵니다.
 
Pixel 값들을 화면에 뿌려주기(memDC 이용)
 
INT i, j;
DWORD k = 0;
BYTE br, bg, bb;
 
for(i = 0 ; i< bmInfo.bmHeight; i++)
{
        for(j = 0; j< bmInfo.bmWidth
; j++)
        {
            br = *(pbiBitData + k+2);
            bg = *(pbiBitData + k+1);
            bb = *(pbiBitData + k);
            memDC.SetPixel(j,i, RGB(br, bg, bb));
            k+=3;
        }
        if(k%2 != 0)    k++;        //
한 Width 당 4의 배수의 Bit가 셋되어 있으므로
}
 
어디에 뿌려줄지는 모르겠지만, 뿌려줄 곳의 DC를 얻은 후
dc.BitBlt(0, 0, m_rcClient.Width(),m_rcClient.Height(), &memDC, 0,
0, SRCCOPY);
로 뿌려줌
 
물론
m_bitmap.CreateCompatibleBitmap(&dc,width,height );
memDC.CreateCompatibleDC(&dc); 등 dc 에 뿌려주기 위해
해야할 일이 다수 있는데, 그건 검색해보면 많이 나옵니다.
 
잘라내기 위한 드래그
 
CRect m_recOldVaid, m_recCurDrag; 두개를 선언
m_recCurDrag 는 뿌려주고 있는 컨트롤 또는 다이얼로그에서의
마우스 상대좌표값이 들어가야함
즉, 마우스 Move 이벤트시, 좌표를 m_recCurDrag 에 설정한
후, 다음 루틴을 실행한다.
 
if(m_bDraging)        // Key Press 이벤트가
들어온 상태에서, Mouse Move 이벤트가 발생할때마다 TRUE
{
        dc->DrawDragRect(&m_rectCurDrag,
CSize(1,1), &m_rectOldValid, CSize(0,0), &m_validRectBrush, &m_validRectBrush);
        m_rectOldValid = m_rectCurDrag;
        m_bDraging = FALSE;
}
 
이 부분을 dc.Bitblt(...); 다음에 추가하면 드래깅 됨
 
 
드래그한 부분의 Pixel 값들 가져오기
 
    int i, j;
    ULONG l = 0;
    COLORREF color;
    BYTE* pBitBuff = new BYTE[rect.Width() * rect.Height()];
 
    for(i = rect.top; i m_recCurDrag 가 바로 rect 입니다.
    {
        for(j = rect.left; j j++)
        {
            color = memDC.GetPixel(CPoint(j, i));
            *(pBitBuff+(l++)) = (BYTE)(color & 0x000000FF);
            *(pBitBuff+(l++)) = (BYTE)((color & 0x0000FF00) >> 8);
            *(pBitBuff+(l++)) = (BYTE)((color & 0x00FF0000) >> 16);
        }
    }
 
 
여기까지하면 pBitBuff 에 선택된 Pixel 값이 들가가게
되고, preview를 구현하고자 한다면, 위에서 설명한 방법으로 다른곳에 뿌려주면됩니다.
 
원래는 소스를 통채로 올릴려고 했는데.. 넘 급하게 만든거라..
소스도 허접하고, 상용툴은 아니지만 회사 재산이라는 생각도 들고..
GNU~~~~ 를 좋아하지만, 참... 아쉽지만 이정도로.. 방향은
잡히실꺼라 생각됩니다.
 
즐프요~

http://web.search.naver.com/search.naver?where=webkr&query=%BA%F1%C6%AE%B8%CA+%A4%B1api&sm=tab_hty
*/

'알고리즘 > 이미지 처리' 카테고리의 다른 글

GDI+에서의 투명색 처리...  (0) 2008.01.25
이미지 회전 알고리즘  (0) 2008.01.18
Image Processing  (0) 2008.01.18
그림 띄우기  (0) 2008.01.07
[본문스크랩] BMP(비트맵) 파일  (0) 2007.09.06
BMP 에 관해서  (0) 2007.07.08
ㅠ_ㅠ
시작되었다.. 압박의 시작이..
연습문제 9-1,2,3번 해답 소스.

+ Recent posts