Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Image aus der DB "resizen" und ins ClipBoard kopieren (https://www.delphipraxis.net/99759-image-aus-der-db-resizen-und-ins-clipboard-kopieren.html)

Reinhardtinho 17. Sep 2007 13:39


Image aus der DB "resizen" und ins ClipBoard kopie
 
Hallo zusammen,

ich habe hier ein Bild in einem Image-Feld vom Typ TJvDBImage und möchte diee nun mit einer einheitlichen Größe (Maximale Breite - Maximale Höhe) nach Excel bringen (über Zwischenablage).

Mein Problem ist es, das Image in der Größe so zu ändern, dass ich die neue Größe in die Zwischenablage bekomme und nicht die Originalgröße.

Seit ihr bereit euer Wissen mit mir zu teilen?

Vielen Dank

MFG
Lorenz


[Edit]Rechtschreibung[/Edit]

mkinzler 17. Sep 2007 16:38

Re: Image aus der DB "resizen" und ins ClipBoard k
 
Kopiere es skaliert in eine anderes Bitmap und exportiere dieses in die Zwischenablage

Reinhardtinho 18. Sep 2007 13:47

Re: Image aus der DB "resizen" und ins ClipBoard k
 
Meinst du etwa so mit "kopieren":

Delphi-Quellcode:
   
Image1.Width := 100;
Image1.Height := 100;

Bitmap       := TBitmap.Create;

try
  Bitmap.Width := Image1.Width;
  Bitmap.Height := Image1.Height;

  Bitmap := Image1.Picture.Bitmap;
finally
  Bitmap.Free;
end;
oder habe ich dich da falsch verstanden?

MFG
Lorenz

Reinhardtinho 20. Sep 2007 10:54

Re: Image aus der DB "resizen" und ins ClipBoard k
 
*push*

Hallo zusammen,

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Bitmap : TBitmap;
begin
  Image1.Width := 10;
  Image1.Height := 10;

  Bitmap       := TBitmap.Create;

  try
    Bitmap.Width := Image1.Width;
    Bitmap.Height := Image1.Height;

    Bitmap := Image1.Picture.Bitmap;

    Bitmap.SaveToFile('C:\Dokumente und Einstellungen\Lorenz.Reinhardt\Desktop\Bild.bmp');
  finally
    Bitmap.Free;
  end;
end;
Hiermit habe ich mal das Bild abgespeichert, aber die Größe ist gleich geblieben.

War das mit "Kopieren" gemeint oder habe ich es falsch umgesetzt?

Vielen Dank.

MFG
Lorenz

stahli 20. Sep 2007 11:52

Re: Image aus der DB "resizen" und ins ClipBoard k
 
Hallo Reinhardtinho,

(habe gerade kein Delphi zur Hand, daher nur etwas pauschaler...)

ich habe mal eine etwas umständliche Lösung für einen BILDAUSSCHNITT genutzt. Wenn Du nichts besseres findest, kannst Du es vielleicht so versuchen:

ImageOrginal
...beinhaltet das originale Bild

ImageTmp
...ist auf die Zielgröße eigestellt
...Stretch und Proportional auf Ein
...das Bild (oder bei mir Bildausschnitt) von ImageOriginal dort hineinkopieren
(das Bild wird nun korrekt dargestellt, die tatsächliche Bildgröße kann aber noch abweichen)

ImageNeu
...ist auf die Zielgröße eigestellt
...Picture-Größe ebenfalls auf die Zielgröße einstellen
...Stretch und Proportional auf Aus
...ImageTmp.Canvas dem ImageNeu.Canvas zuweisen
(das Bild wird nun korrekt dargestellt und hat auch die richtige Größe)
...Bild in Zwischenablage kopieren...

Wie gesagt, wenn Du nichts besseres findest sollte das so sicher funktionieren (wenn auch nicht sonderlich elegant).

Stahli

mkinzler 20. Sep 2007 12:08

Re: Image aus der DB "resizen" und ins ClipBoard k
 
Du kopierst das Bild auch 1:1. Schau dir mal .Canvas.StretchDraw() an

Reinhardtinho 20. Sep 2007 12:32

Re: Image aus der DB "resizen" und ins ClipBoard k
 
Super, das mit dem Canvas.StretchDraw() klappt nun wunderbar.

Nun noch etwas, ich habe das jetzt für ein Bitmap gemacht, in der Datenbank können (bzw. werden) die Bilder von unterschiedlichen Typen sein (*.bmp; *.jpg; *.jpeg).

Nun habe ich in einer Testanwendung mal ein Bild vom Typ *.jpg geladen und verkleinert abgespeichert, allerdings ist das Resultat eine weiße Fläche (mit richtiger Größe).

Was muss ich noch ändern, dass auch Jpg-Bilder verkleinert werden können?

Delphi-Quellcode:
  Bitmap := TBitmap.Create;

  try
    Bitmap.Width := 100;
    Bitmap.Height := 100;

    Bitmap.Canvas.StretchDraw(Rect(0,0,100,100), Image1.Picture.Bitmap);

    Bitmap.SaveToFile('C:\Dokumente und Einstellungen\Lorenz.Reinhardt\Desktop\Bild.bmp');
  finally
    Bitmap.Free;
  end;

Vielen Dank!

MFG
Lorenz

Reinhardtinho 20. Sep 2007 15:26

Re: Image aus der DB "resizen" und ins ClipBoard k
 
Nach ein bisschen Suchen habe ich die Prozedur Assign gefunden und somit ist das Problem gelöst.
Vielen Dank an alle die geholfen haben. :dp: :thumb:

Hier noch schnell meine Lösung:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Bitmap1, Bitmap2 : TBitmap;
  AFormat : Word;
  AData   : THandle;
  APalette : HPALETTE;
begin
  Bitmap1 := TBitmap.Create;
  Bitmap2 := TBitmap.Create;

  try
    Bitmap1.Width := 100;
    Bitmap1.Height := 100;

    Bitmap2.Assign(Image1.Picture.Graphic);
    Bitmap1.Canvas.StretchDraw(Rect(0,0,100,100), Bitmap2);

    Bitmap1.SaveToClipboardFormat(AFormat, AData, APalette);
    ClipBoard.SetAsHandle(AFormat, AData);
  finally
    Bitmap1.Free;
    Bitmap2.Free;
  end;
end;
MFG
Lorenz


*** GELÖST ***


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 Uhr.

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