簡體   English   中英

OpenTK從位圖獲取像素字節數組

[英]OpenTK Getting pixels byte array from a Bitmap

我需要將一些OpenGL代碼移植到C#OpenTK。 這是我從C ++中的像素數組更新映射的PBO的塊:

    GLubyte* ptr = (GLubyte*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
    if(ptr)
    {

        memcpy(ptr,imageInfo.Data,IMG_DATA_SIZE);
        glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);  

    }

我需要在OpenTK中做同樣的事情。我的圖像數據來自Bitmap實例。 我嘗試了以下方法:

        IntPtr ptr = GL.MapBuffer(BufferTarget.PixelUnpackBuffer, BufferAccess.WriteOnly);
        if(ptr != IntPtr.Zero)
       {
           BitmapData data = updateColorMap.LockBits(new System.Drawing.Rectangle(0, 0, updateColorMap.Width, updateColorMap.Height),
                 ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                 Marshal.Copy(data.Scan0, 0, ptr, IMG_DATA_SIZE);
       }

但是Marshal.Copy要求第一個參數是byte []類型。我沒有找到如何從BitmapData檢索它的方法。它僅返回IntPtr(data.Scan0)。

那么如何從位圖獲取字節數組?

更新:

在此期間,我從OpenTK論壇獲得了幫助,他們建議這樣做:

           unsafe
            {
                GL.BufferData(BufferTarget.PixelUnpackBuffer, new IntPtr(IMG_DATA_SIZE), IntPtr.Zero, BufferUsageHint.StreamDraw);
                byte* ptr = (byte*)GL.MapBuffer(BufferTarget.PixelUnpackBuffer, BufferAccess.WriteOnly);


                if (ptr != null)
                {
                    BitmapData data = updateDepthMap.LockBits(new System.Drawing.Rectangle(0, 0, updateDepthMap.Width, updateDepthMap.Height),
                    ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

                    byte* scan0 = (byte*)data.Scan0.ToPointer();
                    for (int i = 0; i < IMG_DATA_SIZE; ++i)
                    {

                        *ptr = *scan0;
                        ++ptr;
                        ++scan0;
                    }

                    updateDepthMap.UnlockBits(data);
                    GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer);

                }
            }//unsafe

現在,這有效,但是速度很 常規紋理更新的運行速度比此速度快2倍,這是錯誤的,因為異步PBO傳輸應加快紋理上傳速度。實際上,在我的C ++版本中,PBO上傳導致性能提高近2倍。

好了,解決方案就在這里: 將數據從IntPtr復制到IntPtr

在linux上測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM