Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.97/35: Рейтинг темы: голосов - 35, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 02.05.2014
Сообщений: 11
1

Очистка Canvas объекта TImage

26.04.2015, 16:54. Просмотров 7169. Ответов 18
Метки нет (Все метки)


Здравствуйте! Знаю, вопрос очень популярный и на него неоднократно давались ответы на самых разных ресурсах, но так получилось, что меня найденные ответы не устроили. Обрисую ситуацию поподробнее.
Есть объект TImage. В него загружен рисунок, который является фоном, помогающим пользователю при работе. Поверх - на Canvas - пользователь рисует нечто, что потом программой обсчитывается. Если данные, на которых основан рисунок, меняется (самый простой вариант - пользователь что-то хочет удалить), то необходимо, разумеется, как-то это все стереть и перерисовать заново. Несколько решений я нашел и испытал, но неудачно. Что испытывалось:
1) Нарисовать поверх прямоугольник. Сначала решение было отброшено, поскольку нужна картинка TImage, но затем я к нему вернулся. Попытался сохранить картинку в битмап, а затем рисовать ее поверх вместо рекомендуемого прямоугольника, но Delphi отказалась работать с битмапами. Возможно, я что-то забыл подключить
2) Присвоение Null'а. Кое-где рекомендовалось, но, видимо, это решение требует каких-то специальных плясок с бубнами либо заведомо нерабочее из-за представления данных в Delphi или чего-то в этом роде
3) Заменить TImage на TPaintBox. Утверждают, что этот элемент проще заставить делать подобные вещи, но, похоже, у меня недостаточно прямые руки для этого - элемент просто куда-то исчез после запуска и выходить отказался
Собственно, может ли кто-то что-то подсказать по поводу решения? Прошу прощения за обилие подробностей, хотелось раскрыть проблему получше
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2015, 16:54
Ответы с готовыми решениями:

Canvas в TImage
Как очистить все что было нарисованное Canvas'ом в TImage , так чтоб TImage не изменился.

Canvas - Draw. на TImage
Всем привет! У меня вопрос. Решил что на канве рисовать проще чем создавать тучу TImage одного...

Рисование на TImage.Canvas
Добрый день! возникла следующая проблема: На форме добавлен компонент TImage. Свойство...

Нарисовать ромб мышкой на TImage.Canvas
Здравтвуйте. Стоит задача реализовать простейший графический редактор с функциями рисования кистью,...

18
4726 / 3799 / 1269
Регистрация: 14.04.2014
Сообщений: 17,623
Записей в блоге: 18
26.04.2015, 21:55 2
paintbox - Это и есть решение, потому что там всегда все рисуется заново
рисуешь фон из битмапа, потом все остальное

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
TForm1=class(TForm)
...
  pb1:TPaintBox;
  procedure FormCreate(Sender:TObject);
  procedure FormDestroy(Sender:TObject);
  procedure pb1Paint(Sender:TObject);
...
private
  bmp:TBitmap;
public
  ObjList:TObjectList<TMyGraphObject>;
  procedure drawObject(obj:TMyGraphObject);
end;
 
procedureTForm1.FormCreate(Sender:TObject);
begin
  bmp:=TBitmap.Create();
  objList:=TObjectList<TMyGraphObject>.Create(true);
  bmp.LoadFromFile(Filename);
end;
 
procedure Form1.FormDestroy(Sender:TObject);
begin
  bmp.free;
  objList.free;
end;
 
procedure Form1.pb1Paint(Sender:TObject);
begin
  // вот здесь все, что нужно, рисуется 
 
  // рисунок из bmp
  pb1.canvas.Draw(0,0,bmp,1);
 
 // Поверх него всякие твои объекты
  for i:=0 to objList.Count-1 do
    drawObject(objList[i]);
end;
 
procedure Form1.drawObject(obj:TMyGraphObject);
begin
   // выяснение что за объект и его рисование
end;
0
13062 / 5848 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
27.04.2015, 07:43 3
Цитата Сообщение от Dmitry_DS Посмотреть сообщение
2) Присвоение Null'а. Кое-где рекомендовалось, но, видимо, это решение требует каких-то специальных плясок с бубнами либо заведомо нерабочее из-за представления данных в Delphi или чего-то в этом роде
Не NULL, а NIL - работает железно.
Очистка канвы экземпляра TImage. При этом цвет фона будет принят равным цвету фона родителя - формы или панели, на которой лежит экземпляр TImage:
Delphi
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture := nil;
end;
Если нужно установить какой-нибудь другой цвет фона, например, белый, то делается так:
Delphi
1
2
3
4
5
6
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture := nil;
  Image1.Canvas.Brush.Color := clWhite; //Цвет кисти - белый. Или так: := RGB(255, 255, 255);
  Image1.Canvas.FillRect(Image1.BoundsRect);
end;
0
0 / 0 / 0
Регистрация: 02.05.2014
Сообщений: 11
29.04.2015, 20:24  [ТС] 4
krapotkin, спасибо за подсказку. Попробовал переписать под PaintBox, вышло довольно странно. Во-первых, рисует только если изменить размер формы. Во-вторых, битмапы все равно не рисуются. Сам что-то недошурумпумпухиваю, что могло пойти не так. Кусок кода, если поможет (в точности ваш повторять не стал, потому что не все понял, а карго-программированием заниматься не хочется)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure TForm1.PBPoliesPaint(Sender: TObject);
var i: integer;
begin
  if gotmap then PBPolies.Canvas.Draw(0,0,map,1); //если битмап загружен в map, то рисуем его
  if High(poly)>=0 then //данные для рисования - в двумерном массиве. Проверка, есть ли в массиве данные...
    for I := 0 to High(poly) do
      if High(poly[i])>=0 then //...и есть ли данные в подмассиве. Рисуем замкнутый незакрашенный контур
        begin
          PBPolies.Canvas.Polyline(poly[i]);
          PBPolies.Canvas.MoveTo(poly[i,0].x, poly[i,0].y);
          PBPolies.Canvas.LineTo(poly[i,High(poly[i])].X, poly[i,High(poly[i])].y);
        end;
  if f1>=0 then //Часть контуров может оказаться закрашенной
    begin
      PBPolies.Canvas.Brush.Color:=$00FFD296;
      PBPolies.Canvas.Polygon(poly[f1]);
    end;
  if f2>=0 then
    begin
      PBPolies.Canvas.Brush.Color:=$00FFB450;
      PBPolies.Canvas.Polygon(poly[f2]);
    end;
  if f3>=0 then
    begin
      PBPolies.Canvas.Brush.Color:=$00FF0000;
      PBPolies.Canvas.Polygon(poly[f3]);
    end;
end;
Mawrat, да, точно, NIL. По памяти писал Но сути это не меняет - скандалит. В общем-то, все равно неактуально, а то, что скандалит - меня не удивляет. На другом компьютере Delphi вообще в каждую строчку приписывает какой-то символ, а потом жалуется, что его не знает
0
4726 / 3799 / 1269
Регистрация: 14.04.2014
Сообщений: 17,623
Записей в блоге: 18
29.04.2015, 20:39 5
без проекта не понять в чем ошибка
0
0 / 0 / 0
Регистрация: 02.05.2014
Сообщений: 11
30.04.2015, 20:26  [ТС] 6
Понятно. Сильно не пугайтесь, там кое-где те еще извращения, традиционно так вышло
0
Вложения
Тип файла: rar ProjectMap.rar (8.2 Кб, 11 просмотров)
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 18
30.04.2015, 22:46 7
а почему бы не использовать слои? TImage один на одном, в нижний загружаем фон, в верхнем рисуем сами
0
4726 / 3799 / 1269
Регистрация: 14.04.2014
Сообщений: 17,623
Записей в блоге: 18
30.04.2015, 23:15 8
потому что вместо слоев получается фигня
полно этого на форуме, сначала вау у меня слои, а потом - а как сделать чтобы нормально рисовалось
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 18
01.05.2015, 13:05 9
у фотожопа получилось же, а чем ты хуже?
0
4726 / 3799 / 1269
Регистрация: 14.04.2014
Сообщений: 17,623
Записей в блоге: 18
01.05.2015, 13:33 10
рисовалось
Цитата Сообщение от siner666 Посмотреть сообщение
у фотожопа
Цитата Сообщение от siner666 Посмотреть сообщение
TImage один на одном
жжош
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 18
01.05.2015, 16:35 11
а что не так-то? допустим в нижнем храним фон, верхний реагирует на события, после обновления конвы в среднем слое смешивается фон и то, что нарисовали и верхний слой очищается. можно добавить динамический массив для хранения всех изменений, менять их порядок и работать с каждым отдельно... и вуаля, у вас самопальный фотожоп
0
4726 / 3799 / 1269
Регистрация: 14.04.2014
Сообщений: 17,623
Записей в блоге: 18
01.05.2015, 19:10 12
просто сделай это
начни
сделай 2 слоя, там посмотрим)))
0
0 / 0 / 0
Регистрация: 02.05.2014
Сообщений: 11
01.05.2015, 19:19  [ТС] 13
Побуду немного крысой. Sinner, если сделать два TImage'а один над другим, то при очистке верхнего он закроет нижний сплошным цветом, поскольку варианты очистки - см. первое мое сообщение. Фотошоп действует по совершенно другим принципам. Динамический массив - это ужасное решение, у меня, например, сохранилось с доисторических времен.
0
4726 / 3799 / 1269
Регистрация: 14.04.2014
Сообщений: 17,623
Записей в блоге: 18
01.05.2015, 19:26 14
черт, спугнул...)))
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 18
02.05.2015, 05:54 15
давно было дело, играл со спрайтами, всегда всё отлично было, сейчас даже специально повторил программно свои слова. спокойно заполняются оба TImage, и очищаются nil. это 2 независимых объекта
0
4726 / 3799 / 1269
Регистрация: 14.04.2014
Сообщений: 17,623
Записей в блоге: 18
02.05.2015, 06:41 16
открыл проект, понял, что нужен образец файла для загрузки и описание, что должно делаться в программе
0
0 / 0 / 0
Регистрация: 02.05.2014
Сообщений: 11
09.05.2015, 10:49  [ТС] 17
Да, действительно, как-то я об этом не подумал Прошу прощения за затянувшуюся паузу. Почему сразу не прорисовывается то, что должно рисоваться - сам сообразил и исправил, но битмапы как не рисовались, так и не рисуются. Исправленный проект, описание и пример файлов для загрузки прицепил. В описании, надеюсь, то, о чем вы спрашиваете.
0
Вложения
Тип файла: rar ProjectMap.rar (749.5 Кб, 7 просмотров)
4726 / 3799 / 1269
Регистрация: 14.04.2014
Сообщений: 17,623
Записей в блоге: 18
09.05.2015, 11:52 18
ну, проблема в параметре opacity
Draw(x,y,bmp,opacity);
значение 255 исправит проблему ))
и по раскладке думаю было бы получше вот так
0
Вложения
Тип файла: 7z 1.7z (6.36 Мб, 13 просмотров)
0 / 0 / 0
Регистрация: 02.05.2014
Сообщений: 11
10.05.2015, 08:08  [ТС] 19
Блин, это такой фейл... Спасибо за помощь!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2015, 08:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Ожидание окончания отрисовки Canvas / очистка драйвера
Доброго времени! Есть код следующего вида bmp := TBitmap.Create; bmp.SetSize( 256, 256 ); ...

"Мелькание" при ривовании на Timage.Canvas
Здравствуйте! Рисую на Timage.Canvas: procedure TForm1.img_tempMouseMove(Sender: TObject;...

Мерцание компонента Timage и перемещение Timage при нажатии
Здравствуйте! Помогите убрать мерцание компонента Timage при изменении размера. Нашел в...

Очистка TImage
Доброго дня коллегам! Есть некоторая проблема с зачисткой TImage. Не могу понять что не так,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.