Bildgröße verändern

Für Fragen von Einsteigern und Programmieranfängern...
hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Bildgröße verändern

Beitrag von hbr »

Hallo Forum,
Habe folgende Situation!

Ein Form mit 'TImage'(Stretch true) = Hintergrundbild mit Blumen.

Nun habe ich mehrere einzelne TImages(.gif) mit Blumen(90x90 Height,Width) die die gleiche Größe haben wie die auf dem Hintergrundbild(90x90 Height,Width).
Diese einzelnen Blumen verdecken die auf dem Hintergrundbild und verändern so das Aussehen.
Wenn ich die Form in der Größe verändere, bleiben die Blumen an der Stelle wo sie gesetzt wurden was auch OK ist.

Jetzt mein Problem:
Durch das vergrößern oder verkleinern, bekommen natürlich die Blumen vom Hintergrund eine andere Größe und die aufgesetzten Blumen passen dann nicht mehr zum Hintergrund.

Hat jemand schon so etwas realisiert, oder gibt es dafür eine Formel,
dass die aufgesetzten Blumen mit dem Hintergrund Proportional wachsen oder schrumpfen und die Position beibehalten wird?

Für eine Antwort wäre ich Dankbar.

Gruß
hbr

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bildgröße verändern

Beitrag von Michl »

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Bildgröße verändern

Beitrag von hbr »

Danke,
Nein, leider hielft mir das nicht weiter.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bildgröße verändern

Beitrag von Michl »

Also, Du musst bei OnPaint einfach die Größe prozentual mit anpassen zB.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1:=TImage.Create(Self);
  Image1.Picture.LoadFromFile('Bild.jpg');
  Image2:=TImage.Create(Self);
  Image2.Picture.LoadFromFile('Ball.gif');
end;
 
procedure TForm1.FormPaint(Sender: TObject);
var
  r1,r2:TRect;
begin
  //Hintergrundbild
 
  r1.Top:=0;
  r1.Left:=0;
  r1.Right:=Form1.Width;
  r1.Bottom:=Form1.Height;
 
  r2.Top:=0;
  r2.Left:=0;
  r2.Right:=Image1.Picture.Bitmap.Width;
  r2.Bottom:=Image1.Picture.Bitmap.Height;
 
  Form1.Canvas.CopyRect(r1,Image1.Picture.Bitmap.Canvas,r2);
 
  //Bild, was davor ist...
 
  r1.Left:=trunc(Form1.Width*0.6);
  r1.Top:=trunc(Form1.Height*0.4);
  r1.Right:=trunc(Form1.Width*0.7);
  r1.Bottom:=trunc(Form1.Height*0.5);
 
  r2.Top:=0;
  r2.Left:=0;
  r2.Right:=Image2.Picture.Bitmap.Width;
  r2.Bottom:=Image2.Picture.Bitmap.Height;
 
  Form1.Canvas.CopyRect(r1,Image2.Picture.Bitmap.Canvas,r2);
end; 
Neue x-Kooridnate (y-Koordinate analog) im Canvas errechnet sich wie folgt:

x_alt = alte x-Koordinate
width_alt = alte Form.Width
x_neu = neue x-Koordinate
width_neu = neue Form.Width

x_neu = width_neu / width_alt * x_alt


Habe mal schnell ein Bsp. (In diesem Fall bleibt der davor gezeichnete Ball immer an der gleichen Stelle im Bild, egal wie man die Form verändert) angefügt. Falls dies Dein Problem war?! Ansonsten bitte genauer beschreiben


Alternativ könntest Du im Speicher alle Änderungen vornehmen (z.B. bei einem TImage) und dann immer nur dieses auf die angepasste Form "gestretcht" kopieren. So umgeht man bei schnellen Laden von Grafiken den sonst möglichen Flimmern!


Grüße
Dateianhänge
Projekt.ZIP
(232.27 KiB) 107-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Bildgröße verändern

Beitrag von hbr »

Super, Danke.
Das Ergebnis ist so wie ich es brauche.

Nur geschieht das alles während der Laufzeit.
Bei Deinem Beispiel sehe ich ja nicht an welcher Position genau auf dem Bild (Ball) gesetzt ist.

Beim Entwurf, müssen meine Blumen ja Pixelgenau Positioniert werden.
Wie macht man das denn, wenn man nix sieht ?

Ich habe ein Hintergrundbild und ca. 25 weitere Blumen(Bälle) die ich pixelgenau über das Hintergrundbild(Original Ball) an verschiedene Feste Punkte legen muss.
Z.B. 'Bild1 + Bild11 + Bild14 nach Left:20, Top:40', 'Bild2 + Bild8 nach Left:77, Top:150' usw.
Diese werden bei bestimmten Aktionen ein beziehungsweise ausgeschaltet, also treten in den Vordergrung.

Hier braucht man dann 26 TRect.
Wie ist dann der Aufruf für Canvas (Verschachtelung)?

Gruß
hbr

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bildgröße verändern

Beitrag von Michl »

Wie oben geschrieben!

Neue x-Kooridnate (y-Koordinate analog) im Canvas errechnet sich wie folgt:

x_alt = alte x-Koordinate
width_alt = alte Form.Width
x_neu = neue x-Koordinate
width_neu = neue Form.Width

x_neu = width_neu / width_alt * x_alt
Hier braucht man dann 26 TRect.
Ja. Einfach alle Positionen speichern (z.B. in einem Array of TRect)
Wie ist dann der Aufruf für Canvas (Verschachtelung)?
:?: :?: Einfach nacheinander aufrufen, ob gezeichnet werden soll oder nicht und die in Deinem Array gespeicherten Koordinaten nehmen

Alternativ, wie ich oben schon geschrieben habe, wäre aber der Königsweg, eine Grafik im Speicher (diese tust Du dann nicht in der Größe ändern!!!) entsprechend zu verändern (Blumen zeichen) und diese dann auf Deine Form gestretcht kopieren.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Bildgröße verändern

Beitrag von theo »

Michl hat geschrieben: Alternativ, wie ich oben schon geschrieben habe, wäre aber der Königsweg, eine Grafik im Speicher (diese tust Du dann nicht in der Größe ändern!!!) entsprechend zu verändern (Blumen zeichen) und diese dann auf Deine Form gestretcht kopieren.
Das wäre mMn der einzig vernünftige Weg.
Da hbr aber nie erklärt was er eigentlich machen will, kann man sich auch da nicht ganz sicher sein.

http://www.tty1.net/smart-questions_de.html#goal

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bildgröße verändern

Beitrag von Michl »

...Ja! Aber wenn er die "Blumen" als Buttons benutzen will benötigt er aber die 26 TRects trotzdem

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Bildgröße verändern

Beitrag von hbr »

Danke für Deine Bemühungen,
ist mir im Moment alle etwas zu hoch, muss mich da erst mal mit Canvas beschäftigen.

Bekomme ich die 'y-Koordinate analog' nur über Canvas oder kann man die sonnst irgend wie abfragen?

Gruß

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Bildgröße verändern

Beitrag von theo »

Michl hat geschrieben:...Ja! Aber wenn er die "Blumen" als Buttons benutzen will benötigt er aber die 26 TRects trotzdem
Sagt er das? Eben nicht! Deshalb weiss man nicht, was man ihm genau raten soll.

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Bildgröße verändern

Beitrag von hbr »

Hallo Theo,
theo hat geschrieben:Da hbr aber nie erklärt was er eigentlich machen will, kann man sich auch da nicht ganz sicher sein.
wie deutlich soll man das den noch erklären!
Hintergrundbild mit Blumen > dann ca. 25 Blüten die darüber gesetzt werden und bei irgendwelchen Aktionen erscheinen.
Die Blüten sehen anders aus als die auf dem Hintergrund rot, blau, gelb etc.
Mein Problem war wie schon beschrieben, dass die Größe der Blüten sich mit der Formgröße veränder sollen so dass sie zum Hintergrundpassen.
Das ist alles keine Buttonfunktion der Blüten.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Bildgröße verändern

Beitrag von theo »

hbr hat geschrieben: wie deutlich soll man das den noch erklären!
Einfach mal erklären, was das werden soll.
Du bist immer bei irgendwelchen Details, erklärst aber nie den Sinn der Sache, deshalb spekuliert Michl auch über Buttons, weil wir das Ziel nicht kennen. Immer noch nicht!
So kann man dir nicht wirklich helfen.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bildgröße verändern

Beitrag von Michl »

Mein Problem war wie schon beschrieben, dass die Größe der Blüten sich mit der Formgröße veränder sollen so dass sie zum Hintergrundpassen.
Das ist alles keine Buttonfunktion der Blüten.
... dann wäre wirklich das einfachste, Du zeichnest die Blumen in einen Bitmap (im Speicher) und legst dieses dann als Deinen Hintergrund der Form fest!!!

Wenn Du diese Objekte (Blumen) zu- und abschalten willst, musst Du dann jedesmal, wenn eine Aktion erfolgt die Blumen in das Bitmap zeichnen, dann bei OnPaint-Event Deiner Form das so geänderte Bitmap auf die Form kopieren!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Bildgröße verändern

Beitrag von hbr »

Hallo Michl
Michl hat geschrieben:... dann wäre wirklich das einfachste, Du zeichnest die Blumen in einen Bitmap (im Speicher) und legst dieses dann als Deinen Hintergrund der Form fest!!!
Wie macht man Das?
Michl hat geschrieben: Wenn Du diese Objekte (Blumen) zu- und abschalten willst, musst Du dann jedesmal, wenn eine Aktion erfolgt die Blumen in das Bitmap zeichnen, dann bei OnPaint-Event Deiner Form das so geänderte Bitmap auf die Form kopieren!
Die Blüten müssen ja Positioniert werde! Und wie geht das im Speicher?

gruß
hbr

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Bildgröße verändern

Beitrag von Michl »

Du brauchst ein Bitmap, was Du genau in der Größe definierst und diese nicht veränderst, am besten mit der Form, die Du im Regelfall nutzt abstimmen: z.B. Bitmap.width=800, Bitmap.height=600

Dieses nutzt Du zum genauen Zeichnen Deiner Blumen

Also
1. Bitmaps erstellen (1 als Zwischenspeicher, 1 als Hintergundbild und alle notwendigen Bilder)
2. Bitmap (Zwischenspeicher) immer bei OnPaint neu zusammenstellen
a Hintergrundbild kopieren auf Zwischenspeicherbitmap
b kopieren der Blumen in auf Zwischenspeicherbitmap
c kopieren des Zwischenspeicherbitmaps auf Deine Form -> Form1.Canvas.StretchDraw(r, Zwischenspeicherbitmap)

... anbei ähnliches Bsp. wie oben (lässt Ball in Form umherfliegen)

Originalgröße der Bitmaps (habe dafür ein TImage genutzt ... man kann aber auch ein TBitmap nehmen) werden nie verändert! Lediglich wird bei der Größenänderung der Form das Zwischenspeicherbitmap auf die Form gestretcht!
Dateianhänge
Projekt.ZIP
(232.07 KiB) 98-mal heruntergeladen
Zuletzt geändert von Michl am So 17. Mär 2013, 17:14, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten