Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bmp verkleinern (https://www.delphipraxis.net/107650-bmp-verkleinern.html)

BigBen 31. Jan 2008 07:16


Bmp verkleinern
 
Hallo mal wieder,

ich schieße mit meinem Programm einen Ausschnitt (Werte kommen aus .txt - File) des Bildschirms und speichere ihn als bmp. Jetzt ist aber das Bild zu groß und ich will es nach dem Screenshot meinetwegen um 50% (soll auch im .txt - File stehen) kleiner machen und dann als ScreenShot.bmp speichern. Ich hab schon etliches Ausprobiert, aber irgendwie bin ich halt noch nicht so weit mit Delphi...

Delphi-Quellcode:
var
  DCDesk: HDC;
  bmp: TBitmap;
  datei: TextFile;
  j: integer;
  dateien: array[0..9] of Integer;
begin
  j:=0;
  assignfile(datei,'koordinaten.txt');
  reset(datei);
  while not eof(datei) do
    begin
        Readln(datei, dateien[j]);
        j:=j+1;
    end;

  // width =       dateien[0]
  // height =      dateien[1]
  // von Oben =    dateien[2]
  // von Links =   dateien[3]
  // width Klein = dateien[4] oder % - Angabe
  // height Klein = dateien[5]

  closefile(datei);

  bmp := TBitmap.Create;
  bmp.Width := dateien[0];
  bmp.Height := dateien[1];

  DCDesk := GetWindowDC(GetDesktopWindow);

  BitBlt(bmp.Canvas.Handle, 0, 0, dateien[0], dateien[1],
         DCDesk, dateien[2], dateien[3], SRCCOPY);

  bmp.SaveToFile('ScreenShot.bmp');
  ReleaseDC(GetDesktopWindow, DCDesk);
  bmp.Free;
end.

Matze 31. Jan 2008 07:44

Re: Bmp verkleinern
 
Hallo,

hier ein Beispiel für die Umsetzung mit der Prozentangabe. Dazu habe ich in dem beispiel ein 2. Bitmap eingeführt.
Die Resourcenschutzblöcke (try-finally) solltest du bei dir ebenfalls ergänzen, wie in folgendem Code zu sehen ist.

Delphi-Quellcode:
var
  // ...
  bmp, bmp_small: TBitmap;
  // ...
begin
  // ...

  bmp := TBitmap.Create;
  try
    bmp.Width := dateien[0];
    bmp.Height := dateien[1];

    DCDesk := GetWindowDC(GetDesktopWindow);

    BitBlt(bmp.Canvas.Handle, 0, 0, dateien[0], dateien[1],
           DCDesk, dateien[2], dateien[3], SRCCOPY);

    bmp.SaveToFile('ScreenShot.bmp');

    // ab hier ist es neu
    bmp_small := TBitMap.Create;
    try
      bmp_small.Height := round(dateien[4] * dateien[1] / 100);
      bmp_small.Width := round(dateien[4] * dateien[0] / 100);
      bmp_small.Canvas.StretchDraw(Rect(0, 0, bmp_small.Width, bmp_small.Height), bmp);

      bmp_small.SaveToFile('ScreenShot_small.bmp');
    finally
      FreeAndNil(bmp_small);
    end;
    ReleaseDC(GetDesktopWindow, DCDesk);
  finally
    FreeAndNil(bmp);
  end;
end;
Grüße

BigBen 31. Jan 2008 07:58

Re: Bmp verkleinern
 
Danke, funktioniert super. Hab selbst noch n bischen rumgespielt und folgendes haut auch hin:

Delphi-Quellcode:
  bmp := TBitmap.Create;
  bmp.Width := dateien[0];
  bmp.Height := dateien[1];

  bmp1 := TBitmap.Create;
  bmp1.Width := dateien[4];
  bmp1.Height := dateien[5];

  DCDesk := GetWindowDC(GetDesktopWindow);

  BitBlt(bmp.Canvas.Handle, 0, 0, dateien[0], dateien[1],
         DCDesk, dateien[2], dateien[3], SRCCOPY);

  bmp1.Canvas.StretchDraw(Rect(0,0,dateien[4], dateien[5]), bmp);

  bmp1.SaveToFile('ScreenShot.bmp');

  ReleaseDC(GetDesktopWindow, DCDesk);
  bmp.Free;
  bmp1.Free;
Hier muss man halt beachten die Größenangaben des Textfiles proportional zu berechnen, sonst verzerrt das Ganze.

:coder2:

Matze 31. Jan 2008 08:01

Re: Bmp verkleinern
 
Denke dennoch an folgendes:

Zitat:

Zitat von Matze
Die Resourcenschutzblöcke (try-finally) solltest du bei dir ebenfalls ergänzen [...]

Falls im try-Block ein Fehler auftreten sollte, wird dann der Speicher im Normalfall trotzdem freigegeben, was bei deinem Code nicht der Fall wäre. ;)

BigBen 31. Jan 2008 08:03

Re: Bmp verkleinern
 
Jawohl, werd ich in Zukunft beachten.
Danke für deine schnelle Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 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