Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Einen bestimmten Bereich des Bildschirm speichern (https://www.delphipraxis.net/84356-einen-bestimmten-bereich-des-bildschirm-speichern.html)

LingNeu 15. Jan 2007 22:49


Einen bestimmten Bereich des Bildschirm speichern
 
Hallo Delphifreunde,
habe im Forum einen interessanten Code für das Speichern der eigenen Form gefunden. Stammt von Martin K unter dem Artikel

http://www.delphipraxis.net/internal...ght=screenshot

Kann man das auch so machen, das nur ein bestimmter, einstellbarer Bereich auf der Form abfotografiert werden kann. Also mit dem angegebenen Code habe ich das nicht geschafft. Sobald ich an den angegebenen Parametern was verändere wird zwar das Bild verschoben, dann erscheint aber an dieser Stelle eine weiße Fläche.
Ich hänge diesen Code mal hier rein ...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var BMP: TBitmap;
//Original stammt von Martin K !
begin
  BMP := TBitmap.Create;
  try
    BMP.Width := ClientWidth;
    BMP.Height := ClientHeight;
    BMP.Canvas.CopyRect(Rect(0, 0, BMP.Width, BMP.Height), Canvas, Rect(0, 0, ClientWidth, ClientHeight));
    BMP.SaveToFile('C:\test.bmp');
  finally
    BMP.Free;
  end;
end;
Vielleicht kann mir jemand einen Tipp geben.
Vielen Dank
LingNeu

Luckie 15. Jan 2007 23:55

Re: Einen bestimmten Bereich des Bildschirm speichern
 
Guck dir doch mal an, was der letzte Parameter von Hier im Forum suchenCopyRect macht.

Muetze1 15. Jan 2007 23:55

Re: Einen bestimmten Bereich des Bildschirm speichern
 
1. Bitmap bei einem kleineren Ausschnitt auch entsprechend kleiner anlegen.
2. Bei der Quellangabe Left und Top des Rechtecks auf die Left und Top des Ausschnittes setzen.
3. Das Zielrechteck auf dem Bitmap natürlich bei Left und Top von 0 belassen und die Zielbreite und Zielhöhe ist die Breite und Höhe des Bitmaps (siehe 1.)

Ich denke mit den Tipps sollte man das hinbekommen.

LingNeu 16. Jan 2007 07:22

Re: Einen bestimmten Bereich des Bildschirm speichern
 
@muetze1, danke für deinen Hinweis.
@luckie
laut Beschreibung ist das die Quelle, oder ??? Ich blick da nicht mehr durch, weil lt. Hinweis copyrect(rechteck,canvas,source). Die Quelle müsste aber der erste Parameter sein.

Ich habe auf der Form einen Button1, den ich abfotografieren möchte. Irgendwas stimmt nicht. Das Bild wird um 180Grad versetzt abfotografiert - obwohl ich nichts getrunken habe :wall:
Da krieg ich doch den Vogel :corky:

button1.top := 20
button1.left := 10
button1.width := 75
button1.height := 25

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var BMP: TBitmap;
begin
  BMP := TBitmap.Create;
  try
    //BMP.Width := ClientWidth;
    //BMP.Height := ClientHeight;
    BMP.Width := 75;
    BMP.Height := 25;
    BMP.Canvas.CopyRect(Rect(0, 0, 75, 25), Canvas, Rect(0, 0, 75, 25));
    BMP.SaveToFile('C:\test.bmp');
  finally
    BMP.Free;
  end;
end;

marabu 16. Jan 2007 08:23

Re: Einen bestimmten Bereich des Bildschirm speichern
 
Hallo,

wenn du tatsächlich nur einen Button (oder ein anderes Control) abfotografieren möchtest, dann kannst du auch so vorgehen:

Delphi-Quellcode:
function BitmapFromWinControl(wc: TWinControl): TBitmap;
begin
  Result := TBitmap.Create;
  Result.Height := wc.ClientHeight;
  Result.Width := wc.ClientWidth;
  wc.PaintTo(Result.Canvas, 0, 0);
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  with BitmapFromWinControl(Sender as TButton) do
  begin
    SaveToFile((Sender as TComponent).Name + '.bmp');
    Free;
  end;
end;
Grüße vom marabu

LingNeu 16. Jan 2007 10:39

Re: Einen bestimmten Bereich des Bildschirm speichern
 
@marabu
danke dir für Deine Hilfe.
Der Code von dir funktioniert zwar hervorragend, leider kann ich eben nur den gedrückten Button abfotografieren. Ich wollte aber einen beliebigen Ausschnitt auf der Form haben (linke untere Ecke, Breite, Höhe).
Ich bin auch noch am experimentieren.

ciao
LingNeu

Luckie 16. Jan 2007 10:42

Re: Einen bestimmten Bereich des Bildschirm speichern
 
Zitat:

Zitat von LingNeu
@luckie
laut Beschreibung ist das die Quelle, oder ??? Ich blick da nicht mehr durch, weil lt. Hinweis copyrect(rechteck,canvas,source). Die Quelle müsste aber der erste Parameter sein.

Na dann ist eben der erste Parameter die Quelle.

marabu 16. Jan 2007 11:12

Re: Einen bestimmten Bereich des Bildschirm speichern
 
So könnte es funktionieren:

Delphi-Quellcode:
function BitmapFromBitmap(bm: TBitmap; r: TRect): TBitmap;
begin
  Result := TBitmap.Create;
  Result.Height := Succ(r.Bottom - r.Top);
  Result.Width := Succ(r.Right - r.Left);
  with Result.Canvas do
    CopyRect(ClipRect, bm.Canvas, r);
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  bm: TBitmap;
  r: TRect;
begin
  bm := BitmapFromWinControl(self);
  r := ClientRect;
  InflateRect(r, - bm.Height div 4, - bm.Width div 4);
  with BitmapFromBitmap(bm, r) do
  begin
    SaveToFile('Demo.bmp');
    Free;
  end;
  bm.Free;
end;
Freundliche Grüße

LingNeu 16. Jan 2007 12:26

Re: Einen bestimmten Bereich des Bildschirm speichern
 
@marabu
danke für Deine Mühe.
Der Code funktioniert einwandfrei. Ich bekomme ein Bild in der Grösse 225 x 41 Pixel.
Kannst Du mir noch sagen, welche Parameter für diese Grösse zuständig sind. Ich hab schon rumprobiert, finde aber nicht die Einstellung dafür.
Meine Form hat die Clientgrösse: 202 x 324
Wenn ich was an den Parametern ändere bekomme ich zwar einen kleineren BS-Inhalt, aber trotzdem ist die BMP von der Fläche grösser.

merci vielmals
LingNeu

marabu 16. Jan 2007 12:44

Re: Einen bestimmten Bereich des Bildschirm speichern
 
Die beiden Funktionen kannst du nicht meinen. Mein Aufruf-Beispiel erzeugt ein Bitmap vom ClientRect des Formulars und mit InflateRect() lege ich einen Ausschnitt fest, indem ich alle Ränder um ein Viertel des Originalmaßes nach innen drücke. Das ist ein rein theoretisches Beispiel. Du wirst andere Anhaltspunkte haben um das Rechteck für BitmapFromBitmap() zu definieren. Wie du von einem ClientRect von 202 * 324 auf ein Teilbild mit 225 * 41 gekommen bist kann ich nicht nachvollziehen. Kannst du deinen Aufruf zeigen? Evtl. noch eine Bildbeschreibung und eine Beschreibung des Ausschnitts, den du extrahieren möchtest?

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz