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左右。
有能力的可以自行优化下或留言交流下想法。
时间: 2024-10-19 13:44:45