c语言和halcon数据类型转换,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

{

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);

}

你可能感兴趣的:(c语言和halcon数据类型转换,C# 中Bitmap和Halcon中HObject数据类型的相互转换)