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左右。
有能力的可以自行優化下或留言交流下想法。