Entwickler-Ecke
Multimedia / Grafik - [GDI+] Screenshot machen und im als Variable weiterverwenden
Nano-Ware - Di 24.07.12 14:51
Titel: [GDI+] Screenshot machen und im als Variable weiterverwenden
Hallo,
ich arbeite bei meinem derzeitigen Programm mit GDI+ unter Anderem wegen dem Anti-Aliasing. Ich habe jetzt ein Graphics Object als Zeichenfläche erzeugt und zwar mit dem Handle des Desktops, so wie hier beschrieben:
http://www.swissdelphicenter.ch/de/showcode.php?id=259
Das Problem ist nur, dass ich ersteinmal keine Möglichkeit finde das Canvas das Desktops "auszuschneiden" und zweitens es in TGPImage oder TGPBitmap zu speichern.
Das Sinn ist der, dass ich gern eine MakeScreenshot Funktion hätte, die eine GDI+ geläufige Bildvariable zurückliefert, dass ich damit arbeiten kann
Ich bedanke mich schonmal sehr herzlich für eure Hilfe, vor Allem, weil ich sie immoment sehr oft brauche..
bummi - Di 24.07.12 18:47
ich habe nicht ganz verstanden was Du mit dem HDC des Desktops in Zusammenhang mit einem Screenshot willst, aber vielleicht kannst Du was mit den Fetzen anfangen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| GetEncoderClsid('image/png', encoderClsid); dest:=TGPBitmap.Create(MulitFrameImage.GetWidth,MulitFrameImage.GetHeight,PixelFormat16bppRGB565); g := TGPGraphics.Create(dest); try
dest.Save( aFilename, encoderClsid, nil ); finally g.Free; dest.Free; end; |
Nano-Ware - Di 24.07.12 18:54
Hm nein sry das hilft mir nicht weiter. Ich möchte nen Screenshot machen. Das hab ich halt bis jetzt immer so gemacht. (Vorschläge für neue Optionen nehm ich gerne an). Den Screenshot möchte ich in einem GDi+ Bildobjekt speichern (das Transparenz unterstützt). Dieses Bildobjekt wird dann später bei DrawImage auf ein Canvas gemalt mit ein paar andere Informationen. Hoffentlich geht das so. Ich würde ungern mit Dateien auf der Festplatte arbeiten müssen.
bummi - Di 24.07.12 19:17
Du musst ja TGPBitmap nicht speichern, Du kannst es auch zu Malen verwenden.
Nur was Du Transparentes vom Desktop holen willst verstehe ich nicht, da ist ja schon alles rum ums Eck ...
Wenn Du eine Fenster dazu bekommst sich auf ein 32-Bittiges TGPImage oder auch ein entsprechend manipuliertes TBitmap (32 - Bit) mit geleertem Alphakanal, zu malen, statt auf den Desktop, dann hast Du IMHO das was Du wirklich suchst.
Aber wie gesagt, es kann gut sein dass ich Dich missverstanden habe.
Nano-Ware - Di 24.07.12 19:26
Ich will nichts Transparentes vom Desktop holen, sondern was Transparentes in das Objekt malen, wenn der Screenshot drinnen ist. Ich stell die Frage mal neu:
Wie erstelle ich einen Screenshot und speichere diesen in eine/m/r TGPImage/TGPBitmap? (Ohne Zwischenspeichern)
bummi - Di 24.07.12 22:11
eigentlich wollte ich, das woran ich doch einige Zeit geschwitzt habe nicht so einfach ... aber ..
Den Screenshot auf eine normales Bitmap bekommst Du sicher hin ...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| 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;
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; |
ich verwende es eigentlich immer für Sachen wie das
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| 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; |
Nano-Ware - Mi 25.07.12 00:26
Erstmal vielen Dank, ich versteh davon erstmal nicht so viel und schau es mir morgen an. Aber warum kann man das denn nicht einfach machen? Ohne Umwege über eine herkömmlicht Bitmap?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!