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
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.