buliing
助理工程师
助理工程师
  • 最后登录2018-09-03
  • 发帖数116
  • 金币400枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
阅读:635回复:6

如何将Himage转成Bitmap

楼主#
更多 发布于:2018-03-13 11:13
请问论坛里的大牛,如何将Himage转成Bitmap?
喜欢0

最新打赏:0人

yuzaihuan
初学者
初学者
  • 最后登录2018-09-21
  • 发帖数17
  • 金币91枚
  • 贡献勋章0枚
  • 社区居民
沙发#
发布于:2018-03-14 14:46
有人回复吗?
我在网上搜索到:
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);    
    
}    

程序运行到: ptr[0] = bitmapData.Scan0.ToInt32();  报错,说溢出.
我用的是.Net 4.0 + Halcon 13 / 2.0的库.

有哪位大虾知道原因吗?

谢谢
buliing
助理工程师
助理工程师
  • 最后登录2018-09-03
  • 发帖数116
  • 金币400枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
板凳#
发布于:2018-03-14 19:58
IntPtr pt;
            int mwidth, mheight;
            string mtype = "";
            Bitmap img;
            ColorPalette pal;
            int i;
            const int alpha = 255;
            BitmapData bitmapData;
            Rectangle rect;
            int[] ptr = new int[2];
            int PixeSize;
            pt = Img.GetImagePointer1(out mtype, out mwidth, out mheight);  //得到图像的指针
            img = new Bitmap(mwidth, mheight, PixelFormat.Format8bppIndexed);
            pal = img.Palette;
            for(i=0;i<255;i++)
            {
                pal.Entries = Color.FromArgb(alpha, i, i, i);
            }
            img.Palette = pal;
            rect = new Rectangle(0, 0, mwidth, mheight);
            //锁定图像数据进入系统内存
            bitmapData = img.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
            PixeSize = Bitmap.GetPixelFormatSize(bitmapData.PixelFormat) / 8;
            ptr[0] = bitmapData.Scan0.ToInt32(); //得到bitmapdata的数据首地址
            ptr[1] = pt.ToInt32();//得到Himage图像的首地址
            if(mwidth %4==0)
            {
                CopyMemory(ptr[0], ptr[1], mwidth * mheight * PixeSize);
            }
            else
            {
                for(i=0;i<mheight;i++)
                {
                    ptr[1] += mwidth;
                    CopyMemory(ptr[0], ptr[1], mwidth * PixeSize);
                    ptr[0] += bitmapData.Stride; //bitmap一行的长度
                }
            }
            img.UnlockBits(bitmapData);
            Bitmap result = img.Clone() as Bitmap;  //赋值图像数据
            img.Dispose();
            GC.Collect();
            GC.WaitForPendingFinalizers();


测试了没问题
157720045
技术员
技术员
  • 最后登录2018-09-19
  • 发帖数15
  • 金币114枚
  • 贡献勋章0枚
  • 社区居民
地板#
发布于:2018-06-08 15:42
 public void himageRGBtobmp(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);
                for (int i = 0; i < width * height; i++)
                {
                    bptr[i * 4] = (b);
                    bptr[i * 4 + 1] = (g);
                    bptr[i * 4 + 2] = (r);
                    bptr[i * 4 + 3] = 255;
                }
            }

            res.UnlockBits(bitmapData);
        
            
          
        }
wh64zz
工程师
工程师
  • 最后登录2018-08-15
  • 发帖数369
  • 金币620枚
  • 贡献勋章0枚
  • 社区居民
4楼#
发布于:2018-08-03 21:45
几乎可以说全了哈,可以玩遍各种相机了不用担心了!!!!!!!!!!
wh64zz
工程师
工程师
  • 最后登录2018-08-15
  • 发帖数369
  • 金币620枚
  • 贡献勋章0枚
  • 社区居民
5楼#
发布于:2018-08-03 21:50
不对呀,一般都是bitmap转Hbitmap用的居多啊!@
Harlen
技术员
技术员
  • 最后登录2018-08-31
  • 发帖数38
  • 金币131枚
  • 贡献勋章0枚
  • 社区居民
6楼#
发布于:2018-08-03 22:09
学习了,谢谢!!!!!!!!!!!!!!
游客

返回顶部
支付

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

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

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