Arsip: Milih warna diantara 2 warna?

 
user image
more 17 years ago

ZeAL

Gue lagi iseng ngotak-ngatik warna di canvas... 1. Color itu pakenya kan TColor.. nah ada gak perintah untuk ngerubah ke RGB..?? ada sih perintah ColorToRgb tapi hasilnya cuma longint... Gue maunya R ditampung sendiri, G ditampung sendiri, B ditampung sendiri.. Oia, ada perintah untuk mbalikin lagi gak dari rgb ke TColor..??? 2. Trus ada yang tau cara ngambil warna diantara 2 warna..?? misalnya gue punya warna hitam dan warna putih.. nah warna diantaranya adalah abu-abu... Tapi gak cuma grayscale (hitam/putih) aja, tapi juga berwarna.. misalnya gue punya warna merah dan warna biru, maka warna diantaranya adalah ungu... Gimana donks.. ada yang bisa..?? algoritmanya juga gak pa2.. mentok nihh.. tengkyu berats sebelumnya...
user image
more 17 years ago

boandrenalin

Jawaban no 1 : Ubah aja longintnya menjadi heksa 6 digit..ntu akan didapat nilai RGB nya tp masih dalam bentuk heksa..RGB dalam format heksa direpresentasikan begini XX XX XX R__G__B so misal 00 00 FF warnanya akan merah 00 FF 00 warnanya akan hijau FF FF FF warnanya akan hitam so ubah aja longintnya ke heksa 6 digit trus pecah 2 digit 2 digit dulu...trus dari 2 digit heksa ntu ubah ke integer lagi..dapet deh Untuk mengubah longint ke heksa 6 digit gunakan ini fungsi bawaan delphi function IntToHex (Value: Integer; Digits: Integer): string; trus ntuk ngubah heksa ke integer lagi gunakan ini function HexToInt(HexNum: string): LongInt; begin Result:=StrToInt('$' + HexNum) ; end; Jawaban no 2 : Maaf saya tidak bisa pak..semalam ga belajar :oops:
user image
more 17 years ago

kifmesoft

@ZeAL: 2. Trus ada yang tau cara ngambil warna diantara 2 warna..??
Bisa dg mengambil nilai rata2nya ... (jumlahkan masing2 RGB kemudian dibagi) Contoh : - Letakkan 3 komponen "Shape" dan 1 komponen "ColorDialog" ke Form - Bikin Event "OnMouseDown" untuk masing2 komponen Shape - Isikan masing2 Event dg kode berikut :

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  If ColorDialog1.Execute Then
    Shape1.Brush.Color:= ColorDialog1.Color;
end;
procedure TForm1.Shape3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  If ColorDialog1.Execute Then
    Shape3.Brush.Color:= ColorDialog1.Color;
end;
procedure TForm1.Shape2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  R, G, B: Integer;
begin
  R:= (GetRValue(Shape1.Brush.Color) +
       GetRValue(Shape3.Brush.Color)) Div 2;
  G:= (GetGValue(Shape1.Brush.Color) +
       GetGValue(Shape3.Brush.Color)) Div 2;
  B:= (GetBValue(Shape1.Brush.Color) +
       GetBValue(Shape3.Brush.Color)) Div 2;
  Shape2.Brush.Color:= TColor(RGB(R, G, B));
end;
- Run ... - klik komponen "Shape1" ... pilih warnanya - klik komponen "Shape3" ... pilih warnanya - klik komponen "Shape2" ... lihat hasil warna tengahnya .. CMIIW :)
user image
more 17 years ago

ZeAL

Wahh... tengkyu.... oia, ini ada code dari tempat yang lain...

type
  TRGB = record
    R: Integer;
    G: Integer;
    B: Integer;
  end;

function RGBToColor(PR, PG, PB: Integer): TColor;
begin
  Result := TColor((PB  65536) + (PG   256) + PR);
end;

function ColorToRGB(PColor: TColor): TRGB;
var
  i: Integer;
begin
  i := PColor;
  Result.R := 0;
  Result.G := 0;
  Result.B := 0;
  while i - 65536 >= 0 do
  begin
    i := i - 65536;
    Result.B := Result.B + 1;
  end;
  while i - 256 >= 0 do
  begin
    i := i - 256;
    Result.G := Result.G + 1;
  end;
  Result.R := i;
end;

{Convert a TRGB value to TColor}
function RGBToCol(PRGB: TRGB): TColor;
begin
  Result := RGBToColor(PRGB.R, PRGB.G, PRGB.B);
end;

function GetPigmentBetween(P1, P2, Percent: Double): Integer;
begin
  Result := Round(((P2 - P1) * Percent) + P1);
  if Result > 255 then
    Result := 255;
  if Result < 0 then
    Result := 0;
end;
user image
more 17 years ago

ZeAL

lupa, mo nanya lagi... Misalnya kita udah "main-main" di canvas.. nah, kalo ada window aplikasi lain muncul dan menimpa canvas, semua hasil main-main yang tertimpa akan hilang.. mau di repaint ulang, prosesnya terlalu lama.. ada cara biar gak begini..??? trus masih berhubungan.. misal ukuran canvas yang digunakan 200 x 100, tapi gambar yang mau ditampilkan/diedit/di-mainkan ukurannya lebih dari itu... Nah, masalahnya sama dengan yang diatas.. Untuk "mengakali" agar gambarnya bisa digeser-geser, gue pake komponen Scrollbox dan paintbox-nya di letakkan didalamnya... tapi ketika digeser, semua hasil "main-main" akan hilang... Nah, ada ide biar gak begini..?? tengkyuuuu...
user image
more 17 years ago

deLogic

bicara masalah konversi warna, kenapa harus pake aritmatika 65536 dan 256, itu terlalu lama, lebih cepat pake perintah SHR dan SHL. kalo x 256, maka cukup x shl 8, kalo x 65536, maka cukup x shl 16. jadi, RGB to Color nya menjadi:

function RGBToColor(PR, PG, PB: Integer): TColor;
begin
  Result := TColor((PB shl 16) + (PG shl 8) + PR);
end;
nah terus konversi Color To RGB, kayaknya lebih gampang begini:

function ColorToRGB(PColor: TColor): TRGB;
begin
  Result.R := PColor and $FF; 
  Result.G := (PColor shr 8) and $FF;
  Result.B := (PColor shr 16) and $FF;
end; 
btw snippet code tsb belum di test, jadi silahkan test sendiri ya... kekeke .. :)
user image
more 17 years ago

ZeAL

tambahin pertanyaannya yah... Gimana caranya kalo gradasi 4 warna dari sudut yang berbeda (kotak)... Ada yang bisa..???? (diketahui warna ke-4 sudut kotak, panjang & lebar sisi kotak). Buat tambahan referensi.. ini tambahan dari kode yang gue kasih sebelumnya.. Gradasi 3 warna.. tapi sayangnya berupa garis, bukan kotak...(sama kayak sebelumnya)

function GetGradientColor3(R1, G1, B1, R2, G2, B2, R3, G3, B3, Percent: Double): Integer;
{Gets a color that is inbetween the color spread defined (R1,G1,B1), (R2,G2,B2) and (R3,G3,B3).
This is similar to GetGradientColor2, except that it allows you to specify 3 colors instead of 2.}
begin
  {Use GetGradient2 to do most the work}
  if Percent < 0.5 then
    Result := GetGradientColor2(R1, G1, B1, R2, G2, B2, Percent  2)
  else
    Result := GetGradientColor2(R2, G2, B2, R3, G3, B3, (Percent - 0.5)   2);
end;
user image
more 17 years ago

deLogic

ZeAL, itu fungsi GetGradientColor2 nya ada dimana..????
user image
more 17 years ago

ZeAL

oia, lupa...nguk...nguk..nguk... :P ini yang lengkap deh...
type TRGB = record R: Integer; G: Integer; B: Integer; end; function RGBToColor(PR, PG, PB: Integer): TColor; begin Result := TColor((PB 65536) + (PG 256) + PR); end; function ColorToRGB(PColor: TColor): TRGB; var i: Integer; begin i := PColor; Result.R := 0; Result.G := 0; Result.B := 0; while i - 65536 >= 0 do begin i := i - 65536; Result.B := Result.B + 1; end; while i - 256 >= 0 do begin i := i - 256; Result.G := Result.G + 1; end; Result.R := i; end; {Convert a TRGB value to TColor} function RGBToCol(PRGB: TRGB): TColor; begin Result := RGBToColor(PRGB.R, PRGB.G, PRGB.B); end; function ColorFromRGB(Red, Green, Blue: Integer): Integer; {Returns the color made up of the red, green, and blue components. Red, Green, and Blue can be from 0 to 255.} begin {Convert Red, Green, and Blue values to color.} Result := Red + Green 256 + Blue 65536; end; function GetPigmentBetween(P1, P2, Percent: Double): Integer; begin Result := Round(((P2 - P1) Percent) + P1); if Result > 255 then Result := 255; if Result < 0 then Result := 0; end; function GetGradientColor2(R1, G1, B1, R2, G2, B2, Percent: Double): Integer; {Gets a color that is inbetween the colors defined by (R1,G1,B1) and (R2,G2,B2) Percent ranges from 0 to 1.0 (i.e. 0.5 = 50%) If percent =0 then the color of (R1,G1,B1) is returned If Percent =1 then the color of (R2,G2,B2) is returned if Percent is somewhere inbetween, then an inbetween color is returned.} var NewRed, NewGreen, NewBlue: Integer; begin {Validate input data in case it is off by a few thousanths.} if Percent > 1 then Percent := 1; if Percent < 0 then Percent := 0; {Calculate Red, green, and blue components for the new color.} NewRed := GetPigmentBetween(R1, R2, Percent); NewGreen := GetPigmentBetween(G1, G2, Percent); NewBlue := GetPigmentBetween(B1, B2, Percent); {Convert RGB to color} Result := ColorFromRGB(NewRed, NewGreen, NewBlue); end; function GetGradientColor3(R1, G1, B1, R2, G2, B2, R3, G3, B3, Percent: Double): Integer; {Gets a color that is inbetween the color spread defined (R1,G1,B1), (R2,G2,B2) and (R3,G3,B3). This is similar to GetGradientColor2, except that it allows you to specify 3 colors instead of 2.} begin {Use GetGradient2 to do most the work} if Percent < 0.5 then Result := GetGradientColor2(R1, G1, B1, R2, G2, B2, Percent 2) else Result := GetGradientColor2(R2, G2, B2, R3, G3, B3, (Percent - 0.5) * 2); end;
user image
more 17 years ago

ZeAL

Nemu link yang banyak tutorial gradien nih.. tapi sebelnya gak ada yang 4 sudut.. :( http://www.digitalcoding.com/programming/delphi/tutorial/tuteg10.htm Oohh Tuhaann... harus kemana hambamu mencariii..... (kesannya desperate banget)
more ...
  • Pages:
  • 1
  • 2
  • 3
Share to

Random Topic

Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com