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

Вниз

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

 
alexdn ©   (2014-03-15 22:56) [0]

Вот пытаюсь сохранить содержимое 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;


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

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


 
alexdn ©   (2014-03-15 23:46) [2]

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


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

Пример от 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;


 
alexdn ©   (2014-03-15 23:55) [4]

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


 
alexdn ©   (2014-03-15 23:56) [5]

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


 
clickmaker ©   (2014-03-16 00:00) [6]

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


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

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


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

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


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

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


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

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


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

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

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


 
alexdn ©   (2014-03-16 01:04) [12]

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


 
alexdn ©   (2014-03-16 15:27) [13]

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


 
alexdn ©   (2014-03-16 20:16) [14]

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


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

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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.086 c
4-1263334007
leonidus
2010-01-13 01:06
2015.09.10
Обработка сообщения на закрытие приложение


2-1393997114
Васька
2014-03-05 09:25
2015.09.10
ListBox


15-1414083578
Kerk
2014-10-23 20:59
2015.09.10
Delphi -> Object Pascal


15-1414870399
Pavia
2014-11-01 22:33
2015.09.10
Переопределение класса.


2-1394360821
Novicer
2014-03-09 14:27
2015.09.10
Ошибка Arithmetic exception, numeric overflow, or string truncati