Farbverläufe in einem Image
-
Hallo,
ich möchte in einem TImage einen Farbverlauf von Farbe1 zu Farbe2 erzeugen. Leider weiß ich nicht wie ich das anstellen soll. Ich hoffe ihr könnt mir helfen.
Danke für eure Mühe
-
hi,
hier ich hab dir mal ein beispiel programmiert...
//--------------------------------------------------------------------------- // Funktion erzeugt einen Farbverlauf (links nach rechts) von // SourceColor zu DestColor //--------------------------------------------------------------------------- void RGBFarbverlauf(TImage *Image, RGBTRIPLE SourceColor, RGBTRIPLE DestColor) { // ein bitmap erstellen Graphics::TBitmap *bmp_cl = new Graphics::TBitmap(); // hoehe und breite anpassen bmp_cl->Height = Image->Height; bmp_cl->Width = Image->Width; bmp_cl->PixelFormat = pf24bit; int breite = bmp_cl->Width; int hoehe = bmp_cl->Height; for (int j = 0; j < hoehe; j++) { RGBTRIPLE *SL = (RGBTRIPLE *) bmp_cl->ScanLine[j]; for (int i = 0; i < breite; i++) { double red = 0; double green = 0; double blue = 0; double diff_red = DestColor.rgbtRed - SourceColor.rgbtRed; double diff_green = DestColor.rgbtGreen - SourceColor.rgbtGreen; double diff_blue = DestColor.rgbtBlue - SourceColor.rgbtBlue; if ((SourceColor.rgbtRed != 0) || (DestColor.rgbtRed != 0)) { red = (((double) breite - (double) i) * diff_red / (double) breite); red = red > 0.0 ? (255 - red) : -red; } if ((SourceColor.rgbtGreen != 0) || (DestColor.rgbtGreen != 0)) { green = (((double) breite - (double) i) * diff_green / (double) breite); green = green > 0.0 ? (255 - green) : -green; } if ((SourceColor.rgbtBlue != 0) || (DestColor.rgbtBlue != 0)) { blue = (((double) breite - (double) i) * diff_blue / (double) breite); blue = blue > 0.0 ? (255 - blue) : -blue; } SL[i].rgbtRed = (BYTE) red; SL[i].rgbtGreen = (BYTE) green; SL[i].rgbtBlue = (BYTE) blue; } } // neu erzeugtes bild dem image zuweisen Image->Picture->Bitmap->Height = hoehe; Image->Picture->Bitmap->Width = breite; Image->Picture->Bitmap = bmp_cl; // speicher freigeben delete bmp_cl; } void __fastcall TForm1::Button6Click(TObject *Sender) { RGBTRIPLE SourceColor, DestColor; // quellfarbe: schwarz SourceColor.rgbtRed = 0; SourceColor.rgbtGreen = 0; SourceColor.rgbtBlue = 0; // zielfarbe: weiss DestColor.rgbtRed = 255; DestColor.rgbtGreen = 255; DestColor.rgbtBlue = 255; // aufruf der funktion für den farbverlauf RGBFarbverlauf(Image3, SourceColor, DestColor); }
[ Dieser Beitrag wurde am 29.04.2003 um 11:13 Uhr von Sunday editiert. ]
-
Hallo,
Danke für deine Mühe, nur leider klappt das nicht mit allen Farben, wenn man für die Farben folgendes nimmt, kommt was falsches dabei raus.
// quellfarbe: clMaroon oder ähnlich SourceColor.rgbtRed = 128; SourceColor.rgbtGreen = 0; SourceColor.rgbtBlue = 0; // zielfarbe: schwarz DestColor.rgbtRed = 0; DestColor.rgbtGreen = 0; DestColor.rgbtBlue = 0;
weiß jemand eine Möglichkeit wie es auch mit diesen Farben funktioniert?
Danke für eure Hilfe
-
Hallo,
versuch es mal hiermit.
void __fastcall TForm1::Button1Click(TObject *Sender) { int R, G, B; TRect Rect = Image1->ClientRect; TColor Color1 = clBlue; TColor Color2 = clRed; for (int i = Rect.Top; i < Rect.Bottom; i++) { R = (GetRValue(Color1) + ((GetRValue(Color2) - GetRValue(Color1)) * i / (Rect.Bottom - Rect.Top))); G = (GetGValue(Color1) + ((GetGValue(Color2) - GetGValue(Color1)) * i / (Rect.Bottom - Rect.Top))); B = (GetBValue(Color1) + ((GetBValue(Color2) - GetBValue(Color1)) * i / (Rect.Bottom - Rect.Top))); Image1->Canvas->Pen->Color = RGB(R, G, B); Image1->Canvas->Pen->Width = 2; Image1->Canvas->Pen->Style = psInsideFrame; Image1->Canvas->MoveTo(Rect.Left, i); Image1->Canvas->LineTo(Rect.Right, i); } }
Bei mir klappt das so mit allen Farbkombinationen die ich ausprobiert habe.
-
hab meinen geposteten code nochmal geändert. funktioniert nun auch mit RGB-Werten alla (128,0,0) usw...
-
Hallo,
ich möchte einen Farbverlauf erzeugen, der nicht geradlinig von Farbe a nach b geht, sondern radial um den Farbkreis herum (ala CorelDraw). Also einmal quer durch alle Farben.
Wie kann ich so etwas proggen ?
Gruß Mario
-
Hi,
des Problems Lösung ist das HSB-Farbmodel (H = Farbkomponente, S=Sättigung, B=Helligkeit)
nun noch "schnell" im Google'n eine Funktion zum Umwandeln von HSB in RGB gesucht und gefunden (hää war allerdings in java, ist aber kein Problem).
Dann den Farbverlauf von Sunday etwas verändert und schon Fertig.
hier nun das wichtigste:
// Konvertierung von HSB in RGB // hue = Farbkomponente von 0.0 bis 1.0 // saturation = Sättigung von 0.0 bis 1.0 // brightness = Helligkeit von 0.0 bis 1.0 void HSBtoRGB (double hue, double saturation, double brightness,int *_R, int *_G, int *_B) { int r = 0, g = 0, b = 0; hue = hue - (int)hue; if (saturation == 0) { r = g = b = (int)(brightness * 255); } else { double h = hue==1.0 ? 0 : hue*6.0; double f = h - (int)h; double p = brightness * (1.0 - saturation); double q = brightness * (1.0 - saturation * f); double t = brightness * (1.0 - (saturation * (1.0 - f))); if (h < 1) { r = (int)(brightness * 255); g = (int)(t * 255); b = (int)(p * 255); } else if (h < 2) { r = (int)(q * 255); g = (int)(brightness * 255); b = (int)(p * 255); } else if (h < 3) { r = (int)(p * 255); g = (int)(brightness * 255); b = (int)(t * 255); } else if (h < 4) { r = (int)(p * 255); g = (int)(q * 255); b = (int)(brightness * 255); } else if (h < 5) { r = (int)(t * 255); g = (int)(p * 255); b = (int)(brightness * 255); } else { /* if (h < 6) */ r = (int)(brightness * 255); g = (int)(p * 255); b = (int)(q * 255); } } *_R = r; *_G = g; *_B = b; } // der veränderte Farbverlauf von Sunday void HSBFarbverlauf(TImage *Image) { // ein bitmap erstellen Graphics::TBitmap *bmp_cl = new Graphics::TBitmap(); // hoehe und breite anpassen bmp_cl->Height = Image->Height; bmp_cl->Width = Image->Width; bmp_cl->PixelFormat = pf24bit; int breite = bmp_cl->Width; int hoehe = bmp_cl->Height; int red, green, blue; for (int j = 0; j < hoehe; j++) { RGBTRIPLE *SL = (RGBTRIPLE *) bmp_cl->ScanLine[j]; for (int i = 0; i < breite; i++) { HSBtoRGB((1.0 / breite) * i, 1.0, 1.0,&red,&green,&blue); SL[i].rgbtRed = (BYTE) red; SL[i].rgbtGreen = (BYTE) green; SL[i].rgbtBlue = (BYTE) blue; } } // neu erzeugtes bild dem image zuweisen Image->Picture->Bitmap->Height = hoehe; Image->Picture->Bitmap->Width = breite; Image->Picture->Bitmap = bmp_cl; // speicher freigeben delete bmp_cl; }
na dann eine Gute Nacht
Mario