迷茫的程序员
技术员
技术员
  • 最后登录2020-05-04
  • 发帖数62
  • 金币243枚
  • 贡献勋章0枚
  • 社区居民
阅读:470回复:8

求助:HObject怎么在C#中转成Bitmap格式,通过Marshal.copy的方式

楼主#
更多 发布于:2019-08-28 13:15
如题,代码如下
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 = 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);  
  
}
不用CopyMemory
喜欢0

最新打赏:0人

tystq
资深人士
资深人士
  • 最后登录2020-05-31
  • 发帖数463
  • 金币18324枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2019-08-28 14:32
 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 = 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[1] = bitmapData.Scan0.ToInt32();
            ptr[0] = hpoint.I;
            HTuple stride = bitmapData.Stride;//扫描宽度
            byte[] byt = new byte[width];//halcon得到的数组宽度
            for (int i = 0; i < height.I - 1; i++)
            {
                Marshal.Copy(ptr[0] + i * width, byt, 0, width * PixelSize);//把地址复制到数组
                Marshal.Copy(byt, 0, ptr[1]+i*stride, width * PixelSize);//把数组复制到地址
            }

            res.UnlockBits(bitmapData);

        }
迷茫的程序员
技术员
技术员
  • 最后登录2020-05-04
  • 发帖数62
  • 金币243枚
  • 贡献勋章0枚
  • 社区居民
板凳#
发布于:2019-08-28 16:48
tystq:private void HObject2Bpp8(HObject image, out Bitmap res)
        {
            HTuple hpoint, type, width, height;

    ...
回到原帖
大佬,你这样好像不行,不过你给的思路是正确的,放到byte数组中再复制到地址上,稍微改下你的就可以了
silence711
技术员
技术员
  • 最后登录2020-05-31
  • 发帖数70
  • 金币322枚
  • 贡献勋章0枚
地板#
发布于:2020-04-01 15:27
tystq:private void HObject2Bpp8(HObject image, out Bitmap res)
        {
            HTuple hpoint, type, width, height;

    ...
回到原帖
你好,大哥。这种方法我也用过 确定可以   是Win7系统
如果在Win10 下运行,ptr[1] = bitmapData.Scan0.ToInt32(); 会弹出算术溢出错误
你有遇到过吗????
迷茫的程序员
技术员
技术员
  • 最后登录2020-05-04
  • 发帖数62
  • 金币243枚
  • 贡献勋章0枚
  • 社区居民
4楼#
发布于:2020-04-02 09:09
silence711:你好,大哥。这种方法我也用过 确定可以   是Win7系统
如果在Win10 下运行,ptr[1] = bitmapData.Scan0.ToInt32(); 会弹出算术溢出错误
你有遇到过吗????
回到原帖
主要是因为你这个win10是64位的 win7是32位的吧  ToInt64()
silence711
技术员
技术员
  • 最后登录2020-05-31
  • 发帖数70
  • 金币322枚
  • 贡献勋章0枚
5楼#
发布于:2020-04-02 14:13
迷茫的程序员:主要是因为你这个win10是64位的 win7是32位的吧  ToInt64()回到原帖
你自己可以尝试下,不行的,Toint64 这样简单的想法,我尝试过
WIN7 64位系统, VS64位编译运行  Toint32 正常无问题
WIN10 64位系统, VS64位编译运行  Toint32 就算术溢出
迷茫的程序员
技术员
技术员
  • 最后登录2020-05-04
  • 发帖数62
  • 金币243枚
  • 贡献勋章0枚
  • 社区居民
6楼#
发布于:2020-04-02 16:22
silence711:你自己可以尝试下,不行的,Toint64 这样简单的想法,我尝试过
WIN7 64位系统, VS64位编译运行  Toint32 正常无问题
WIN10 64位系统, VS64位编译运行  Toint32 就算术溢出
回到原帖
反正我当时就是溢出,换个指针,然后64就好了,没直接Toint64, 具体你什么情况我就不清楚了
迷茫的程序员
技术员
技术员
  • 最后登录2020-05-04
  • 发帖数62
  • 金币243枚
  • 贡献勋章0枚
  • 社区居民
7楼#
发布于:2020-04-03 13:54
        public Bitmap HObjectToBpp8(HObject image)
        {
            HTuple hpoint, type, width, height;
            Bitmap res;

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

            long p = bitmapData.Scan0.ToInt64();
            HTuple stride = bitmapData.Stride;
            byte[] byt = new byte[width];
            for (int i = 0; i < height.I - 1; i++)
            {
                Marshal.Copy(hpoint, byt, 0, width * PixelSize);
                Marshal.Copy(byt, 0, (IntPtr)p, width * PixelSize);
                hpoint += width;
                p += stride;
            }

            res.UnlockBits(bitmapData);
            return res;
        }
迷茫的程序员
技术员
技术员
  • 最后登录2020-05-04
  • 发帖数62
  • 金币243枚
  • 贡献勋章0枚
  • 社区居民
8楼#
发布于:2020-04-03 13:56
        public Bitmap HObjectToBpp8(HObject image)
        {
            HTuple hpoint, type, width, height;
            Bitmap res;

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

            long p = bitmapData.Scan0.ToInt64();
            HTuple stride = bitmapData.Stride;
            byte[] byt = new byte[width];
            for (int i = 0; i < height.I - 1; i++)
            {
                Marshal.Copy(hpoint, byt, 0, width * PixelSize);
                Marshal.Copy(byt, 0, (IntPtr)p, width * PixelSize);
                hpoint += width;
                p += stride;
            }

            res.UnlockBits(bitmapData);
            return res;
        }
游客

返回顶部
支付

欢迎打赏,请选择打赏金额

  • 1元
  • 6元
  • 10元
  • 66元
  • 100元

支付即代表同意《本站支付协议》 有疑问请联系客服