 이현화
		
			이현화
		
		
		
		
		
		
		
		
	
			10-22-2008 01:48 AM
비트맵이미지의 각 픽셀의 RGB값을 비교해보려고 합니다.
CanvasGetPixel() 함수를 사용하였더니 일반적인 웹용사진의 해상도인 800*600 이미지만해도 엄청나게 느리더군요.
해서 AllocBitmapData() 함수를 이용해보고자 하는데요.
AllocBitmapData()함수의 사용법이나 사용예제가 있다면 알고싶습니다.
BitmapID 나 Color Table 는 알겠는데 Bits, Mask 항목에 어떤 인자나 변수가 들어가야하는지요?
또한 변수가 들어간다면 변수의 형태는 어떤것(int , double 혹은 char?)이 들어가야하는지 알고싶습니다.
10-22-2008 02:39 AM
** 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;
}
============================