Bildgröße verändern
-
- 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
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
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
Re: Bildgröße verändern
Evtl. hilft Dir das: http://www.lazarus.freepascal.org/index ... pic=8282.0
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- 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
Danke,
Nein, leider hielft mir das nicht weiter.
Nein, leider hielft mir das nicht weiter.
Re: Bildgröße verändern
Also, Du musst bei OnPaint einfach die Größe prozentual mit anpassen zB.
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
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;
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;
-
- 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
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
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
Re: Bildgröße verändern
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
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.
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
Ja. Einfach alle Positionen speichern (z.B. in einem Array of TRect)Hier braucht man dann 26 TRect.
Wie ist dann der Aufruf für Canvas (Verschachtelung)?


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;
Re: Bildgröße verändern
Das wäre mMn der einzig vernünftige Weg.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.
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
Re: Bildgröße verändern
...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;
-
- 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
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ß
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ß
Re: Bildgröße verändern
Sagt er das? Eben nicht! Deshalb weiss man nicht, was man ihm genau raten soll.Michl hat geschrieben:...Ja! Aber wenn er die "Blumen" als Buttons benutzen will benötigt er aber die 26 TRects trotzdem
-
- 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
Hallo Theo,
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.
wie deutlich soll man das den noch erklären!theo hat geschrieben:Da hbr aber nie erklärt was er eigentlich machen will, kann man sich auch da nicht ganz sicher sein.
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.
Re: Bildgröße verändern
Einfach mal erklären, was das werden soll.hbr hat geschrieben: wie deutlich soll man das den noch erklären!
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.
Re: Bildgröße verändern
... 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!!!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.
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;
-
- 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
Hallo Michl
gruß
hbr
Wie macht man Das?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!!!
Die Blüten müssen ja Positioniert werde! Und wie geht das im Speicher?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!
gruß
hbr
Re: Bildgröße verändern
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!
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;