我希望从OpenTK的当前场景中获得具有良好分辨率的屏幕截图。我正在使用GL.ReadPixels为场景拍照。如果我将照片保存到磁盘;我发现它的分辨率/质量很低。
以下C#代码用于获取场景照片:
位图bmp = null;
if (GraphicsContext.CurrentContext != null)
{
glControl_window.Invalidate();
int w = glControl_window.ClientSize.Width;
int h = glControl_window.ClientSize.Height;
bmp = new Bitmap(w, h);
System.Drawing.Imaging.BitmapData data =
bmp.LockBits(glControl_window.ClientRectangle,
System.Drawing.Imaging.ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
GL.ReadPixels(0, 0, w, h, OpenTK.Graphics.OpenGL.PixelFormat.Bgr,
PixelType.UnsignedByte, data.Scan0);
bmp.UnlockBits(data);
bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
}
初始化OpenTK时使用:
this.glControl_window = new OpenTK.GLControl(new
OpenTK.Graphics.GraphicsMode(new OpenTK.Graphics.ColorFormat(32),
24,8,4,new OpenTK.Graphics.ColorFormat(0),2,false));
使用OpenTK的resize事件:
GL.Viewport(0, 0, Width, Height);
我使用OpenTK的paint事件(通过鼠标启用放大/缩小):
float aspectRatio;
if (Height == 0 || Width == 0) aspectRatio = 1f; else
aspectRatio = Width / (float)Height;
double W = 20 * aspectRatio / CameraZoomScale, H = 20 /
CameraZoomScale;
GL.Ortho(-0.5 * W, 0.5 * W, -0.5 * H, 0.5 * H, -600.0f, 600.0f);
我需要:
1.增加GL.ReadPixels期间令牌屏幕截图的分辨率。
答案 0 :(得分:0)
我猜你知道你在这里要求两件非常不同的东西。
使用GL.readpixels()
从帧缓冲区读取的像素数始终是与缓冲区大小对应的像素数。即1280x720或类似的东西。
能够读取更多像素的唯一方法是增加OpenGL帧缓冲区的大小/分辨率。
查找OpenTK代码中初始化open gl窗口并提高窗口分辨率的部分。寻找类似的东西:
public MainWindow()
: base(
1280, // initial width
720, // initial height
...
)
{
// your code
}
并根据需要更改分辨率。您可能还必须覆盖OnResize
课程中的GameWindow
方法,如下所述:How to change the viewport resolution in OpenTK
一旦将位图保存到磁盘,任何尝试"增加"分辨率将涉及升级已存在的图像。这最终将导致更多的像素,但也会根据图像和使用的升级算法引入升级伪像。您可以在维基百科上阅读有关不同图像缩放算法的更多信息:Image scaling Algorithms