LabWindows/CVI

cancel
Showing results for 
Search instead for 
Did you mean: 

AllocBitmapData() 함수 사용방법

비트맵이미지의 각 픽셀의 RGB값을 비교해보려고 합니다.

CanvasGetPixel() 함수를 사용하였더니 일반적인 웹용사진의 해상도인 800*600 이미지만해도 엄청나게 느리더군요.

 

해서 AllocBitmapData() 함수를 이용해보고자 하는데요.

 

AllocBitmapData()함수의 사용법이나 사용예제가 있다면 알고싶습니다.

 

 BitmapID 나 Color Table 는 알겠는데 Bits, Mask 항목에 어떤 인자나 변수가 들어가야하는지요?

 

또한 변수가 들어간다면 변수의 형태는 어떤것(int , double 혹은 char?)이 들어가야하는지 알고싶습니다.

0 Kudos
Message 1 of 2
(3,160 Views)

** affixation!!!

 

here is my source... very slow..

 

How quickly?

 

=================

#include <utility.h>
#include <cvirte.h>  
#include <userint.h>
#include "jpeg.h"

 

static int pnl, BitmapID;

int width, height;

static char ProjDirs[MAX_PATHNAME_LEN];
static char Tmp_Buff[MAX_PATHNAME_LEN], C_c;
static int ret, H_d, x, y;
static int color, color_r, color_g, color_b;

 


int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       LPSTR lpszCmdLine, int nCmdShow)
{
 if (InitCVIRTE (hInstance, 0, 0) == 0)
  return -1; /* out of memory */
 if ((pnl = LoadPanel (0, "jpeg.uir", PNL)) < 0)
  return -1;
 DisplayPanel (pnl);
 RunUserInterface ();
 DiscardPanel (pnl);
 return 0;
}

int CVICALLBACK pnlc (int panel, int event, void *callbackData,
  int eventData1, int eventData2)
{
 switch (event)
 {
  case EVENT_GOT_FOCUS:

              
   break;
  case EVENT_LOST_FOCUS:

   break;
  case EVENT_CLOSE:
   QuitUserInterface (0);
   break;
 }
 return 0;
}

int CVICALLBACK cmdOpenc (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
 switch (event)
 {
 
  case EVENT_COMMIT:
   CanvasClear (pnl, PNL_CVS, VAL_ENTIRE_OBJECT);
   
   GetProjectDir (ProjDirs);
   
   ret = FileSelectPopup (ProjDirs, "*.bmp;*.jpg", "*.bmp;*.jpg", "Select Image File...",
           VAL_SELECT_BUTTON, 0, 0, 1, 0, Tmp_Buff);
   GetBitmapFromFile (Tmp_Buff, &BitmapID);
   GetBitmapData (BitmapID, 0, 0, &width, &height, 0, 0, 0);
   SetCtrlVal(pnl, PNL_Num1, width);
   SetCtrlVal(pnl, PNL_Num2, height);
   
   SetCtrlAttribute (pnl, PNL_CVS, ATTR_HEIGHT, height);
   SetCtrlAttribute (pnl, PNL_CVS, ATTR_WIDTH, width);
   
   if(width < 550)
   {
    SetPanelSize (pnl, height+120, 550);
   }
   else
   {
    SetPanelSize (pnl, height+120, width+10);
   }
   
   CanvasDrawBitmap (pnl, PNL_CVS, BitmapID, VAL_ENTIRE_OBJECT,
         MakeRect(0,0, VAL_KEEP_SAME_SIZE, VAL_KEEP_SAME_SIZE));
   
   
   break;
 }
 return 0;
}


int CVICALLBACK cvsc (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
 if(event == EVENT_MOUSE_POINTER_MOVE)
 {
  SetCtrlVal(pnl, PNL_Mouse_Y, eventData1);
  SetCtrlVal(pnl, PNL_Mouse_X, eventData2);
  CanvasGetPixel (pnl, PNL_CVS, MakePoint(eventData2, eventData1), &color);
  
  color_r=color/256/256;
  color_g=color/256%256;
  color_b=color%256;
  
  SetCtrlVal(pnl, PNL_numR, color_r);
  SetCtrlVal(pnl, PNL_numG, color_g);
  SetCtrlVal(pnl, PNL_numB, color_b);
 }
 return 0;
}

int CVICALLBACK cmdFindc (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
 switch (event)
 {
  case EVENT_COMMIT:
   
   for(x=0; x < width; x++)
   {
    CanvasStartBatchDraw (pnl, PNL_CVS);
    for(y=0;y < height; y++)
    {
     CanvasGetPixel (pnl, PNL_CVS, MakePoint(x, y), &color);
     
     color_r=color/256/256;
     color_g=color/256%256;
     color_b=color%256;
     
     if(color_r == color_g && color_g == color_b)
     {
      SetCtrlAttribute (pnl, PNL_CVS, ATTR_PEN_COLOR, VAL_RED);
      CanvasDrawPoint (pnl, PNL_CVS, MakePoint(x, y));
     }
    }
    CanvasEndBatchDraw (pnl, PNL_CVS);
   }
   
   
   
   break;
 }
 return 0;
}

============================ 

 

0 Kudos
Message 2 of 2
(3,148 Views)