AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [gelöst] Bild vergrößern mit StretchBlt

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

Ein Thema von Schwedenbitter · begonnen am 1. Apr 2009 · letzter Beitrag vom 2. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2   
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

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

  Alt 1. Apr 2009, 20:57
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
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Bild vergrößern mit StretchBlt

  Alt 1. Apr 2009, 21:07
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???
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Bild vergrößern mit StretchBlt

  Alt 1. Apr 2009, 22:04
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.
Alex Winzer
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Bild vergrößern mit StretchBlt

  Alt 1. Apr 2009, 23:39
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
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Bild vergrößern mit StretchBlt

  Alt 2. Apr 2009, 09:42
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
Angehängte Dateien
Dateityp: zip scanner-test_p_157.zip (322,9 KB, 8x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

Re: Bild vergrößern mit StretchBlt

  Alt 2. Apr 2009, 10:57
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
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: Bild vergrößern mit StretchBlt

  Alt 2. Apr 2009, 11:03
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Bild vergrößern mit StretchBlt

  Alt 2. Apr 2009, 11:08
Zitat von Schwedenbitter:
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 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
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Bild vergrößern mit StretchBlt

  Alt 2. Apr 2009, 11:26
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

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...

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
Alex Winzer
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

Re: Bild vergrößern mit StretchBlt

  Alt 2. Apr 2009, 11:39
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
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 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