![]() |
[gelöst] Bild vergrößern mit StretchBlt
Hallo,
ich weiß: Das Thema wurde schon mehrfach behandelt (z.B. ![]()
Delphi-Quellcode:
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.
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; Was mache ich da verkehrt? Gruß und Dank, Alex |
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???
|
Re: Bild vergrößern mit StretchBlt
Zitat:
Delphi-Quellcode:
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.
help.Width:=1660;
help.Height:=2340; |
Re: Bild vergrößern mit StretchBlt
Zitat:
nach einigem chaotischen Herumprobieren habe ich jetzt diesen Code zum Laufen gebracht:
Delphi-Quellcode:
ist sicher optimierbar, aber ich bin ja selbst kein profi :)
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; |
Re: Bild vergrößern mit StretchBlt
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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 |
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 |
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 |
Re: Bild vergrößern mit StretchBlt
Zitat:
aber ich denke Xaromz hat recht, ich würde auch zu nem TBitmap tendieren. Zitat:
|
Re: Bild vergrößern mit StretchBlt
Zitat:
Zitat:
Zitat:
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 |
Re: Bild vergrößern mit StretchBlt
Zitat:
Du lädst ein Bild ein mit
Delphi-Quellcode:
Und übergibst das Image1 dann erwartes du das Image1 das Bild für dich den ausmaßen anpasst.
Image1.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName);
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 02:40 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