C#中Image类与byte[]之间的转换

遇到此问题是因为在编程中提示用到C++与C#,需要将C++中的OpenCV库中的IplImage类与C#中Image类转换,以实现数据接口。
解决我的问题主要通过Image→byte[]→IplImage,反之亦然。
注:问题各部分解决方法来自网络

关于此问题的解决主要分为三部分:
1. Image→byte[]
2. byte[]→IplImage

1. Image→byte[]
此部分在C#平台中实现:
以下这段代码的意义在于将Image类直接转化为byte数组流
        //将image转化为二进制 
        public byte[] GetByteImage(Image img)
        {
            byte[] bt = null;
            if (!img.Equals(null))
            {
                using (MemoryStream mostream = new MemoryStream())
                {
                    Bitmap bmp = new Bitmap(img);
                    bmp.Save(mostream, System.Drawing.Imaging.ImageFormat.Bmp);//将图像以指定的格式存入缓存内存流
                    bt = new byte[mostream.Length];
                    mostream.Position = 0;//设置留的初始位置
                    mostream.Read(bt, 0, Convert.ToInt32(bt.Length));
                }
            }
            return bt;
        }

反之,将byte[]转化为Image类型数据:
        public static Image GetImageByBytes(byte[] bytes)
        {
            Image photo = null;
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                ms.Write(bytes, 0, bytes.Length);
                photo = Image.FromStream(ms, true);
            }
            return photo;
        }

注意以上转换,byte[]数组数据均包含bmp头文件信息(关于此,会在第三部分中详述)。

2. byte[]→IplImage
此部分在C++平台中实现。

       OpenCVIplImage图像格式与byte[]的转换(注:在C++中没有byte类型,其等价于unsigned char

       IplImage* iplImage

       BYTE* data

       1) IplImage*得到BYTE*图像数据:

       data = iplImage->imageDataOrigin; //未对齐的原始图像数据

       或者

       data = iplImage->imageData; //已对齐的图像数据

       2) BYTE*得到IplImage*图像数据

       iplImage = cvCreateImageHeader(cvSize(width,height),depth,channels);

       cvSetData(iplImage,data,step);

       首先由cvCreateImageHeader()创建IplImage图像头,制定图像的尺寸,深度和通道数;然后由cvSetData()根据 BYTE*图像数据指针设置IplImage图像头的数据数据,其中step指定该IplImage图像每行占的字节数,对于1通道的 IPL_DEPTH_8U图像,step可以等于width


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值