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

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

Сохраненеие картинки из paintbox


Страницы:   1 2

alexdn ©   (2013-04-05 09:11:00) 

Вот для timage есть такое, там всё простенько -
Image1.Picture.Bitmap.SaveToFile(name);
а вот что делать для tpaintbox, там похоже нет такого, т.е. так не напишешь -
paintbox1.Picture.Bitmap.SaveToFile(name);


alexdn   (2013-04-13 11:51:00) [1]

ужо понятно - Display.Transparent:= True;


alexdn   (2013-04-13 11:01:00) [2]

Вот как то странно всё получилось, почему на PaintBox не накладываются сразу два битмапа, получается главный рисунок вообще не виден -
procedure TForm4.PaintBox1Paint(Sender: TObject);
var BitMap:TBitMap;
 LenL, LenR: LongInt;
begin
DrawPicture(PaintBox1.Canvas); //1, здесь непосредственно создаётся главный  рисунок
//2, наклаываемое окно -
 Display       := TBitmap.Create;  
 Display.Width := PaintBox1.Width;
 Display.Height:= PaintBox1.Height;

 // Чистим канву.
 Display.Canvas.Brush.Color:= clWhite;
 Display.Canvas.FillRect(Display.Canvas.ClipRect);

 // Рисуем окно.
 Display.Canvas.Pen.Width:= 2;
 Display.Canvas.Pen.Color:= clBlack;
 Display.Canvas.Brush.Color:= clRed;
 Display.Canvas.Rectangle(GetRectWindow);

 Display.Canvas.Pen.Width:= 2;
 Display.Canvas.Pen.Color:= clBlack;

 // Выводим.
 PaintBox1.Canvas.Draw(0, 0, Display);
 Display.Free;

//3, дверь - накладываемый рисунок
if (Unit_Main.sdv<>0) or (Unit_Main.sok<>0) then BitMap:=TBitMap.Create;
if Unit_Main.sdv<>0 then
begin
  // Загрузка в BitMap выбранного графического файла
  BitMap.LoadFromFile('picture/dv.bmp');
  // Перенос изображения на канву формы
  paintbox1.Canvas.Draw(round(dl-65),round(hp-130)+round(ver),BitMap);
  // Уничтожение объекта BitMap
end;

if (Unit_Main.sdv<>0) {or (Unit_Main.sok<>0)} then BitMap.Free;
end;


alexdn   (2013-04-12 21:28:00) [3]

> Amoeba_   (11.04.13 11:40) [26]
Заработало, передалась канва как параметр).


Афонтий   (2013-04-12 16:23:00) [4]

Если вы планируете сохранять или прокручивать картинку - ну и используйте TImage, TPaintBox для других целей, вообще непонятных мне..


alexdn   (2013-04-11 12:16:00) [5]

> Amoeba_   (11.04.13 11:40) [26]
Спасибо, вполне возможно будет применено..


Дмитрий С   (2013-04-11 12:04:00) [6]


> теперь чтоб напечатать, перерисовывать всё надо

А что в этом плохого? Нормальное явление.


Ega23   (2013-04-11 11:46:00) [7]

Удалено модератором


Amoeba_   (2013-04-11 11:40:00) [8]


>  alexdn ©   (11.04.13 09:43) [25]
>
> > Amoeba_   (10.04.13 16:42) [22]
> А как передавать канву как параметр, что то я пока не очень
> представляю..

Мрак... ну просто клинический случай. Придется разжевать.

procedure DrawMyPicture(Canvas: TCanvas);
begin
 with Canvas do
 begin
   ... //здесь выполняем ВСЁ рисование как на PaintBox так и на Bitmap
 end;
end;


Рисуем на PaintBox в его OnPaint так
DrawMyPicture(PaintBox.Canvas);


Рисуем на Bitmap и сохраняем его в специальном методе так
TempBitmap := TBitmap.Create;
try
 DrawMyPicture(TempBitmap.Canvas);
 TempBitmap.SaveToFile(FileName);
finally
  TempBitmap.Free;
end;


alexdn   (2013-04-11 09:43:00) [9]

> Amoeba_   (10.04.13 16:42) [22]
А как передавать канву как параметр, что то я пока не очень представляю..


alexdn   (2013-04-10 20:15:00) [10]

Нет, там или image.canvas или paintbox.canvas, рефакторить тоже не выход, вон теперь чтоб напечатать, перерисовывать всё надо.. Amoeba_   (10.04.13 16:42) [22], возможно это и хороший выход.


Vegeta   (2013-04-10 19:32:00) [11]


> Amoeba_   (10.04.13 16:42) [22]

Там же стопицот Form1.Canvas.foo(). А рефакторить код вагонки - это смерти подобно.


Amoeba_   (2013-04-10 16:42:00) [12]


> alexdn ©   (10.04.13 16:16) [21]
>
> Да и прорисовать тем же кодом довольно сложно, кода много.
>

Чего тут может быть сложного? Подумаешь, "кода много". Да хоть архимного.  Поделюсь секретом. Вынеси код рисования из OnPaint в отдельную процедуру и рисуй вызывая ее где необходимо, передавая в нее Canvas.


alexdn   (2013-04-10 16:16:00) [13]

Да и прорисовать тем же кодом довольно сложно, кода много.


alexdn   (2013-04-10 15:48:00) [14]

> Amoeba_   (10.04.13 11:10) [19]
> Пусть покажет свой код, которым он создает рисунок на Bitmap'е.
(с)(r)


Amoeba_   (2013-04-10 11:10:00) [15]


> PaintBox рисует только то, что находится в видимой области

Это и пьяному ежу понятно ...

ТС кажись не понял, что я ему советую. Имелось в виду НЕ КОПИРОВАТЬ на Bitmap с PaintBox.Canvas, а с нуля НАРИСОВАТЬ на его Canvas тем же самым кодом,  что на PaintBox.

Пусть покажет свой код, которым он создает рисунок на Bitmap'е.


icWasya   (2013-04-10 09:53:00) [16]

>Amoeba_   (09.04.13 22:26) [17]
Вот BitMap можно сделать большего размера чем видимая область, а PaintBox рисует только то, что находится в видимой области.


Amoeba_   (2013-04-09 22:26:00) [17]

А что мешает сделать PaintBox б ольшего размера чем видимая область и положить его на ScrollBox?


alexdn   (2013-04-09 21:41:00) [18]

вот точнее - http://s017.radikal.ru/i413/1304/aa/e9271fd895ce.jpg


alexdn   (2013-04-09 21:39:00) [19]

> Amoeba_   (09.04.13 21:20) [14]
Так так и делается
>  width := PaintBox1.Width;
>  height := PaintBox1.Height;
но канва PaintBox может быть видна не вся, тогда и сохраняется только то, что видно на форме в данный момент - http://s019.radikal.ru/i614/1304/39/bed7b7408cd1.bmp


Amoeba_   (2013-04-09 21:20:00) [20]

Так создавай такого размера Bitmap, и рисуй на нем так, чтобы на нем поместилось всё.


Страницы:   1 2

Наверх

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