![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранить содержимое 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), и соот-но не сработает если окно частично перекрыто, за границей экрана и т.п.
Вообще я же предлагал тебе рисовать всё сначала в буфер (битмап), а потом выводить битмап на канву - в порядке борьбы с мерцанием, но и сохранение тогда сделать легко.