mieszanie kolorów

0

Jak zrobić mieszanie kolorów, przy pomocy tshape i właściwości pmmode. Aby nałożyć na siebie dwa komponenty i dały kolor wymieszany

0

Zależy co rozumiesz przez "wymieszany"... Jeśli chodzi ci o kolor pośredni, między jednym kolorem, a drugim, to przy pomocy PenMode (na TShape) tego nie zrobisz. Aby znaleźć taki kolor, wystarczy policzyć średnią ze składowych (r,g,b) tych kolorów.

0

niektóre kolory nie miesza jak powinno, na ale jak już napisałem to może się przyda.

var re1,re2,re3: TRect; //prostokąty
  Shape3: TShape;       //tworzony ksztalt
  cl1, cl2: TColor;     // kolory obu ksztaltow
  R,G,B,R2,G2,B2: Cardinal; //rozbite kolory na RGB
begin
  {znalezienie obszaru obu Shape-ow}
  re1:=Shape1.BoundsRect;
  re2:=Shape2.BoundsRect;

  {wyznaczenie częsci wspólnej ksztaltów}
  if shape1.Top < Shape2.Top then re3.Top:=Shape2.Top else re3.Top:=Shape1.Top;
  if shape1.Left < Shape2.Left then re3.Left:=Shape2.Left else re3.Left:=Shape1.Left;
  if (shape1.Top+Shape1.Height < Shape2.Top+Shape2.Height ) then re3.Bottom:=Shape1.Top+Shape1.Height else re3.Bottom:=Shape2.Top+Shape2.Height;
  if (shape1.Left+Shape1.Width < Shape2.Left+Shape2.Width ) then re3.Right:=Shape1.Left+Shape1.Width else re3.Right:=Shape2.Left+Shape2.Width;

  {Stworzenie nowego ksztaltu z odpowiednimi wlasciwosciami}
  Shape3:=TShape.Create(Form1);
  Shape3.Shape:=stRectangle;
  Shape3.Left:=re3.Left;
  Shape3.Top:=re3.Top;
  Shape3.Width:=re3.Right-re3.Left;
  Shape3.Height:=re3.Bottom-re3.Top;
  Shape3.BringToFront;
  Shape3.Parent:=Form1;

  {zczytanie kolorów Shape1}
  cl1:=Shape1.Brush.Color;
  R := cl1 and $FF;
  G := (cl1 shr $8) and $FF;
  B := (cl1 shr $10) and $FF;

  {zczytanie kolorów Shape1}
  cl2:=Shape2.Brush.Color;
  R2 := cl2 and $FF;
  G2 := (cl2 shr $8) and $FF;
  B2 := (cl2 shr $10) and $FF;

  {zmieszanie kolorów}
  R:=Round(abs(R+R2)/2);
  G:=Round(abs(G+G2)/2);
  B:=Round(abs(B+B2)/2);

  {ustawienie koloru dla wspólnej częsci}
  Shape3.Brush.Color:=(B shl $10) or (G shl $8) or R;

Na razie działa tylko na obiektach prostokątnych. Jak uda Ci się coś więcej wymyślić bądź też coś lepszego to daj znać.

0

może chodzi o takie cuś:

wstawiasz 3 panele i colordialog. I w zdarzeniach OnClick kolejno Panel1, Panel2 i Panel3 piszesz: 
 
Panel1 OnClick: 
if colordialog1.Execute then 
panel1.Color:=colordialog1.Color; 
 
Panel2 OnClick: 
if colordialog1.Execute then 
panel2.Color:=colordialog1.Color; 
 
Panel3 OnClick: 
var 
r1, r2, g1, g2, b1, b2, newr, newg, newb: Byte; 
rat1, rat2: Integer; 
begin 
rat1 := 50; 
rat2 := 50; 
r1 := GetRValue(Panel1.Color); 
r2 := GetRValue(Panel2.Color); 
g1 := GetGValue(Panel1.Color); 
g2 := GetGValue(Panel2.Color); 
b1 := GetBValue(Panel1.Color); 
b2 := GetBValue(Panel2.Color); 
newr := Round((r1 * rat1 + r2 * rat2) / (rat1 + rat2)); 
newg := Round((g1 * rat1 + g2 * rat2) / (rat1 + rat2)); 
newb := Round((b1 * rat1 + b2 * rat2) / (rat1 + rat2)); 
Panel3.Color := RGB(newr, newg, newb); 
 
rat1 i rat2 to proporcje tych dwoch kolorow.

1 użytkowników online, w tym zalogowanych: 0, gości: 1