Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранить содержимое PaintBox в файл


alexdn ©   (2014-03-15 22:56:00) 

Вот пытаюсь сохранить содержимое PaintBox в файл. Сделал временную канву, только не знаю как её объединить с канвой PaintBox. Или можно как то сохранить канву PaintBox в файл напрямую?
procedure TForm4.N8Click(Sender: TObject);
var name:string;
TempBitmap:TBitmap;
begin
if SavePictureDialog1.Execute then
begin
name:=SavePictureDialog1.FileName+'.jpg';
TempBitmap := TBitmap.Create;
   TempBitmap.width := PaintBox1.Width;
   TempBitmap.height := PaintBox1.Height;
try
//TempBitmap.Canvas.Draw(0, 0, PaintBox1.Canvas);
TempBitmap.SaveToFile(name);
finally
 TempBitmap.Free;
end;
end;
end;


изыди   (2014-03-18 14:10:00) [1]

>Блин, небольшая незадачка, если вынести создание и освободение битмапа из onPaint в OnCreate/OnDestroy формы то выпадает ошибка,

А ты чего создаешь/удаляешь битмап самого паинтбокса? Какой ужос! Как же там у тебя вообще все это работает.


alexdn   (2014-03-16 20:16:00) [2]

Всё, кажется обошёлся try except-ами..


alexdn   (2014-03-16 15:27:00) [3]

> Sapersky   (16.03.14 00:44) [10]
> Ну да, создавать в OnCreate, уничтожать в OnDestroy, менять
> размер в OnResize.
Блин, небольшая незадачка, если вынести создание и освободение битмапа из onPaint в OnCreate/OnDestroy формы то выпадает ошибка, вплоть до ацесс виолатион.. и не пойму почему.


alexdn   (2014-03-16 01:04:00) [4]

> Sapersky   (16.03.14 00:44) [10]
Ну вот, кажется получилось - http://i036.radikal.ru/1403/4c/555db38ba1c3.png


clickmaker   (2014-03-16 00:54:00) [5]

> [7] alexdn ©   (16.03.14 00:05)

да-да. А мужики-то, создатели 100500 графических редакторов, и не знают, что она нерешаема )


Sapersky   (2014-03-16 00:44:00) [6]

Ну да, создавать в OnCreate, уничтожать в OnDestroy, менять размер в OnResize.


alexdn   (2014-03-16 00:15:00) [7]

> Sapersky   (15.03.14 23:44) [1]
> (битмап), а потом выводить битмап на канву - в порядке борьбы
> с мерцанием, но и сохранение тогда сделать легко.
Хорошо, сделал я так, Но ведь временная канва рисуется в onPaint и потом она высвобождается Display.Free; т.е. вызвать её же для сохранения уже не получится. Её что, не высвобождать что ли?


Sapersky   (2014-03-16 00:08:00) [8]

Можно при сохранении просто заново перерисовать картинку в битмап. Вынести всё рисование в отдельную функцию и передавать туда Canvas от PaintBox или от TBitmap.


alexdn   (2014-03-16 00:05:00) [9]

clickmaker ©   (16.03.14 00:00) [6]
есть проблема и её нужно как то решать, хотя я насколько уже понимаю она скорее всего нерешаема. PaintBox штука мерзкая и упрямая..


clickmaker   (2014-03-16 00:00:00) [10]

странный вопрос от человека, который собирался покорять зарубежный рынок...


alexdn   (2014-03-15 23:56:00) [11]

Синяя полосочка снизу, это нижняя часть формы.


alexdn   (2014-03-15 23:55:00) [12]

Я уже видел этот код, bitblt скопирует только то, что видно на экране. Вот такая фигня получается - http://s005.radikal.ru/i209/1403/aa/a954b2c3c3d2.png


alexdn   (2014-03-15 23:46:00) [13]

Да, согласен BitBlt не сработает, т.к. окно частично перекрыто, всего PaintBox не видно..


Юрий Зотов   (2014-03-15 23:46:00) [14]

Пример от DimaBr:

procedure TForm1.Button1Click(Sender: TObject);
begin
 PaintBox1.Canvas.Ellipse(0,0,100,100);
 with TBitMap.Create do begin
   width := PaintBox1.Width;
   height := PaintBox1.Height;
   bitblt(canvas.Handle,0,0,width,height,PaintBox1.Canvas.Handle,0,0,srcCopy);
   SaveToFile('c:\test.bmp');
 end;
end;


Sapersky   (2014-03-15 23:44:00) [15]

BitBlt можно использовать, в качестве DC будут PaintBox1.Canvas.Handle и TempBitmap.Canvas.Handle. Но это фактически копирование с экрана (по крайней мере в WinXP), и соот-но не сработает если окно частично перекрыто, за границей экрана и т.п.
Вообще я же предлагал тебе рисовать всё сначала в буфер (битмап), а потом выводить битмап на канву - в порядке борьбы с мерцанием, но и сохранение тогда сделать легко.


Наверх

Титульная страница Поиск, карта сайта Написать письмо