我正在尝试将OpenGL(使用OpenTK)视口的内容复制到C#位图中。我正在使用此代码:
BitmapData data = bmp.LockBits(Rectangle.FromLTRB(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
GL.ReadPixels(0, 0, bmp.Width, bmp.Height, PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0);
bmp.UnlockBits(data);
我在互联网上看到的代码与此类似,但大多数情况下,它运行良好。但是在不明显的情况下,当位图的宽度是一个特定的值时,它就不会。数据变量返回的步幅与宽度不匹配,结果是图像严重偏向左侧。
还有其他人注意到这种行为吗?这是我正在做的事情,还是我需要了解一些解决方法?
修改 根据Fiddler的建议,我将我的代码修改为:
BitmapData data = bmp.LockBits(dest, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
GL.PushClientAttrib(ClientAttribMask.ClientPixelStoreBit);
GL.PixelStore(PixelStoreParameter.PackAlignment, 4);
GL.ReadPixels(0, 0, bmp.Width, bmp.Height, PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0);
GL.PopClientAttrib();
bmp.UnlockBits(data);
似乎没有什么区别。已经为PixelStore尝试了1,2,4和8的值,并且还尝试了具有相同值的UnpackAlignment。可以在这里播放另一个场景吗?
答案 0 :(得分:2)
查看OpenGL wiki中的Pixel Transfer,特别是最后的“像素布局”部分。
您的位图必须具有与当前OpenGL像素传输参数匹配的布局和对齐方式。如果您的位图大小是四的倍数,它将匹配默认的像素传输参数,因此它似乎可以工作。如果您致电GL.PixelStore或使用奇数大小的位图,则传输的数据将无效 - 导致您观察到的行为。
这是OpenGL中的common mistake。