Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [gelöst] Bild vergrößern mit StretchBlt (https://www.delphipraxis.net/131866-%5Bgeloest%5D-bild-vergroessern-mit-stretchblt.html)

Schwedenbitter 2. Apr 2009 10:43

Re: Bild vergrößern mit StretchBlt
 
Zitat:

Zitat von EWeiss
EDIT:
Verstehe auch nicht warum du von Image1 ausgehst
Hier solltest du das Originale Bitmap verwenden oder willst du das
320xXXX Bitmap abspeichern ?
Das ist dann aber sehr verpixelt.

Denke Image1 ist ein als Vorschaubild gedacht oder?

Die Antworten haben sich alle überschnitten:

Ja, das soll nur zur Vorschau sein. Ich habe - zu Testzwecken - meinen Code geändert. Entschuldigung falls es noch nicht in meinem Paket so war. Es sieht jetzt so aus:
Delphi-Quellcode:
Procedure TForm1.Button5Click(Sender: TObject);
Var
   H,B         : Integer;
   help,Org      : TImage;
Begin
   help:=TImage.Create(self);
   Org:=TIMage.Create(self);
   Try
      Org.Picture.LoadFromFile(OpenDialog1.FileName);
      SetStretchBltMode(help.Canvas.Handle,HALFTONE);
      B:=Org.Picture.Width;
      H:=Org.Picture.Height;
      ShowMessage(FormatFloat('#,##0',B)+'x'+FormatFloat('#,##0',H));
      If H>B Then
      Begin
         help.Picture.Graphic.Width:=1660;
         help.Picture.Graphic.Height:=2340;
         StretchBlt(help.Canvas.Handle,   // Ziel
                    0,0,1660,2340,         // Ziel Ausmaße
                    Org.Canvas.Handle,      // Quelle
                    0,0,B,H,               // Ausmaße Quelle
                    SRCCOPY)
      End
      Else
      Begin
         help.Picture.Graphic.Width:=2340;
         help.Picture.Graphic.Height:=1660;
         StretchBlt(help.Canvas.Handle,   // Ziel
                    0,0,2340,1660,         // Ziel Ausmaße
                    Org.Canvas.Handle,      // Quelle
                    0,0,H,B,               // Ausmaße Quelle
                    SRCCOPY);
      End;
      help.Picture.Bitmap.SaveToFile(OpenDialog1.FileName+'_neu.bmp');
   Finally
      help.Free;
      Org.Free;
   End;
End;
Das verpixelte Aussehen ist nur jetzt so und mir egal. Habe kein anderes Testbild gefunden. Mein Fernziel ist es, ein Programm zu schreiben, dass mir Bilder von Scannern besorgt (einer kann z.B. nur 300 oder 600 dpi) , diese auf DINA4 bei exakt 200 dpi zuschneidet (ich will es einheitlich für ein schon fertiges Archivprogramm) und ggf. noch dreht.

Gruß, Alex

EWeiss 2. Apr 2009 10:51

Re: Bild vergrößern mit StretchBlt
 
Liste der Anhänge anzeigen (Anzahl: 2)
nö da hat sich nichts überschnitten ..

Hier ein Bild.. denke so soll es sein oder ?
Delphi-Quellcode:
Procedure TForm1.Button6Click(Sender: TObject);
var
tmpImage : TImage;

Begin
  tmpImage := TImage.create(self);

   If OpenDialog1.Execute Then
   Begin
    tmpImage.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName);
    StretchBlt(Image1.Canvas.Handle,    // Ziel
      0,0,Image1.Width,Image1.Height, // Ziel Ausmaße
      tmpImage.Canvas.Handle,            // Quelle
      0,0,tmpImage.Picture.Bitmap.Width,tmpImage.Picture.Bitmap.Height,   // Ausmaße Quelle
      SRCCOPY);

      Button3.Enabled:=True;
      Button4.Enabled:=True;
      Button5.Enabled:=True;
   End;
End;
gruss Emil

EWeiss 2. Apr 2009 11:14

Re: Bild vergrößern mit StretchBlt
 
Wenn du immer noch nicht klar kommst hier das ergebnis

Nur unteren Bereich geändert!

Delphi-Quellcode:
Procedure TForm1.Button5Click(Sender: TObject);
Var
   H,B        : Integer;
   help,Org     : TImage;
Begin
   help:=TImage.Create(self);
   Org:=TIMage.Create(self);
   Try
      Org.Picture.LoadFromFile(OpenDialog1.FileName);
      SetStretchBltMode(help.Canvas.Handle,HALFTONE);
      B:=Org.Picture.Width;
      H:=Org.Picture.Height;
      ShowMessage(FormatFloat('#,##0',B)+'x'+FormatFloat('#,##0',H));
      If H>B Then
      Begin
         help.Picture.Graphic.Width:=1660;
         help.Picture.Graphic.Height:=2340;
         StretchBlt(help.Canvas.Handle,  // Ziel
                    0,0,1660,2340,        // Ziel Ausmaße
                    Org.Canvas.Handle,     // Quelle
                    0,0,B,H,              // Ausmaße Quelle
                    SRCCOPY)
      End
      Else
      //>>>>>>>>>< geändert
      Begin
         help.Picture.Graphic.Width:=2340;
         help.Picture.Graphic.Height:=1660;
              StretchBlt(help.Canvas.Handle,            // Ziel
                    0,0,help.Picture.Graphic.Width,help.Picture.Graphic.Height, // Ziel Ausmaße
                    Org.Canvas.Handle,            // Quelle
                    0,0,Org.Picture.Bitmap.Width,Org.Picture.Bitmap.Height,               // Ausmaße Quelle
                    SRCCOPY);
      End;
      // >>>>>>>>>>>> end geändert
      help.Picture.Bitmap.SaveToFile(OpenDialog1.FileName+'_neu.bmp');
   Finally
      help.Free;
      Org.Free;
   End;
End;

Procedure TForm1.Button6Click(Sender: TObject);
Begin
   If OpenDialog1.Execute Then
   Begin
      Image1.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName);
      Button3.Enabled:=True;
      Button4.Enabled:=True;
      Button5.Enabled:=True;
   End;
End;
gruss Emil

Schwedenbitter 2. Apr 2009 11:23

Re: Bild vergrößern mit StretchBlt
 
Zitat:

Zitat von EWeiss
Hier ein Bild.. denke so soll es sein oder ?

Nein, leider nicht. Das Image1 ist zweitrangig. Ich will nicht das Bild im Programm ausgeben. Das macht doch TImage allein passend, wenn man die Eigenschaften richtig setzt.

Ich möchte:
1. Bild laden (egal welche Größe)
2. vergrößern oder verkleinern auf 1660x2340 (= DINA4 bei 200 dpi)
3. DINA4-Bild abspeichern

Und so klappt es jetzt endlich, auch wenn Du erster warst:
Delphi-Quellcode:
Procedure TForm1.Button5Click(Sender: TObject);
Var
   H,B         : Integer;
   Quelle,Ziel   : TImage;
Begin
   If OpenDialog1.Execute Then
   Begin
      Quelle:=TImage.Create(self);
      Ziel:=TImage.Create(self);
      Try
         Quelle.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName);
         B:=Quelle.Picture.Bitmap.Width;
         H:=Quelle.Picture.Bitmap.Height;
         If H>B Then
         Begin
            Ziel.Width:=1660;
            Ziel.Height:=2340;
            StretchBlt(Ziel.Canvas.Handle,   // Ziel
                       0,0,1660,2340,         // Ziel Ausmaße
                       Quelle.Canvas.Handle,   // Quelle
                       0,0,B,H,               // Ausmaße Quelle
                       SRCCOPY)
         End
         Else
            Ziel.Width:=2340;
            Ziel.Height:=1660;
            StretchBlt(Ziel.Canvas.Handle,   // Ziel
                       0,0,2340,1660,         // Ziel Ausmaße
                       Quelle.Canvas.Handle,   // Quelle
                       0,0,B,H,               // Ausmaße Quelle
                       SRCCOPY);
         Ziel.Picture.Bitmap.SaveToFile(OpenDialog1.FileName+'_neu.bmp');
      Finally
         Quelle.Free;
         Ziel.Free;
      End;
   End;
End;
Danke an alle, die so aktiv mitgedacht haben!!!

EWeiss 2. Apr 2009 11:25

Re: [gelöst] Bild vergrößern mit StretchBlt
 
Zitat:

Und so klappt es jetzt endlich, auch wenn Du erster warst:
hmmm...
Das erste war nur ein Beispiel um zu zeigen was du falsch gemacht hast.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 Uhr.
Seite 2 von 2     12   

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