Halcon 10.0:Hobject圖像轉CBitmap


 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; i<height; ++i)
60         {
61             for (int j=0; j<width; ++j)
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; i<height; ++i)
76         {
77             for (int j=0; j<width; ++j)
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 }

對於灰度圖像和彩色圖像基本能使用,只測試過寬為4的倍數的圖像。另外速度和效率可能不夠用,500W的彩色圖像(約14M)時間估計在1s左右。
有能力的可以自行優化下或留言交流下想法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM