Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
ВнизСохранить содержимое 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.055 c