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;
}
============================