![]() |
GDI+ Halbtransparentes Image
Hallo Delphi-PRAXIS,
ich nutze GDI+ und habe folgende Frage: ich habe zwei TImages die auf dem Formular schon vorhanden sind. Das hintere TImage zeigt irgendetwas ganz normal und untransparent an. Das vordere ist schmaler und in Balkenform, soll aber halbtransparen (Alpha 80% oder so) darübergelegt werden (verschiebbar sein usw). Die eigentlichen Bilddateien sollen nicht aus einer Datei geladen werden, sonder sind schon in das TImage rein geladen (also im Objektinspektor, Image.Picture). Ist es möglich, dass zwei unabhängige TImage Komponenten übereinander zu haben und trotzdem die obere halbtransparent darzustellen? Das ganze muss möglichst Ressourcensparend sein... Hier erstmal der Quelltext wie ich es mit gedachte habe. (Funktioniert nicht)
Delphi-Quellcode:
Ich hoffe jemand kann mir da weiterhelfen.
procedure TForm1.Image1Click(Sender: TObject);
const ColorMatrix: TGPColorMatrix = ( M: ((1.0, 0.0, 0.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 0.0, 0.8, 0.0), //80% Alpha für jeden Pixel (0.0, 0.0, 0.0, 0.0, 1.0))); var Graphics, Graphics2 : IGPGraphics; Balken : IGPBitmap; Hintergrund : IGPBitmap; Attr : IGPImageAttributes; SolidBrush : IGPSolidBrush; begin Graphics := Image1.ToGPGraphics; Graphics2 := Image2.ToGPGraphics; //Weißer Hintergrund SolidBrush := TGPSolidBrush.Create(TGPColor.Create(255, 255, 255, 255)); Graphics.FillRectangle(SolidBrush, 0, 0, Image1.Width, Image1.Height); //macht das überhaupt Sinn? Hintergrund := TGPBitmap.Create(Image1.Picture.Bitmap); Balken := TGPBitmap.Create(Image2.picture.Bitmap); Attr := TGPImageAttributes.Create; Attr.SetColorMatrix(ColorMatrix, ColorMatrixFlagsDefault, ColorAdjustTypeBitmap); //Hintergrund Graphics.DrawImage(Hintergrund,0,0); //normal zeichnen //Balken Graphics2.DrawImage(Balken, TGPRect.Create(0, 100, Hintergrund.Width, Balken.Height), //halbtransparent darüber 0, 0, Balken.Width, Balken.Height, UnitPixel, Attr); end; Schonmal Danke und ein Frohes Neues Jahr :) |
AW: GDI+ Halbtransparentes Image
Wenn Du wirklich 2 Contrls zum anfassen brauchst, nimm statt des 2. Images eine Paintbox (für das semi-transparente) Bild und male dort im OnPaint.
|
AW: GDI+ Halbtransparentes Image
Danke Bummi.
Ich habe es jetzt testweise nochmal auf EINEM Image gezeichnet und festgestellt, dass es beim repaint sehr flackert. Das war natürlich klar, wenn man die Bilder aus einer Datei läd, deshalb die Frage, wie kann ich am ressourcensparentsten und "ruckelfreisten" das transparente Bild zeichnen? EDIT: Das mit der Paintbox ist ne Top Sache! Das Problem ist jedoch, es flackert trotzdem noch (logischerweise). Also die Frage ist noch offen... Sieht folgendermaßen aus:
Delphi-Quellcode:
Im OnPaint der PaintBox wird zeichnen; aufgerufen.
procedure zeichnen; //Es wird nurnoch der "Balken" drüber gezeichnet.
const ColorMatrix: TGPColorMatrix = ( M: ((1.0, 0.0, 0.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 0.0, 0.8, 0.0), (0.0, 0.0, 0.0, 0.0, 1.0))); var Graphics : IGPGraphics; Balken : IGPBitmap; Attr : IGPImageAttributes; begin Graphics := Form1.Paintbox1.ToGPGraphics; Waagen := TGPBitmap.Create('Balken.jpg'); Attr := TGPImageAttributes.Create; Attr.SetColorMatrix(ColorMatrix, ColorMatrixFlagsDefault, ColorAdjustTypeBitmap); //Balken Graphics.DrawImage(Balken, TGPRect.Create(0, 0, Form1.Image1.Width, Balken.Height), 0, 0, Balken.Width, Balken.Height, UnitPixel, Attr); end; Zum Zeichnen wird PaintBox1.Repaint gestartet. |
AW: GDI+ Halbtransparentes Image
Initial einmal erstellen/laden und bis zum destroy behalten.
Das Flackern bekommst Du weg indem Du Doublebuffered := true für den Parent (das Panel oder Form wo es drauf liegt) einstellst. |
AW: GDI+ Halbtransparentes Image
Zitat:
Doublebuffered scheint zu reichen, hätte ich auch drauf kommen können. Danke. (Ich möchte das Bild wirklich nicht aus einer Datei laden, wie könnte ich das eleganter lösen?) |
AW: GDI+ Halbtransparentes Image
Ich muss jetzt weg, bin erst morgen Abend zurück.
Du könntest im Constructor erzeugen und vorladen, ob das jetzt aus Dateien, Imagelisten, Datenbanken oder Resourcen geschieht bleibt Dir überlassen, im Destructor alles wieder freigeben. Ich hänge mal einen Fetzen an, den ich üblicherweise verwende wenn ich das ganze mit Imagelisten mache....
Delphi-Quellcode:
>> GPImagelisten aus Imagelisten (üblicherweise mit PNG's 32-bit) gefüllt.
type
TGPImageWrapper=Class(TObject) private FImage: TGPImage; FStream: TMemoryStream; public Constructor Create(AGraphic:TGraphic);overload; Constructor Create(FileName: String);overload; Destructor Destroy;override; Public Property Image:TGPImage read FImage; end; implementation; constructor TGPImageWrapper.Create(AGraphic: TGraphic); begin inherited Create; FStream := TMemoryStream.Create; AGraphic.SaveToStream(FStream); Fimage:= TGPImage.Create(TStreamAdapter.Create(FStream)); end; constructor TGPImageWrapper.Create(FileName: String); begin inherited Create; Fimage:= TGPImage.Create(FileName); end; destructor TGPImageWrapper.Destroy; begin FImage.Free; FStream.Free; inherited; end;
Delphi-Quellcode:
procedure CreateGPList(il:TDragImageList;var ol:TObjectList<TGPImageWrapper>);
var i:Integer; ico:TIcon; begin ol := TObjectList<TGPImageWrapper>.Create; ol.OwnsObjects := true; for I := 0 to il.Count - 1 do begin ico:=TIcon.Create; try IL.GetIcon(i,ico); ol.Add(TGPImageWrapper.Create(ico)); finally ico.Free; end; end; end; |
AW: GDI+ Halbtransparentes Image
Danke, ich versuch mal damit was anzufangen.
Was ist mit der TObjectList, muss das nicht noch irgendwo deklariert werden, oder so...? //Wie rufe ich deinen Code auf? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz