Сохранение растрового изображения экрана OpenTK, но текст QuickFont не отображается?

У меня есть текстурированная коробка в моем окне. Поверх этого поля текст печатается с использованием QuickFont. Поскольку текста добавляется много и не весь сразу, на обновление этого экрана уходит время. Чтобы сэкономить время и ресурсы, я хочу сделать скриншот блока с текстом и использовать его в качестве текстуры, что намного быстрее, потому что после первого рендеринга нечего анализировать.

Я могу получить glControl для самой шапки экрана и сохранить ее в растровое изображение, но на экране нет текста. (К вашему сведению, это должна быть WYSIWYG-рендеринг распечатки для аптечных этикеток)

Есть ли способ сохранить текст?

            if (GraphicsContext.CurrentContext == null)
            throw new GraphicsContextException();

        Bitmap bmp = new Bitmap(frm1.ClientSize.Width, frm1.ClientSize.Height);
        System.Drawing.Imaging.BitmapData data =
            bmp.LockBits(frm1.ClientRectangle, System.Drawing.Imaging.ImageLockMode.WriteOnly,
            System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        GL.ReadPixels(0, 0, frm1.ClientSize.Width,frm1.ClientSize.Height,
            OpenTK.Graphics.OpenGL.PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0);
        bmp.UnlockBits(data);

        bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
        bmp.Save("Move.bmp", ImageFormat.Bmp);
        bmp.Dispose();

введите здесь описание изображения


person DevinBM    schedule 22.12.2011    source источник


Ответы (1)


Случайно наткнулся на ответ. При двойном нажатии кнопки, которая захватывает шапку экрана, вторая отображала правильную информацию, включая текст.

Несмотря на то, что вызов снимка экрана происходит после того, как текст «предположительно» отрендерен и буферы заменены местами, он по-прежнему захватывает снимок экрана из того, что находится на экране в момент запуска события OnClick.

Решение, которое я рассмотрю, - это просто создать логическое значение (законченное) и установить для него значение true в конце сегмента рендеринга текста и иметь

while (Finished = true){ Do bitmap stuff here }

Или, в качестве альтернативы, используйте переменную-счетчик, которая подсчитывает каждую проанализированную строку текста, и когда она достигает максимума (т. е. все было отрисовано), она вызывает метод захвата скриншота.)

person DevinBM    schedule 27.12.2011