1. 程式人生 > >C# 中Bitmap和Halcon中HObject資料型別的相互轉換

C# 中Bitmap和Halcon中HObject資料型別的相互轉換

              C# 中Bitmap和Halcon中HObject資料型別的相互轉換

        public void Bitmap2HObjectBpp24(Bitmap bmp, out HObject image)
        {
            try
            {
                Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
 
                BitmapData srcBmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                HOperatorSet.GenImageInterleaved(out image, srcBmpData.Scan0, "bgr", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0);
                bmp.UnlockBits(srcBmpData);
 
            }
            catch (Exception ex)
            {
                image = null;
            }
        }
 
        public void Bitmap2HObjectBpp8(Bitmap bmp, out HObject image)
        {
            try
            {
                Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
 
                BitmapData srcBmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
 
                HOperatorSet.GenImage1(out image, "byte", bmp.Width, bmp.Height, srcBmpData.Scan0);
                bmp.UnlockBits(srcBmpData);
            }
            catch (Exception ex)
            {
                image = null;
            }
        }

實際使用時,假如原圖8位灰度圖,那麼BitmapToHObjectBpp8 和BitmapToHObjectBpp24的結果是一樣的。而為24位彩色圖時,只能用BitmapToHObjectBpp24。
可先得到Bitmap 圖的PixelFormat ,而後再進行轉換。

以下HObject to Bitmap部分參考:http://blog.csdn.net/miehuo/article/details/48751353

private void HObject2Bpp8(HObject image, out Bitmap res)  
{  
    HTuple hpoint, type, width, height;  
 
    const int Alpha = 255;  
    int[] ptr = new int[2];  
    HOperatorSet.GetImagePointer1(image, out hpoint, out type, out width, out height);  
 
    res = new Bitmap(width, height, PixelFormat.Format8bppIndexed);  
    ColorPalette pal = res.Palette;  
    for (int i = 0; i <= 255; i++)  
    {  
        pal.Entries[i] = Color.FromArgb(Alpha, i, i, i);  
    }  
    res.Palette = pal;  
    Rectangle rect = new Rectangle(0, 0, width, height);  
    BitmapData bitmapData = res.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);  
    int PixelSize = Bitmap.GetPixelFormatSize(bitmapData.PixelFormat) / 8;  
    ptr[0] = bitmapData.Scan0.ToInt32();  
    ptr[1] = hpoint.I;  
    if (width % 4 == 0)  
        CopyMemory(ptr[0], ptr[1], width * height * PixelSize);  
    else  
    {  
        for (int i = 0; i < height - 1; i++)  
        {  
            ptr[1] += width;  
            CopyMemory(ptr[0], ptr[1], width * PixelSize);  
            ptr[0] += bitmapData.Stride;  
        }  
    }  
    res.UnlockBits(bitmapData);  
  
}  
  
private void HObject2Bpp24(HObject image, out Bitmap res)  
{  
    HTuple hred, hgreen, hblue, type, width, height;  
 
    HOperatorSet.GetImagePointer3(image, out hred, out hgreen, out hblue, out type, out width, out height);  
 
    res = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);  
 
    Rectangle rect = new Rectangle(0, 0, width, height);  
    BitmapData bitmapData = res.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);  
    unsafe  
    {  
        byte* bptr = (byte*)bitmapData.Scan0;  
        byte* r = ((byte*)hred.I);  
        byte* g = ((byte*)hgreen.I);  
        byte* b = ((byte*)hblue.I);  

        int lengh = width * height;
        for (int i = 0; i <lengh ; i++)  
        {  
            bptr[i * 4] = (b)[i];  
            bptr[i * 4 + 1] = (g)[i];  
            bptr[i * 4 + 2] = (r)[i];  
            bptr[i * 4 + 3] = 255;  
        }  
    }  
 
    res.UnlockBits(bitmapData);  
 
}