기본 콘텐츠로 건너뛰기

6월, 2009의 게시물 표시

IplImage to DC

......... {      .....      DrawIplToHDC(iplBufColor, IDC_STA_IMAGE); } void DrawIplToHDC(IplImage *image, UINT ID) {       CDC* pDC = GetDlgItem(ID)->GetDC();       CRect rcView;       GetDlgItem(ID)->GetClientRect(&rcView);       CvvImage* cvvImgage;       cvvImgage->CopyOf(image);       cvvImgage->DrawToHDC(pDC->GetSafeHdc(), &rcView);       ReleaseDC(pDC); }

빠른 픽셀 연산...

화면 전체를 가득 메우는 픽셀연산은 느립니다.   마우스로 드래그하는 시스템을 구성하여 당겨 흔들어 보면   알 수 있습니다. 오늘 그것을 빠르게 구성해 봅시다.       1. 느린 이유   용량이 많은 작업인 것은 어쩔 수 없습니다.   그것을 제외하고 이유는 보통 3가지입니다.   (클리핑을 통해 더 빨리 만든다던지, 처음작업시 이미지를 구성해서   매번 뿌린다던지의 꽁수는 각 작업상의 상황에 따른 것이니 논외로 합니다.)       1) 픽셀함수호출시간  2) for의 조건문과 픽셀접근계산  3) RGB를 분리했다 결합하는 연산       1번은 픽셀처리의 for문안에 절대 다른 함수를 호출해서는 안됩니다.   GetPixel, SetPixel은 독약입니다. 이유는 매 픽셀 "함수호출시간 + 클리핑계산 + 비트수맞춤"입니다.       2번은 memcpy식의 루프로 바꿉니다.   // 보통의 코드 RGBQUID* offset = 시작주소; INT width = 이미지가로길이, height = 이미지세로길이; INT row = 4배수정렬된 가로점의 갯수; // 바이트수가 아님 /////////////////////////////////////////////// for(int y = CY, yend = CY + CH; y < yend; ++y) for(int x = CX, xend = CX + CW; x < xend; ++x) {     offset[x + row * (height - y - 1)] = 0x00BBGGRR; }   // memcpy식 코드 RGBQUID* offset = 시작주소; INT width = 이미지가로길이, height = 이미지세로길이; INT row = 4배수정렬된 가로점의 갯수; // 바이트수가 아님 INT jump = width