Jo, das wird da gezeigt, ich habs nur erwähnt weil ich mich noch nicht drum gekümmert hab. StretchBlt, joah, in meinem Fall eignet sich die Jcl-Version glaub ich besser.
Die hat halt den Vorteil dass man ihr ein TGraphic gibt, und die Ausgabe aber auf einem TBitmap stattfindet. Ich hatte ja das Problem, dass ich bei nicht-Bitmaps die ich lade, keinen vernünftigen Zugriff auf das TImage habe. Auf diese Weise kann ich das Graphic des Images auslesen, egal welches Format es ist, und bekomme eine Ausgabe mit der man arbeiten kann (und ich kann mir beim Stretchen den Filter aussuchen
).
Auf dem TImage malen: Genau so hab ichs aber gemacht
Ich hatte ja das Problem, dass ich nichts transparentes über das Image legen kann und/oder ich nicht aus dem Image lesen kann (was ich aber muss wenn ich auf ner überliegenden Komponente die Farben mischen will). Gut, jetzt hab ich durch das Stretch-Kopieren ja ein normales Image mit normaler Bitmap aus der ich lesen kann, theoretisch könnte ich noch ne Paintbox drüberlegen und darauf zeichnen. Darauf werd ich zurückgreifen wenn mir das Rahmenzeichnen auf dem TImage bei Mausverschiebung zu lange dauert.
Die Farben mischen ist eigentlich ganz einfach. Ich hab mir vorher in nem Grafikprogramm die Farbe ausgesucht, die im Inneren der Box sein soll. Für einen Durchschein-Effekt muss man dann die Farbe des Boxpixels mit der Farbe des an der Stelle liegenden Bildpixels verrechnen. Das geht einfach per Durchschnitt:
Delphi-Quellcode:
mline[i].B := round((mline[i].B * 1.25 + 0 * 0.75) / 2);
mline[i].G := round((mline[i].G * 1.25 + 255 * 0.75) / 2);
mline[i].R := round((mline[i].R * 1.25 + 76 * 0.75) / 2);
In diesem Ausschnitt ist der Durchschnitt dazu noch gewichtet. Also so, dass die bildeigenen Anteile noch ein bisschen stärker durchs Grün durchscheinen. Im Beispielbild war es noch ohne Faktoren, also so:
mline[i].B := round((mline[i].B + 0) / 2); //der gewünschte Grünton hat keine Rotanteile
Also ganz einfach: Bildfarbe plus Boxfarbe durch zwei