如何將Bitmap轉換成HObject(HImage)?


簡單的將我們熟悉的Bitmap轉換成Halcon的HObject
下列例子為灰階或是32bit的影像格式轉換
若Bitmap為24bit建議先轉換成32bit(轉換方法)
原因在於24bit的每行padding byte不固定,傳換上會比較麻煩一點
轉換32bit後就會固定
下面程式碼會註解解說每一行的功能



public HObject BitmapToHoImage(Bitmap source)
{
    if (source == null)
    throw new ArgumentNullException("bmp不能為null");
    //建立一個空的HObject
    HObject ho_Image;
    HOperatorSet.GenEmptyObj(out ho_Image);
    //建立資料鎖定範圍
    Rectangle rect = new Rectangle(0, 0, source.Width, source.Height);
    
    //若PixelFormat為24bit建立轉成32bit
    if (source.PixelFormat == PixelFormat.Format24bppRgb)
    { source = source.ChangePixelFormatTo32Argb(true); }
    //使用指標來建立HObject
    unsafe
    {
        //鎖定輸入的Bitmap
        BitmapData bitmapData = 
            source.LockBits(rect,ImageLockMode.ReadOnly,source.PixelFormat);
        //資料的記憶體起始位置
        IntPtr p = bitmapData.Scan0;

        int ScanWidth;

        switch (source.PixelFormat)
        {
            case PixelFormat.Format8bppIndexed:

            ScanWidth = bitmapData.Stride;

            //灰階轉Hobject
            HOperatorSet.GenImage1(out ho_Image, "byte", ScanWidth, source.Height, p);
            HOperatorSet.CropPart(ho_Image, out ho_Image, 
                0, 0, source.Width, source.Height);

            break;

            case PixelFormat.Format32bppRgb:
            case PixelFormat.Format32bppArgb:

            //32bit彩圖
            HOperatorSet.GenImageInterleaved(out ho_Image, p,
             "bgrx", source.Width, source.Height, -1, "byte", 0, 0, 0, 0, -1, 0);
            break;
        }
        source.UnlockBits(bitmapData);
    }
  
    return ho_Image; //回傳HObject
}

留言