首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从IntPtr创建位图

从IntPtr创建位图
EN

Stack Overflow用户
提问于 2014-06-25 21:31:06
回答 1查看 9.4K关注 0票数 1

我试图弄清楚如何使用USB摄像机API,这有点不太清楚(至少它似乎依赖于开发人员以前的知识,我认为我不理解“全貌”,双关意)。

我有以下事件处理程序,它正在成功地接收数据,目前只能打印到控制台:

代码语言:javascript
复制
    void  _camera_OnPreviewBitmap(IntPtr pbyteBitmap, uint dwBufferSize,
                                  uint dwWidth, uint dwHeight,
                                  uint dwFrameNo, uint dwPreviewPixelFormat) {

        Console.WriteLine(string.Format("{0}, {1}, {2}, {3}, {4}, {5}", pbyteBitmap, dwBufferSize, dwWidth, dwHeight, dwFrameNo, dwPreviewPixelFormat));

        //The callback function gets the image data as “IntPtr” type. 
        //When using “System.Runtime.InteropServices.Marshal.Copy”, the image data can copy to the array. 
        //When using “System.Runtime.InteropServices.Marchal.ReadByte”, the image data can get thedirectory. 
        //Sometimes the process speed is fast when receiving the image data after the image data copy to the array with 
        //“System.Runtime.InteropServices.Marchal.Copy”. 

    } 

这给了我以下结果:

代码语言:javascript
复制
259129344, 1228800, 1280, 960, 195051, 1
250281984, 1228800, 1280, 960, 195052, 1
259129344, 1228800, 1280, 960, 195053, 1
250281984, 1228800, 1280, 960, 195054, 1
259129344, 1228800, 1280, 960, 195055, 1
250281984, 1228800, 1280, 960, 195056, 1
259129344, 1228800, 1280, 960, 195057, 1
250281984, 1228800, 1280, 960, 195058, 1
259129344, 1228800, 1280, 960, 195059, 1
250281984, 1228800, 1280, 960, 195060, 1
259129344, 1228800, 1280, 960, 195061, 1
250281984, 1228800, 1280, 960, 195062, 1

因此,这与图像尺寸(1280x960)是一致的,1228800是像素计数(缓冲区大小),像素格式的1意味着根据相机API像素格式枚举(这也与这个BW相机一致)的PIXEL_FORMAT_08_MONO_OR_RAW

我的问题是:

我如何利用这些信息并使用它创建System.Drawing.Bitmap对象?

我已经尝试过了,但没有成功(显然灰度图像实际上没有索引.):

代码语言:javascript
复制
        var bmp = new System.Drawing.Bitmap((int)dwWidth, (int)dwHeight, (int)dwBufferSize,
                                            PixelFormat.Format8bppIndexed, pbyteBitmap);

这最终会产生“泛型GDI+错误”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-25 21:51:59

您正在指定索引格式,而不给它提供调色板。

如果图像是灰度的,而不是直接使用指针,您可以用32 for创建位图,锁定位,然后将RGB字节值设置为像素字节数据,下面是一个示例(使用不安全的代码以方便和快速):

代码语言:javascript
复制
Bitmap bmp = new Bitmap(1280, 960, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
var data = bmp.LockBits(new Rectangle(0, 0, 1280, 960), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);

byte* srcBmpData = (byte*)pbyteBitmap.ToPointer();
byte* dstBmpData = (byte*)data.Scan0.ToPointer();

for (int buc = 0; buc < 1280 * 960; buc++)
{
    int currentDestPos = buc * 4;
    dstBmpData[currentDestPos] = dstBmpData[currentDestPos + 1] = dstBmpData[currentDestPos + 2] = srcBmpData[buc];
}

bmp.UnlockBits(data);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24418941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档