【问题标题】:Need to improve resolution of screenshot from OpenGL需要从 OpenGL 提高屏幕截图的分辨率
【发布时间】:2018-09-29 08:14:46
【问题描述】:

我想从 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 的绘制事件(通过鼠标启用放大/缩小):

              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 期间增加令牌屏幕截图的分辨率。

【问题讨论】:

  • 另一个问题被搁置了!
  • @AhmedShaban 如果您回过头来阅读它被搁置的原因,您会发现如果您阅读并理解了stackoverflow.com/help/how-to-ask 准则,那么您会发现这是有问题的。在这种特定情况下,您最好发布两个问题。一个是关于如何使用 GLReadPixels 增加读取的像素数量,另一个是关于如何从磁盘升级和打印图像。如果这些问题都没有得到回答,我会感到惊讶。
  • 好的。谢谢。在旧帖子中;我没有找到孔的原因。我将这个问题修改为删除关于打印比例的问题。

标签: opengl printing screenshot resolution opentk


【解决方案1】:

我假设你知道你在这里要求两个非常不同的东西。

第 1 部分 - 渲染更多像素

使用GL.readpixels() 从帧缓冲区读取的像素数始终是与缓冲区大小相对应的像素数。即1280x720或类似的东西。

能够读取更多像素的唯一方法是增加 OpenGL 帧缓冲区的大小/分辨率

查找您的 OpenTK 代码中初始化 open gl 窗口并增加窗口分辨率的部分。寻找类似的东西:

public MainWindow()
    : base(
           1280, // initial width
           720,  // initial height
           ...
    )
{
    // your code
}

并根据需要更改分辨率。您可能还必须重写 GameWindow 类中的 OnResize 方法,如下所述:How to change the viewport resolution in OpenTK

第 2 部分 - 缩放图像

位图保存到磁盘后,任何“提高”分辨率的尝试都将涉及放大现有图像。这最终会导致更多的像素,但也会引入放大伪影,具体取决于图像和使用的放大算法。您可以在维基百科上阅读更多关于不同图像缩放算法的信息:Image scaling Algorithms

【讨论】:

  • 感谢您的帮助。我编辑我的问题以显示我在调整大小/绘制事件中使用的部分。我应该修改哪一部分。
  • 我不能说,因为不清楚你是如何运行你的应用程序的。您是在窗口中全屏运行它吗?当您触发 GL.readpixels() 调用时,您的窗口有多大?你了解windowsize和buffersize的关系吗?
  • 这是一个由用户设置大小的窗口。我需要提高分辨率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2013-06-14
  • 2014-11-03
  • 1970-01-01
相关资源
最近更新 更多