Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2011.10.16;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Media";
Текущий архив: 2011.10.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.005 c
2-1309061190
Gu
2011-06-26 08:06
2011.10.16
Не могу удалить ключ реестра


2-1307957801
Jamix
2011-06-13 13:36
2011.10.16
KDTele Tools


15-1308503421
alexdn
2011-06-19 21:10
2011.10.16
9-й эксплорер


15-1308688197
Юрий
2011-06-22 00:29
2011.10.16
С днем рождения ! 22 июня 2011 среда


15-1308393220
@!!ex
2011-06-18 14:33
2011.10.16
Задача: Золушка - New Generation





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский