Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

Раскраска   Найти похожие ветки 

 
Dimich1978   (2005-11-12 07:58) [0]

сочиняю раскраску для ребенка. Все вроде бы сделал, но столкнулся с проблемой. Если помним со времен раскрасок на бумаге, то закрашивая всегда(или почти всегда) был виден исходный рисунок, т.е. очертания того что мы раскрашиваем. У меня получается, что на картинку, когда я накладываю кистью "краски", закрашиваются границы рисунка.
Как можно сделать, чтобы картинка или точнее наложенная "краска" была прозрачной по отношению к картинке. Заранее спасибо.


 
MBo ©   (2005-11-12 09:05) [1]

Если ты делаешь FloodFill, то граница, если она другого цвета, останется нетронутой


 
Dimich1978   (2005-11-12 09:29) [2]

через FloodFill я уже сделал. У меян получается два режима будет. Один работает основанный на FloodFill, т.е. закраска до fsBorder. Но я хочу привинтить и еще один вариант закраски, не автоматический, т.е. когда не достаточно одного клика мышкой чтобы залить область. А хочу чтобы ребенок сам зарисовал, т.е. развивал свои руки, а не тыкал, хотя вариант "тыканья" я оставляю тоже и он сейчас как раз и работает.
Еще раз скажу, что надо чтобы ребенок сам закрасил область и чтобы рисунок было видно, судя по моему исходнику закрашивается рисунок, а мне надо чтобы рисунок остался видим. Я смотрю в сторону смешения цветов, но как это сделать не знаю...почитал...толку мало...на вас одна надежда.
Мой вариаент зарисовки вручную:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
  with image1.canvas do
  Pen.Mode := AMode;
if i=1 then
    begin
        image1.Canvas.LineTo(X, Y);
      StatusBar1.Panels[1].Text := Format("Current: (%d, %d)", [X, Y]);
    end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
i:=1;{Через этот параметр я определяю нажатали левая кнопка или нет}
image1.Canvas.Pen.Width:=30;
image1.Canvas.pen.Color:=clred;
image1.Canvas.MoveTo(X, Y);
Image1.Canvas.Brush.Color:=clgreen;
Image1.Canvas.FloodFill(x, y, clblack, fsBorder);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
i:=0;
end;


 
GrayFace ©   (2005-11-12 10:23) [3]

Можно, например, так:
(в Image2 - изначальная черно-белая картинка)

var x0,y0:integer;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var x1,y1,x2,y2,w:integer;
begin
  with image1.canvas do
  Pen.Mode := AMode;
  if i=1 then
    with image1.Canvas do
    begin
      LineTo(X, Y);
      w:=Pen.Width;
      x1:=min(x-w,x0-w);
      y1:=min(y-w,y0-w);
      x2:=max(x+w,x0+w);
      y2:=max(y+w,y0+w);
      BitBlt(Handle, x1,y1,x2-x1+1,y2-y1+1, Image2.Picture.Bitmap.Handle,
        0,0,SRCAND);
      StatusBar1.Panels[1].Text := Format("Current: (%d, %d)", [X, Y]);
    end;
  x0:=x;
  y0:=y;
end;


 
Deka ©   (2005-11-12 10:47) [4]

А может быть контурное изображение помнить где-нибудь в буфере и накладывать его сверху на то, которое будет нарисовано кустью? Тогда абсолютно все равно каким цветом идет рисование и потом можно будет убрать контур.


 
Dimich1978   (2005-11-12 14:55) [5]

спасибо все получилось


 
GrayFace ©   (2005-11-15 18:53) [6]

Да, с таким же успехом можно поставить Image2.TransparentColor:=clWhite, а рамку любого цвета, и делать Draw.


 
злобная танька ©   (2005-11-15 19:16) [7]


> GrayFace ©   (15.11.05 18:53) [6]

это мигать будет безбожно



Страницы: 1 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
2-1132156808
JBL
2005-11-16 19:00
2005.12.04
Exception


2-1131719759
Still Swamp
2005-11-11 17:35
2005.12.04
Как создать N-мерный массив в рантайме.


2-1132216536
Катерина
2005-11-17 11:35
2005.12.04
Работа с Сanvas


10-1108091214
TheDog
2005-02-11 06:06
2005.12.04
Что это должно быть?


4-1127976980
solomon
2005-09-29 10:56
2005.12.04
Отлов событий и сообщений происходящих в другом окне