1 void HImage2CBitmap(Hobject pImage,CBitmap *wImage)
2 {
3 char lpcsType[MAX_STRING];
4 Hlong lPointer,width,height,channels;
5 Hlong lPointerR,lPointerG,lPointerB;
6 count_channels(pImage,&channels);
7 //获取Halcon数据的Long指针
8 if (channels == 3)
9 {
10 get_image_pointer3(pImage,&lPointerR,&lPointerG,&lPointerB,lpcsType,&width,&height);
11 }else
12 {
13 get_image_pointer1(pImage,&lPointer,lpcsType,&width,&height);
14 }
15
16
17 //创建文件头
18 BYTE tmp[sizeof(BITMAPINFO)+1024];
19 BITMAPINFO *bmi = (BITMAPINFO*)tmp;
20 HBITMAP hBmp;
21
22 memset(bmi,0,sizeof(BITMAPINFO));
23 bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
24 bmi->bmiHeader.biWidth = width;
25 bmi->bmiHeader.biHeight = -height; //正负可以上下翻转图像
26 bmi->bmiHeader.biPlanes = 1;
27 bmi->bmiHeader.biBitCount = 8*channels;
28 bmi->bmiHeader.biCompression = BI_RGB;
29 bmi->bmiHeader.biSizeImage = 0; //if biCompression is BI_RGB,this can be 0
30 bmi->bmiHeader.biClrImportant =0 ;
31 //初始化数据
32 switch(8*channels)
33 {
34 case 8 :
35 for(int i=0 ; i <256 ; i++){
36 bmi->bmiColors[i].rgbBlue = i;
37 bmi->bmiColors[i].rgbGreen= i;
38 bmi->bmiColors[i].rgbRed= i;
39 }
40 break;
41 case 32:
42 case 24:
43 ((DWORD*) bmi->bmiColors)[0] = 0x00FF0000;
44 ((DWORD*) bmi->bmiColors)[1] = 0x0000FF00;
45 ((DWORD*) bmi->bmiColors)[2] = 0x000000FF;
46 break;
47 }
48 hBmp = ::CreateDIBSection(NULL,bmi,DIB_RGB_COLORS,NULL,0,0);
49
50 //Halcon转换成BYTE数据
51 BYTE *pData = new BYTE[width*height*channels];
52 long byteStep = 0;
53 if (channels == 3)
54 {
55 byteStep = 3*width;
56 BYTE *pHimageR = (BYTE*)lPointerR;
57 BYTE *pHimageG = (BYTE*)lPointerG;
58 BYTE *pHimageB = (BYTE*)lPointerB;
59 for (int i=0; ii)
60 {
61 for (int j=0; jj)
62 {
63 *(pData + i*byteStep + 3*j + 0) = *pHimageB;
64 *(pData + i*byteStep + 3*j + 1) = *pHimageG;
65 *(pData + i*byteStep + 3*j + 2) = *pHimageR;
66 pHimageR++;
67 pHimageG++;
68 pHimageB++;
69 }
70 }
71 }else
72 {
73 byteStep = width;
74 BYTE *pHimage = (BYTE*)lPointer;
75 for (int i=0; ii)
76 {
77 for (int j=0; jj)
78 {
79 *(pData + i*byteStep + j) = *pHimage;
80 pHimage++;
81 }
82 }
83 }
84
85 //BYTE数据拷贝
86 SetDIBits(NULL,hBmp,0,height,pData,bmi,DIB_RGB_COLORS);
87
88 //CBitmap关联HBITMAP
89 wImage->Attach(hBmp);
90
91 delete [] pData;
92
93 return;
94 }