Ich möchte folgendes machen:
In ein TImage soll ein Bild von variabler Größe gezeichnet werden.
Damit das Bild unverzerrt eingepasst wird ist folgendes gesetzt:
Delphi-Quellcode:
Proportional := True;
Stretch := True;
Auf dem Bild sollen Informationen angezeigt werden. Quasi zwei Spalten (Kategorie, Wert) mit variabler Anzahl von Zeilen.
Damit man die Schrift immer gut lesen kann soll die Farbe der Grafik angepasst werden und der Text in einer im Kontrast stehenden Farbe geschrieben werden.
Das werde ich wohl mit ScanLine machen:
Delphi-Quellcode:
for y := 0 to bmpA.Height - 1 do
begin
Row := bmpA.ScanLine[y];
for x := 0 to bmpA.Width - 1 do
begin
Color := ColorToRGB(BackColor);
Row[x].rgbtRed := (Row[x].rgbtRed + GetRValue(Color)) div 2;
Row[x].rgbtGreen := (Row[x].rgbtGreen + GetGValue(Color)) div 2;
Row[x].rgbtBlue := (Row[x].rgbtBlue + GetBValue(Color)) div 2;
end;
end;
Alternativ eventuell AlphaBlend() oder ApplyBitmask() aus der Graphics32 Library. AlphaBlend() scheint mir etwas langsamer als ScanLine zu sein. Bei ApplyBitmask() kommen die Farben falsch raus (benutze loAND mit der Color32 der Farbe)...
Wenn ich TextOut() auf Image_Main.Picture.Bitmap.Canvas benutze wird der Text je nach Größe der Grafikdatei mit skaliert.
1. Gibt es vielleicht eine andere gute Methode zum Einfärben?
2. Wie kann ich den Text am besten ausgeben?
Wie schon geschrieben können es mehr Zeilen sein, als in die Grafik passen. Dann wäre es nett, wenn man mit dem Scrollrad der Maus durch vertikal scrollen könnte (ohne Scollbalken?). Vielleicht könnte man ja eine TScrollBox benutzen und dynamische Controls (TLabel oder TStaticText) erzeugen. Aber wie performant und speicherschonend ist das?
Ich habe ein Archiv angehängt, das ein paar Versuche aufzeigt. Einfach die Exe starten und per Rechtsklick das Kontextmenü öffnen. Source ist auch dabei.