Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.16;
Скачать: CL | DM;

Вниз

OpenGL - как сделать "скриншот"?   Найти похожие ветки 

 
Franzy   (2008-03-19 11:22) [0]

Пишу программу для вывода трехмерных изображений (сеток, если быть точным) с помощью OpenGL. Хочу предусмотреть возможность сохранения картинки в файл в формате BMP. Для чего хочу задействовать стандартную процедуру SavetoFile класса TPicture.
OpenGL у меня рисует на канвасе формы. Пишу такой обработчик события (пункт меню) для формы:

var temp: TPicture;
    i,j : longint;
begin
temp:=TPicture.create;
temp.canvas.width:=ClientWidth;
temp.canvas.height:=ClientHeight;
for i:=1 to ClientWidth do
 for j:=1 to ClientHeight do
   temp.canvas.pixels[i,j]:=canvas.pixels[i,j];
temp.SaveToFile(....)
end;

Все комплилится, работает, даже рисунок сохраняется... НО!!!! Когда открываешь рисунок в том же пэйнте вместо ожидаемого изображения видны картинке в духе черного квадрата Малевича: все залито цветом фона и где-нибудь сбоку широкая полоса цвета, которым рисуется объект...

Подскажите, что я делаю не так, или предложите свой вариант реализации описанной в начале поста возможности.


 
grisme   (2008-03-19 11:39) [1]


> for i:=1 to ClientWidth do  for j:=1 to ClientHeight do
>    temp.canvas.pixels[i,j]:=canvas.pixels[i,j];


Маньяк %) а может надо делать скриншот после отрисовки? дождаться ПОЛНОЙ отрисовки кадра, а только затем делать вышеуказанный перегон и сохранять в файл? это просто как вариант.


 
Franzy   (2008-03-19 11:59) [2]

Повторяю, это обработчик события. Вызывается по нажатию кнопки или пункта меню. Нажатие, разумеется, производится юзером уже после того, как картинка нарисована.


 
Franzy   (2008-03-19 12:04) [3]

Пардон, только врубился. Чего-то я не сообразил, что при вызове диалога с именем файла будет вызвано и событие onpaint, в котором идет отрисовка...
Если это учесть, все работает, как надо :)
Спс :)


 
Franzy   (2008-03-19 12:17) [4]

Осталась только одна проблема - как отловить окончание прорисовки?!

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

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


 
Sergio666 ©   (2008-03-20 12:00) [5]

1) Вставляй в конец отрисовки glFinish
2) Используй не canvas.pixels, а BitBlt (из DC OpenGL"я во временный bitmap)


 
Franzy   (2008-07-31 13:54) [6]

Прога уже другая, но задача осталась прежней. Важное отличие - теперь рисую не на канвасе формы, а на TPanel - у нее канваса нет. Решил сделать по уму, через BitBlt, но не получается. Что я делаю не так?
Вот код:

procedure TForm1.Button3Click(Sender: TObject);
var p : TPicture;
   i,j: longint;
   shotfile:TFileName;

begin

  p:=TPicture.Create;
  p.Bitmap.Width:=panel1.ClientWidth;
  p.BitMap.Height:=panel1.clientHeight;

  BitBlt(p.Bitmap.Handle,0,0,p.Bitmap.Width,p.Bitmap.Height,DC,0,0,SRCCOPY);

 if SavePictureDialog1.Execute then
  begin
    ShotFile:=SavePictureDialog1.FileName;
    p.SaveToFile(ShotFile);
    p.Destroy;
  end;

end;


В файл сохраняется только белый прямоугольник без рисунка.


 
Franzy   (2008-07-31 14:09) [7]

P.S. DC - хэндл panel1.


 
medved_68 ©   (2008-07-31 17:47) [8]


> а на TPanel - у нее канваса нет.

Ты ошибаешься. Сделай наследника и переведи канву в раздел public.


 
GladiatorX ©   (2008-08-04 14:00) [9]

TPanel - наследник от TControl, а у него в секции private есть Canvas: TCanvas;. Поэтому для изменения видимости Canvas, сделай согласно предложенному medved_68.



Страницы: 1 вся ветка

Текущий архив: 2011.10.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
15-1308767885
alexdn
2011-06-22 22:38
2011.10.16
Шаблон для ms sql


2-1308850168
Drowsy
2011-06-23 21:29
2011.10.16
Есть ли функция, возвращающая адрес колонки грида


2-1309043057
Gu
2011-06-26 03:04
2011.10.16
Текстовые ресурсы


2-1309475190
Den
2011-07-01 03:06
2011.10.16
not VarIsEmpty не срабатывает с функцией find v excel?


2-1308748384
Alex_C
2011-06-22 17:13
2011.10.16
Как форме перхватить нажание VK_LEFT?