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);
                                                                           // oder ein beliebiges anderes Format  
    dest:=TGPBitmap.Create(MulitFrameImage.GetWidth,MulitFrameImage.GetHeight,PixelFormat16bppRGB565);
    g := TGPGraphics.Create(dest);
    try
// Tu das was Du mit dem Bild machen willst

    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:
// 2011 by Thomas Wassermann
    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?