zoukankan      html  css  js  c++  java
  • 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左右。
    有能力的可以自行优化下或留言交流下想法。

  • 相关阅读:
    「杂文」随想录
    「小说」妖精舞于废墟之上
    昨日之盛,明日之俗 ~ SDOI2021 退役记
    P6292 区间本质不同子串个数
    「杂文」生之重
    「闭门造车」二叉分块树
    「杂文」雨色的魔法(一)
    「笔记」斜率优化 DP
    「笔记」后缀数组
    NOIP 2020 AFO 记
  • 原文地址:https://www.cnblogs.com/ljfy-yjw/p/3931507.html
Copyright © 2011-2022 走看看