Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/47: Рейтинг темы: голосов - 47, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 14
1

Рисование поверх другого изображения

22.08.2012, 12:35. Показов 9537. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте форумчане!
Возник такой вопрос: Нужно рисовать поверх другого изображения, с возможностью редактирования нарисованного.
Допустим, что на PainBox'e выведен текст через TBitmap. Рисовать поверх текста карандашом получается. Но нужно, чтобы нарисованное карандашом, можно было стирать "ластиком". Когда начинаешь
затирать ластиком нарисованное, стирается и выведенный текст. На картинке показано как получилось.
Поэтому, как быть? Говорят, что нужно что-то со слоями делать, но я не разобрался. Подскажите пожалуйста.
Миниатюры
Рисование поверх другого изображения  
0
22.08.2012, 12:35
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.08.2012, 12:35
Ответы с готовыми решениями:

Как разместить изображение из Label поверх другого изображения?
а у меня возник вопрос! как разместить изображение из Label поверх другого изображения? мне нужно, чтобы подпись на фотографии была. все...

Рисование поверх jpg
Дельфи 7 uses jpeg Загружаю 1.jpg в Image по LoadFromFile. Пытаюсь рисовать поверх LineTo. Выдает, что не может - нужен битмап. ...

Обьект поверх другого обьекта
Здравствуйте, вот такая проблемма. У меня есть RichEdit на форме, мне нужно поверх него положить картинку, но она рисуется позати. Тыщу раз...

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33074 / 21375 / 8211
Регистрация: 22.10.2011
Сообщений: 36,695
Записей в блоге: 9
22.08.2012, 18:53 2
Проблема у тебя - в том, что ты не затираешь нарисованное карандашом. А просто перекрашиваешь это цветом фона. При таком подходе невозможно добиться удаления рисунка с одного слоя без затрагивания другого. Вот если бы ластиком действительно удалял ранее нарисованное, то созданием дополнительного прозрачного битмапа над PaintBox-ом (ну, можно называть это слоем) можно было решить проблему.

Но прозрачность - это скорее GDI+.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
22.08.2012, 20:02 3
Можно использовать несколько Bitmap и накладывать их в PaintBox (CopyRect), используя CopyMode. Вот какое именно значение CopyMode использовать - не могу сказать. Нужно поэкспериментировать. А при рисовании/стирании - рисовать/стирать на Bitmap-е, который в настоящий момент является верхним слоем. В общем делать по типу, как это реализовано в Фотошопе. Да, наверное, и в других графических редакторах. Организовать перемещение слоя наверх, объединение и т.д.
0
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 14
23.08.2012, 13:25  [ТС] 4
Спасибо, UI и Одиночка!!! Получилось!!! Действительно на одном PaintBox'е нужно задать несколько битмапов, (тут у нас два). У обоих установить свойства: bmp1.TransParentColor := clWhite;
bmp1.TransparentMode := tmAuto;
bmp1.Transparent:=true; также и для второго.
Затем в событии OnPaint 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
44
45
46
47
48
49
50
51
52
53
var bmp, bmp2: TBitmap; //битмапы глобальные
procedure TForm1.FormCreate(Sender: TObject);
begin
  bmp := TBitmap.Create;
  bmp.Width := 419;
  bmp.Height := 447;
 
  bmp2 := TBitmap.Create;
  bmp2.Width := 419;
  bmp2.Height := 447;
//
  bmp.Canvas.Brush.Color := clWhite; // цвет фона белый
  bmp.Canvas.FillRect(ClientRect);
  bmp.TransParentColor := clWhite;
  bmp.TransparentMode := tmAuto;
  bmp.Transparent:=true;
 
  bmp2.Canvas.Brush.Color := clWhite; // цвет фона белый
  bmp2.Canvas.FillRect(ClientRect);
  bmp2.TransParentColor := clWhite;
  bmp2.TransparentMode := tmAuto;
  bmp2.Transparent:=true;
 
  with PaintBox1 do
  begin
    Width := bmp.Width;
    Height := bmp.Height;   
  end;
end;
 
(*Событие OnPaint  PaintBox'а*)
procedure TForm1.PaintBox1Paint(Sender: TObject);
var b:TBitmap;
begin
 b := TBitmap.Create;
 b.Width := 419;
 b.Height := 447;
 b.Canvas.Brush.Color := clWhite;
 b.Canvas.Pen.Color := clWhite;
 b.Canvas.rectangle(Rect(Point(0, 419), Point(0, 447)));
 
 b.Canvas.Draw(0,0,bmp);
 b.Canvas.Draw(0,0,bmp2);
 PaintBox1.Canvas.Draw(0,0,b);
 b.Free;
end;
 
(* Очистка холста Bitmap из памяти *)
procedure TForm1.FormDestroy(Sender: TObject);
begin
  bmp.Free;
  bmp2.Free;
end;
0
Заблокирован
23.08.2012, 20:31 5
В принципе всё верно. Но... вполне возможно, что возникнут проблемы с гладкостью рисунка.
Тут нужно не копирование, а побитовая перерисовка через сканлайн или другую скоростную технологию перерисовки, с использованием альфа-канала.
0
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 14
29.08.2012, 09:49  [ТС] 6
Нашелся ещё один способ решения этой проблемы:
Текст подложки не рисуется, а вставляется в компонент image как рисунок. Рисунок же грузим в свойство Picture. Чтобы image не мешался рисовать на PaintBox'е, у image в свойстве visible ставим false. Затем также, вместо второго Bitmap PaintBox'а рисуем image.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(*Событие OnPaint  PaintBox'а*)
procedure TForm1.PaintBox1Paint(Sender: TObject);
var b:TBitmap;
begin
 b := TBitmap.Create;
 b.Width := 402;
 b.Height := 757;
 b.Canvas.Brush.Color := clWhite;
 b.Canvas.Pen.Color := clWhite;
 b.Canvas.rectangle(Rect(Point(0, 402), Point(0, 757)));
 
 (*Здесь происходит объединение  битмапа и image в один битмап*)
 b.Canvas.Draw(0,0,image1.Picture.Bitmap); //Рисование image1 в bitmap
 b.Canvas.Draw(0,0,bmp);
 pic.Canvas.Draw(0,0,b);
 b.Free;
end;
 
(* Очистка холста Bitmap из памяти *)
procedure TForm1.FormDestroy(Sender: TObject);
begin
  bmp.Free; 
end;
0
29.08.2012, 09:49
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.08.2012, 09:49
Помогаю со студенческими работами здесь

Как написать текст поверх изображения ?
У меня в программе был текст , потом я поставил на все окно программы изображение , теперь текста не видно . Помогите !

Delphi Xe3, SpeedButton текст поверх изображения. Как?
Всем привет. Как текст из Caption вывести поверх изображения из Glyph? LayOut позволяет только выводить под, над, слева и справа, а...

Масштаб изображения (рисование сбивается)
Делаю графический редактор и столкнулся с такой проблемой. После включения масштаба(я увеличиваю в 2 раза) if (Image1.Height = 1336) AND...

Рисование линии разными стилями и стирание изображения
добрый день, уважаемые программисты. помогите,пожалуйста, дописать программу на языке Делфи 7. вот задание, которое уже сделано: ...

Наложение изображения поверх другого изображения
Дорогие форумчане!Подскажите пожалуйста, как реализовать следующую задачу: необходимо наложить одно изображение поверх другого...


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Создаем SPA Router на чистом JavaScript
bytestream 17.02.2025
В современной веб-разработке одностраничные приложения (SPA) стали стандартом для создания динамичных и отзывчивых пользовательских интерфейсов. Ключевым компонентом любого SPA является роутер -. . .
Машинное обучение на TypeScript и TensorFlow
bytestream 17.02.2025
Машинное обучение становится все более востребованным направлением в современной разработке программного обеспечения. Интеграция искусственного интеллекта в веб-приложения открывает новые возможности. . .
Манипуляция данными EXIF и JPEG в JavaScript
bytestream 17.02.2025
В современном мире цифровой фотографии метаданные изображений играют важнейшую роль в организации и управлении медиаконтентом. Формат EXIF (Exchangeable Image File Format) - это стандарт,. . .
Как создать GUID/UUID в JavaScript
bytestream 17.02.2025
GUID (Globally Unique Identifier) и UUID (Universally Unique Identifier) - это специальные форматы 128-битных идентификаторов, которые практически гарантируют уникальность значения во времени и. . .
Что такое мышление в упрощенном смысле (моё субъективное видение, для создания модели).
Hrethgir 17.02.2025
Разумеется упрощать смысл есть. Дело в том, что я пришёл к тому выводу, что даже если я создам свой процессор (конвейер), то первое для чего смогу его использовать в качестве демонстративного. . .
Как Node.js устроен изнутри
Wired 17.02.2025
Node. js коренным образом изменил подход к веб-разработке, позволив использовать JavaScript не только в браузере, но и на стороне сервера. Созданный в 2009 году Райаном Далем, Node. js представляет. . .
Как обновить Node.js в Windows
Wired 17.02.2025
Думаю, многие разработчики сталкивались с ситуацией, когда устаревшая версия Node. js становилась источником проблем - от несовместимости с новыми пакетами до уязвимостей в безопасности. Особенно это. . .
Как обновить Node.js в MacOS
Wired 17.02.2025
В Node. js существует несколько подходов к обновлению, каждый из которых имеет свои преимущества и особенности применения. Выбор конкретного метода зависит от ваших потребностей - будь то. . .
Как обновить Node.js в Linux
Wired 17.02.2025
Обновление Node. js может показаться сложной задачей, особенно если у вас несколько проектов с разными зависимостями. Однако существует несколько надежных способов обновления, подходящих для разных. . .
[golang] 134. Gas Station
alhaos 17.02.2025
Тут нам даны два целочисленных слайса gas и cost, индексы массива представляют собой заправочные станции. а элементы gas это количество топлива на такой станции, cost это количество топлива. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru