C# HObject和bitmap图像互转

一:HObject转bitmap(灰度图)

public void HObject2Bitmap8(HObject image, out Bitmap res)
{
    HTuple hpoint, type, width, height; 
    const int Alpha = 255; 
    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; 
    IntPtr ptr1 = bitmapData.Scan0; 
    IntPtr ptr2 = hpoint; int bytes = width * height; 
    byte[] rgbvalues = new byte[bytes]; 
    System.Runtime.InteropServices.Marshal.Copy(ptr2, rgbvalues, 0, bytes); 
    System.Runtime.InteropServices.Marshal.Copy(rgbvalues, 0, ptr1, bytes);  
    res.UnlockBits(bitmapData);
   }

二:HObject转bitmap(3通道图)

public static Bitmap Honject2Bitmap24(HObject hObject)
{
    //获取图像尺寸
    HTuple width0 = new HTuple();
    HTuple height0 = new HTuple();
    HTuple Pointer = new HTuple();
    HTuple type = new HTuple();
    HTuple width = new HTuple();
    HTuple height = new HTuple();
    HObject InterImage = new HObject();
    HOperatorSet.GetImageSize(hObject, out width0, out height0);
    HOperatorSet.GetImageSize(hObject, out width0, out height0);
    //创建交错格式图像
    HOperatorSet.InterleaveChannels(hObject, out InterImage, "rgb", 4 * width0, 0);
    //获取交错格式图像指针
    HOperatorSet.GetImagePointer1(InterImage, out Pointer, out type, out width, out height);
    IntPtr ptr = Pointer;
    //构建新Bitmap图像
    Bitmap bitmap = new Bitmap(width / 4, height, width, PixelFormat.Format24bppRgb, ptr);
    return bitmap;
}

三:bitmap转HObject(灰度图)

public static 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;
    }
}

四:bitmap转HObject(3通道图)

public static void Bitmap2HObjectBpp24(Bitmap bmp, out HObject image)  //90ms
{
    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;
    }
}

你可能感兴趣的:(图像处理,c#)