Entwickler-Ecke

Multimedia / Grafik - Zoomausschnitt beibehalten


Fabian W. - Fr 15.09.06 19:09
Titel: Zoomausschnitt beibehalten
Hallo!

Ich hab nun ne ganze Zeit lang gesucht aber nischt gefunden...

Folgendes Problem:

Ich habe ein TImage in einer TScrollbox.
Dieses Image soll man zoomen können - kein problem; strech aktvieren, größe ändern - gezoomt^^
Jetzt das problem an der sache:
Wenn ich die Größe des Image ändere zeigt der Mittelpunkt der Box nicht mehr auf das Pixel auf dem image, auf das er bevor dem zoomen gezeigt hat. Der Auschnitt wird also nicht nur gezoomt sondern auch verschoben.
Genau das möchte ich vermeiden - hatte schonmal jemand dieses Prob (lösen können^^) oder Vorschläge?

mfg


Fabian W. - Sa 16.09.06 14:40

*push*


wulfskin - Sa 16.09.06 14:58

Hallo,

ich benutze für gewöhnlich für solche Dinge die PaintBox und das vergrößern/verschieben u.ä. mache ich durch etwas Mathematik und die Funktionen von Canvas: StretchDraw u.ä.
Hast du es schon mal damit versucht?

Gruß Hape!


Fabian W. - Sa 16.09.06 15:05

Das wäre bei mir etwas umständlich da es nicht nur um das Bild geht. Wenn ich alles zusdammenrechne ist ne scrollbox die optimalere Lösung ;)


Xion - Sa 16.09.06 15:11

hi

eigentlich musst du doch nur, wenn du zoomst, die hälfte der größenänderung bei Top und Left dazuzählen. Wenn du allerding ganz am rand deinen ausschnitt hast, ist er danach nicht mehr am rand, aber der Ausschnitt fokusiert noch das gleiche Pixel

//EDIT: nicht bei Top,Left sondern halt ScrollBy bei der ScrollBox


Fabian W. - Sa 16.09.06 15:51

@xion: dann würde es immer richtung mitte streben ;)

Danke aber ich konnte das Problem grade mit BenBEs Hilfe slebst lösen ;)
Für alle die's interessiert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  mittepixX, mittepixY: integer;
begin
  mittepixX := round(((2 * ScrollBox1.HorzScrollBar.Position + ScrollBox1.Width) / 2) / Lastzoom);
  mittepixY := round(((2 * ScrollBox1.VertScrollBar.Position + ScrollBox1.Height) / 2) / Lastzoom);

  //Änderungen an Komponenten dürchführen

  ScrollBox1.HorzScrollBar.Position := round((mittepixX * zoom) - (ScrollBox1.Width / 2));
  ScrollBox1.VertScrollBar.Position := round((mittepixY * zoom) - (ScrollBox1.Height / 2));

  LastZoom := Zoom;
end;
Zoom wird in in dezimalen angegeben (1 = 100%, 1,5 = 150 % etc)

mfg