找回密码
 立即注册

C# Bitmap转ASVLOFFSCREEN的最佳方式?

sdk要求图片要转换成ASVLOFFSCREEN,其中一种格式Rgb24,一般操作如下
var bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
var dataPtr = bmpData.Scan0;
var bytesCount = Math.Abs(bmpData.Stride) * bitmap.Height;
var data = new byte[bytesCount];
Marshal.Copy(dataPtr, data, 0, bytesCount);
bitmap.UnlockBits(bmpData);

var offScreen = new ASVLOFFSCREEN
{
     u32PixelArrayFormat = 513,//Rgb24,
     i32Width = bitmap.Width,
     i32Height = bitmap.Height,
     pi32Pitch = new int[4],
     ppu8Plane = new IntPtr[4]
};
offScreen.pi32Pitch[0] = bmpData.Stride;
offScreen.ppu8Plane[0] =  Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, offScreen.ppu8Plane[0], data.Length);

            .....
Marshal.FreeHGlobal(offScreen.ppu8Plane[0])
整个转换过程约需4毫秒,改为下面的方式Stopwatch计时0毫秒,7-20个Ticks,即0.7-2微妙
           var bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            var offScreen = new Face.ImageData
            {
                u32PixelArrayFormat = 513,//Rgb24,
                i32Width = bitmap.Width,
                i32Height = bitmap.Height,
                pi32Pitch = new int[4],
                ppu8Plane = new IntPtr[4]
            };
            offScreen.pi32Pitch[0] = bmpData.Stride;
            offScreen.ppu8Plane[0] = bmpData.Scan0;

            .....
            bitmap.UnlockBits(bmpData);


回复

使用道具 举报

大神点评2

CJ大橙子 2018-6-27 18:33:12 显示全部楼层
  u32PixelArrayFormat = 513 是怎么查询到的呀?
回复

使用道具 举报

 楼主| catzhou 2018-7-11 09:27:55 显示全部楼层
抄的,拿来主义
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

0关注

6粉丝

18帖子

最热主题