Delphi-PRAXiS
Seite 1 von 2  1 2      

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 1. Apr 2009 19:57


[gelöst] Bild vergrößern mit StretchBlt
 
Hallo,

ich weiß: Das Thema wurde schon mehrfach behandelt (z.B. hier). Ich habe aber keine Lösung für mich gefunden. Wohl auch, weil dieser Code nicht funktioniert:
Delphi-Quellcode:
Procedure TForm1.Button5Click(Sender: TObject);
Var
   help         : TImage;
Begin
   Try
      help:=TImage.Create(nil);
      SetStretchBltMode(help.Canvas.Handle,HALFTONE);
      If Image1.Picture.Height>Image1.Picture.Width Then
         StretchBlt(help.Canvas.Handle,   // Ziel
                    0,0,1660,2340,         // Ziel Ausmaße
                    Image1.Canvas.Handle,                              // Quelle
                    0,0,Image1.Picture.Width,Image1.Picture.Height,   // Ausmaße Quelle
                    SRCCOPY)
      Else
         ShowMessage('Querformat');
         StretchBlt(help.Canvas.Handle,   // Ziel
                    0,0,2340,1660,         // Ziel Ausmaße
                    Image1.Canvas.Handle,                              // Quelle
                    0,0,Image1.Picture.Height,Image1.Picture.Width,   // Ausmaße Quelle
                    SRCCOPY);
   Finally
      help.Free;
   End;
End;
Ein Bild ist in Image1 enthalten. Die Werte für die Größe habe ich mir ausgeben lassen; die passen. Als Ergebnis bekomme ich trotzdem immer nur ein weißes Bild in der Auflösung 105x105.
Was mache ich da verkehrt?

Gruß und Dank, Alex

alleinherrscher 1. Apr 2009 20:07

Re: Bild vergrößern mit StretchBlt
 
Bin mir nicht 100 pro sicher, aber solltest du dem neu erstellen help-Image bzw. dessen Canvas nicht erst einmal eine größe eingeben, bevor du da ein Bild reinkopierst???

Schwedenbitter 1. Apr 2009 21:04

Re: Bild vergrößern mit StretchBlt
 
Zitat:

Zitat von alleinherrscher
Bin mir nicht 100 pro sicher, aber solltest du dem neu erstellen help-Image bzw. dessen Canvas nicht erst einmal eine größe eingeben, bevor du da ein Bild reinkopierst???

Also jeweils
Delphi-Quellcode:
help.Width:=1660;
help.Height:=2340;
klappt nicht und dem Canvas kann ich jedenfalls keine Höhe und Breite mitgeben. Das würde auch nicht das Phänomen erklären, dass das Ergebnis immerhin nicht 0x0, sondern 150x150 Pixel groß ist.

Nelphin 1. Apr 2009 22:39

Re: Bild vergrößern mit StretchBlt
 
Zitat:

Zitat von Schwedenbitter
Was mache ich da verkehrt?

Gruß und Dank, Alex





nach einigem chaotischen Herumprobieren habe ich jetzt diesen Code zum Laufen gebracht:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

Var
   help        : TImage;

Begin
help:=TImage.Create(self);
help.Picture.assign(image1.picture);

   Try

      SetStretchBltMode(help.Canvas.Handle,HALFTONE);
      If Image1.Picture.Height>Image1.Picture.Width Then
      begin
         help.picture.graphic.Width:=1660;help.picture.graphic.height:=2340;
         ShowMessage('Hochformat');
         StretchBlt(help.Canvas.Handle,  // Ziel
                    0,0,1660,2340,        // Ziel Ausmaße
                    Image1.Canvas.Handle,                             // Quelle
                    0,0,Image1.Picture.Width,Image1.Picture.Height,  // Ausmaße Quelle
                    SRCCOPY);
      end Else begin
         help.picture.graphic.Width:=2340;help.picture.graphic.height:=1660;
         ShowMessage('Querformat');
         StretchBlt(help.Canvas.Handle,  // Ziel
                    0,0,2340,1660,        // Ziel Ausmaße
                    Image1.canvas.handle,                             // Quelle
                    0,0,Image1.picture.Bitmap.height,Image1.picture.bitmap.Width,  // Ausmaße Quelle
                    cmsrccopy);
      End;
   Finally
   try
   image1.picture.assign(help.picture);
   image1.Width:=1000;
   image1.Height:=2340;
   finally
      help.Free;
   end;
   end;
End;
ist sicher optimierbar, aber ich bin ja selbst kein profi :)

Schwedenbitter 2. Apr 2009 08:42

Re: Bild vergrößern mit StretchBlt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Nelphin
nach einigem chaotischen Herumprobieren habe ich jetzt diesen Code zum Laufen gebracht: ...
ist sicher optimierbar, aber ich bin ja selbst kein profi :)

Das ist letztlich egal. Auf jeden Fall hast Du mich schon ein Stück weiter gebracht.

Das help.Picture.assign(image1.picture); in Zeile 8 ist überflüssig. Denn ich will das Bild ja mittels StretchBlt(...); kopieren. Schließlich würde ich noch das letzte Try ... Finally ... End; mit in die erste Fehlerbehandlung mit reinbauen. Denn das Bild brauche ich nicht zuzuweisen, wenn in der ersten Fehlerbehandlung ein Fehler aufgetreten ist.

Leider funktioniert das ganze noch nicht perfekt:
Wenn ich das Bild vergrößere/verkleinere, dann erhalte ich immer einen grauen Balken im unteren Teil. Das ist jedenfalls dann so, wenn das Ausgangsbild nicht exakt dasselbe Größenverhältnis von Breite und Höhe hat, wie das Ziel. Ich dachte, das sollte nicht auftreten.
Meine erste Idee war: Daran ist Image1 schuld, weil ich dort das Bild Proportional ausgebe. Aber ein Test mittels eines 2. Image, das die Bild-Datei "frisch" lädt, brachte dasselbe Ergebnis. Also kann es daran nicht liegen. Die Eigenschaft Proportional und Stretch etc. habe ich auch schon auf False gesetzt.

Was mache ich denn nun wieder verkehrt?

Ich habe mal mein Programm angehängt. Es muss zum Compilieren lediglich der Teil mit dem Scanner rausgenommen werden. Bei Bedarf schicke ich auch gern die Units für den Scanner mit...
Ich habe aber zu Testzwecken die exe mit reingepackt. Die funktioniert auch ohne Scanner!

Gruß, Alex

EWeiss 2. Apr 2009 09:57

Re: Bild vergrößern mit StretchBlt
 
Hallo
Erst mal solltest du nie TImage.Create
innerhalb eines Try Block setzen das hat zur folge das help nicht initialisiert wird.

2. wenn du das Bild einlädst und keinen Rahmen willst dann mußt du
die höhe und weite von Image1 dem eingeladenen Bild anpassen. (quasi um den scale factor)

3. wenn das bild nicht genau die ausmaße von image1 hat nicht den bereich
von 0,0 kopieren denn da ist Image1 nun mal grau.

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?

gruss Emil

xaromz 2. Apr 2009 10:03

Re: Bild vergrößern mit StretchBlt
 
Hallo,

ein Tipp noch: Wozu ein TImage, wenn Du ein TBitmap nehmen kannst? TImage ist ja nur zur Anzeige von Bildern gedacht, Du brauchst aber doch ein teporäres Bitmap.

Gruß
xaromz

Nelphin 2. Apr 2009 10:08

Re: Bild vergrößern mit StretchBlt
 
Zitat:

Zitat von Schwedenbitter
Zitat:

Zitat von Nelphin
nach einigem chaotischen Herumprobieren habe ich jetzt diesen Code zum Laufen gebracht: ...
ist sicher optimierbar, aber ich bin ja selbst kein profi :)

Das ist letztlich egal. Auf jeden Fall hast Du mich schon ein Stück weiter gebracht.

Das help.Picture.assign(image1.picture); in Zeile 8 ist überflüssig.

ja das dachte ich heute nacht auch, aber als ichs auskommentiert habe bekam ich ne access violation...

aber ich denke Xaromz hat recht, ich würde auch zu nem TBitmap tendieren.

Zitat:

Zitat von xaromz
Hallo,

ein Tipp noch: Wozu ein TImage, wenn Du ein TBitmap nehmen kannst? TImage ist ja nur zur Anzeige von Bildern gedacht, Du brauchst aber doch ein teporäres Bitmap.

Gruß
xaromz


Schwedenbitter 2. Apr 2009 10:26

Re: Bild vergrößern mit StretchBlt
 
Zitat:

Zitat von EWeiss
Erst mal solltest du nie TImage.Create
innerhalb eines Try Block setzen das hat zur folge das help nicht initialisiert wird.

Das verstehe ich zwar nicht. Aber ist wohl mein Fehler. Habe grad nochmal mein Delphi-Buch befragt und das macht das Create auch vor dem Try. Sei's drum :-D

Zitat:

Zitat von EWeiss
2. wenn du das Bild einlädst und keinen Rahmen willst dann mußt du
die höhe und weite von Image1 dem eingeladenen Bild anpassen. (quasi um den scale factor)

Klingt einleuchtend. Gegengfrage: Wozu gibt es dann die Eigenschaften Stretch etc. Ich bin immer davon ausgegangen, dass genau das dann automatisch passiert. Und wie passe ich die Höhe und Breite von Image1 dem eingeladenen Bild an? Das bedeutet doch, dass ich diese Werte vor dem Laden ermitteln muss. Denn eine Abfrage von Width und Height nach dem Laden dürfte nichts bringen, wenn sich das TIMage nicht selbst anpasst... :gruebel:

Zitat:

Zitat von EWeiss
3. wenn das bild nicht genau die ausmaße von image1 hat nicht den bereich
von 0,0 kopieren denn da ist Image1 nun mal grau.

Auch das ist nachvollziehbar. Etwas verstehe ich aber auch hier nicht:
Mein TImage im Formular ist exakt quadratisch. Mein Hilfs-TIMage ist unmittelbar nach dem Anlegen und Auslesen der Werte 0x0. Zumindest dieses müsste sich dann doch an die Bildgröße automatisch anpassen; sollte man jedenfalls annehmen.
Es kommt hinzu, dass mein Testbild im Querformat ist. Angezeigt wird es daher sowohl unten als auch oben mit grauem Rand. Warum ist der dann aber in meinem Ergebnis nur unten? Es kommt hinzu, dass das Ergebnis ja auch nicht etwas quadratisch wäre.

@xaromz
Das stimmt. Es ist nur ein Überbleibsel von StretchDraw, was mit TBitmap nicht will. Ich hatte das zunächst - erfolglos - probiert, weil ich den Ausführungen im Forum an anderer Stelle entnahm, dass beide dieselben Funktionen benutzen würden und ich StretchDraw schon - erfolgreich - benutze, um zu drucken.

Es tut mir Leid, wenn ich's idiotensicher brauche und dadurch nerve.

Gruß, Alex

EWeiss 2. Apr 2009 10:39

Re: Bild vergrößern mit StretchBlt
 
Zitat:

Klingt einleuchtend. Gegengfrage: Wozu gibt es dann die Eigenschaften Stretch etc. Ich bin immer davon ausgegangen, dass genau das dann automatisch passiert. Und wie passe ich die Höhe und Breite von Image1 dem eingeladenen Bild an? Das bedeutet doch, dass ich diese Werte vor dem Laden ermitteln muss. Denn eine Abfrage von Width und Height nach dem Laden dürfte nichts bringen, wenn sich das TIMage nicht selbst anpasst...
Das ist ganz einfach
Du lädst ein Bild ein mit
Delphi-Quellcode:
Image1.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName);
Und übergibst das Image1 dann erwartes du das Image1 das Bild für dich den ausmaßen anpasst.
Und genau hier liegt der Fehler das geht nicht.
Du mußt das Bild bevor du es Image1 übergibst schon gestretcht haben.

gruss Emil


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