태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

[Vision] Display management class - 화면 출력 관리 클래스

Posted on 2008.04.08 00:59
Filed Under Project


[code]#pragma once
#include <cv.h>
class CViewOut
{
public:
    HDC hdc;                       //DC 핸들
    LPBITMAPINFO  BitmapInfo;      //CViewOut 객체의 입/출력 비트맵 정보
    int m_iWidth;                  //출력공간 너비
    int m_iHeight;                 //출력공간 높이
    void Init(HWND Output);        //객체 초기화 (출력할 윈도우의 핸들)
    void ShowImage(IplImage* ImageData);               //DC에 이미지 출력
    void GetImageFromBitmap(HDC DC, HBITMAP BITMAP,    //BITMAP 으로 부터 이미지 정보를 가져옴
    UINT Width, UINT StartLine, UINT cLine, BYTE Colorbit, char* ToImageData);
    void SaveImage();           //현재 보여지는 이미지를 저장
}; [/code]


[code]#include "StdAfx.h"
#include "ViewOut.h"
void CViewOut::Init(HWND Output)   //객체 초기화 (윈도우핸들)
{
    //DC를 가져옴
    hdc=::GetDC(Output);

    //DC의 사이즈를 구함
    RECT rect;
    GetClientRect(Output,&rect);

    m_iWidth = rect.right - rect.left;
    m_iHeight = rect.bottom - rect.top;
    //Bitmap 구조체 초기화
    BitmapInfo=NULL;
    BitmapInfo=(BITMAPINFO*)(new char[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)]);
    BitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    BitmapInfo->bmiHeader.biWidth = m_iWidth;
    BitmapInfo->bmiHeader.biHeight = m_iHeight;
    BitmapInfo->bmiHeader.biPlanes = 1;
    BitmapInfo->bmiHeader.biCompression = BI_RGB;   
    BitmapInfo->bmiHeader.biXPelsPerMeter = 0;
    BitmapInfo->bmiHeader.biYPelsPerMeter = 0;
    BitmapInfo->bmiHeader.biClrUsed = 256;
    BitmapInfo->bmiHeader.biClrImportant = 0;
    int i;
    for(i=0;i<256;i++){
        BitmapInfo->bmiColors[i].rgbRed=(UINT8)i;
        BitmapInfo->bmiColors[i].rgbGreen=(UINT8)i;
        BitmapInfo->bmiColors[i].rgbBlue=(UINT8)i;
        BitmapInfo->bmiColors[i].rgbReserved=0;
    }
}

void CViewOut::ShowImage(IplImage* ImageData)     //DC에 이미지 출력
{
    /* IplImage 로 부터 비트카운트 계산후 비트맵 헤더 적용 */
    BitmapInfo->bmiHeader.biBitCount = ImageData->depth * ImageData->nChannels;   
    if(ImageData->depth == 24)
        BitmapInfo->bmiHeader.biSizeImage = m_iWidth*m_iHeight*3;
    if(ImageData->depth == 8)
        BitmapInfo->bmiHeader.biSizeImage = m_iWidth*m_iHeight;
    /* 화면에 출력 */
    ::StretchDIBits(hdc,0,0,m_iWidth,m_iHeight,0,0,m_iWidth,m_iHeight,ImageData->imageData,BitmapInfo,DIB_RGB_COLORS,SRCCOPY);
}

void CViewOut::GetImageFromBitmap(HDC DC, HBITMAP BITMAP, UINT Width, UINT StartLine, UINT cLine, BYTE Colorbit, char* ToImageData)
{
    /* 이전 비트맵 헤더의 사이즈정보를 저장 */
    LONG OldWidth = BitmapInfo->bmiHeader.biWidth;
    LONG OldHeight = BitmapInfo->bmiHeader.biHeight;
    /* 가져올 비트맵 정보를 셋팅 */
    BitmapInfo->bmiHeader.biBitCount = Colorbit;   
    if(Colorbit == 24)
        BitmapInfo->bmiHeader.biSizeImage = m_iWidth*m_iHeight*3;
    if(Colorbit == 8)
        BitmapInfo->bmiHeader.biSizeImage = m_iWidth*m_iHeight;
    BitmapInfo->bmiHeader.biWidth = Width;
    BitmapInfo->bmiHeader.biHeight = cLine;
    ::GetDIBits( DC, BITMAP, StartLine, cLine, (LPVOID)ToImageData, BitmapInfo, DIB_RGB_COLORS );
    /* 이전 정보를 복구 */
    BitmapInfo->bmiHeader.biWidth = OldWidth;
    BitmapInfo->bmiHeader.biHeight = OldHeight;
}

void CViewOut::SaveImage()         //현재 보여지는 이미지를 저장
{
} [/code]

View Window Management Class


Class : CView
Include : View.h


[Member Method]
void Init(HWND Output);              //객체 초기화 (출력할 윈도우의 핸들)
void ShowImage(IplImage* ImageData);         //DC에 이미지 출력
//BITMAP 으로 부터 이미지 정보를 가져옴
void GetImageFromBitmap(HDC DC, HBITMAP BITMAP,  UINT Width, UINT StartLine, UINT cLine, BYTE Colorbit, char* ToImageData);
void SaveImage();                //현재 보여지는 이미지를 저장



화면 출력을 관리하는 클래스.
Picture Control 에 대해서만 동작하며 내부 코드의 수정으로 다른 컨트롤러 타입에도 지원할 수 있다.
초기화 메소드는 Picture Control 컨트롤러의 윈도우 핸들을 받은 후 내부적으로 DC 생성을 하여 관리한다.

객체 하나당 Picture Control 컨트롤러 하나를 맡게 되며 복수개의 객체를 생성하여 사용이 가능하다.
ShowImage 메소드는 OpenCV의 IplImage 타입을 받도록 되어있지만 약간의 코드 수정으로 다양한 타입으로 변경이 가능하다.
GetImageFromBitmap 메소드는 타 DC의 비트맵핸들로 부터 Width,StartLine,cLine,BitDepth 정보를 넘겨주면 ToImageData 로 이미지 데이터 배열을 받을 수 있다.
SaveImage 메소드는 해당 Picture Control 의 현재 이미지를 저장하는 기능을 제공한다.

신고

댓글을 달아 주세요

About



모바일 페이지 QR 코드

Counter

· Total
: 468,974
· Today
: 82
· Yesterday
: 130


DNS server, DNS service