Печать \ сохранение
можно ли как то распечатать содержимое simpleopenglcontrol?
можно ли как то сохранить содержимое simpleopenglcontrol в фаил?
можно ли как то сохранить содержимое simpleopenglcontrol в фаил?
Bitmap bmp = new Bitmap(this.Width, this.Height);
this.DrawToBitmap(bmp,new Rectangle(0, 0, this.Width, this.Height));
bmp.save(...)
Правда я так не проверял, но по идее должно сработать (this это simpleopenglcontrol или форма окна)
void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
Считывает пиксельные данные из прямоугольника буфера кадра, чей левый нижний угол находится в точке с оконными координатами (x, y), а ширина и высота равны width и height, и сохраняет его в массиве, на который указывает аргумент pixels. Аргумент format задает характер элементов пиксельных данных, которые должны быть считаны (величина индекса или величины R, G, B или A в соответствии с таблицей 8-1), а type задает тип данных для каждого элемента
Gl.glReadBuffer(Gl.GL_FRONT);
Gl.glReadPixels(0, 0, AnT.Width, AnT.Height, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, buffer);
Graphics g = pictureBox1.CreateGraphics();
for (int i=1; i<AnT.Width ; i++)
{
for (int j = 1; j < AnT.Height; j+=3)
{
g.FillRectangle(new SolidBrush(Color.FromArgb(255, buffer[j] % 255, buffer[j + 1] % 255, buffer[j + 2] % 255)), i, j, 1, 1);
}
}
вот так ковыряю(попытка перекинуть все пиксели в picturebox), но че не очень получился.
char[] buffer = new char[AnT.Width * AnT.Height * 3];
Gl.glReadBuffer(Gl.GL_FRONT);
Gl.glReadPixels(0, 0, AnT.Width, AnT.Height,
Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, buffer);
int a = 0;
Graphics g = pictureBox1.CreateGraphics();
for (int i=0; i<AnT.Width ; i++)
{
for (int j = 0; j < AnT.Height; j++)
{
g.FillRectangle(new SolidBrush(Color.FromArgb(255,
buffer[a] % 255,
buffer[a + 1] % 255,
buffer[a + 2] % 255)),
i, j, 1, 1);
a++;
}
}
Если будет все нормально — значит ошибка в
g.FillRectangle(new SolidBrush(Color.FromArgb(255,
buffer[a] % 255,
buffer[a + 1] % 255,
buffer[a + 2] % 255)),
i, j, 1, 1);
иначе в чтении буфера. (например стоит режим
Gl.glReadBuffer(Gl.GL_FRONT);
в то время как при инициализации у вас указано
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
private Bitmap GetBitmap()
{
Gl.glFlush();
Bitmap bitmap = new Bitmap(AnT.Width, AnT.Height+50);
BitmapData bitmapData = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
Gl.glReadBuffer(Gl.GL_FRONT);
Gl.glReadPixels(0, 0, bitmap.Width, bitmap.Height,
Gl.GL_BGR_EXT, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
bitmap.UnlockBits(bitmapData);
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
return bitmap;
}