Fastzoom (GFA)

Je besser ein Graphikprogramm ist, um so mehr Funktionen zum Manipulieren von Graphiken bietet es "(meistens). Und je schneller ein Programm dabei ist, um so besser fällt die Kritik aus. Es ist ja auch klar, daß man nicht unbedingt eine halbe Minute auf das 10fache Vergrößern von ein paar Pixeln warten möchte, wenn es auch schneller gehen kann.

STAD ist hierfür ein gutes Beispiel. Nun ist STAD aber in Assembler geschrieben. Programme wie Monostar zeigen aber, daß auch unter (GFA-) BASIC akzeptable Geschwindigkeiten machbar sind. Bei diesem Programm folgte ich einer Anregung aus dem Graphikbuch aus dem Verlag mit dem rot-weißen Cover auf den Büchern. Es stand dort nur eine Anregung, kein Programm. Die Routine ist auf meinem Mist gewachsen, so daß keine Copyright-Schwierigkeiten auftreten dürften.

Der Nutzen dieser Routine ist auf den ersten Blick gering, denkt man aber ein bißchen nach, so kommt man darauf, daß man leicht zum Beispiel Titelbilder in kleinerem Format speichern kann (Bytes sparen), um sie anschließend erst zu vergrößern. Die Geschwindigkeit hierfür ist durchaus ausreichend. Außerdem sind die Beispielprogramme aus den Büchern fast immer pixelorientiert. Dieses Programm arbeitet jedoch zeilen- und spaltenorientiert. Es ist also ungleich schneller. Und wer das Prinzip verstanden hat, der kann ab sofort nach dem gleichen Schema auch ganz flott verformen, spiegeln, drehen und so weiter. Aber nun zur Funktionsweise des Programms.

Der Routine Great werden neun Parameter übergeben. Dies sind:

1 Vergrößerungsfaktor von X und 2. von Y. Als dritten und vierten Wert braucht die Routine den X- und den Y-Startwert der zu vergrößernden Vorlage. Unter 5. wird die Breite, unter 6. die Flöhe der Vorlage in Pixeln angegeben. Der siebte und achte Wert bestimmen die Koordinate, ab der die Vergrößerung abgebildet wird. Der neunte Wert schließlich bestimmt den Schreibmodus, mit dem die Kopie auf den Screen gebannt wird. Hier gibt es 16 verschiedene Möglichkeiten, die Sie bitte dem GFA-BASIC-Handbuch entnehmen. Sie entsprechen den Möglichkeiten des PUT-Befehls. Die lokalen Variablen Xw% und Yw% bestimmen die äußerste Koordinate der Kopie. Diese Berechnung ist nötig, da die Schleifen rückwärts laufen. Warum, wird gleich erklärt. In den nächsten beiden ineinander verschachtelten For-Next-Schleifen wird zuerst eine Zeile gelesen und in der zweiten Schleife entsprechend dem Wert der Vy%-Variablen, also der Variablen, die die Y-Auflösung bestimmt, mehrmals übereinandergesetzt. Anschließend wird die nächste Zeile in die Variable Zoom$ gelesen und wieder gesetzt. Das läuft solange, bis jede Zeile einmal gelesen und mehrmals gesetzt wurde. Anschließend wiederholen wir das Spielchen, nur daß wir diesmal die Y-ska-lierte Kopie abtasten, die Spalten davon einiesen und setzen und gemäß der Variablen Vx% vorgehen.

Jetzt lautet die große Frage noch : Warum laufen die Schleifen fürs Einlesen rückwärts? Ganz einfach : stellen Sie sich vor, Sie wollen einen Teil von 320x200 Pixeln auf 640x400 vergrößern. Wenn die Schleifen vorwärts laufen, werden sich irgendwann Original und Kopie überdecken. Tun sie bei Rückwärtsschleifen auch, dann aber an Stellen, die schon vergrößert wurden! Nehmen Sie jetzt aber an, Sie vergrößern einen Buchstaben, der an Position 0,0 steht, aufs Fünffache, die Kopie soll ebenfalls an 0,0 stehen. Bei Buchstaben ist die erste Zeile eine Leerzeile. Dementsprechend werden die Bildschirmzeilen 0 bis 4 gelöscht (5fache Vergrößerung einer Leerzeile). Nun wird die zweite Zeile abgetastet, die aber durch die Vergrößerung der ersten Zeile schon gelöscht ist! Ergebnis : ein leerer Screen! Deswegen das Rückwärtslaufenund die Variablen Xw% und Yw%. Es geht mit ihnen schneller und einfacher als mit dem ständigen Errechnen der Zeilen- und Spaltenpositionen.

Wer es noch nicht verstanden hat, sollte sich das Listing gut durchlesen, es ist sehr kurz und gut dokumentiert. Also dann noch viel Spaß mit dem Experimentieren, und möge die MMU euch immer wohlgesonnen sein!

' (c) MAXON Computer GmbH 1989
'
' *********************************************
' **                                         **
' ** Dieser Teil dient nur zur Demonstration **
' **                                         **
' *********************************************
INPUT "Text ";tex$
INPUT "Vergrösserung X ";vx
INPUT "Vergrösserung Y ";vy
CLS
PRINT AT(1,1);tex$
@great(vx,vy,0,0,LEN(tex$)*8,16,0,0,3)
' 9 Übergabeparameter:
' 1.) X-Vergrößerung   2.) Y-Vergrößerung
' 3.) X-Koordinate der linken oberen Ecke des Originals
' 4.) Y-Koordinate der linken oberen Ecke des Originals
' 5.) Breite in Pixel  6.) Höhe in Pixel
' 7.) X-Koordinate der linken oberen Ecke der Vergrößerung
' 8.) Y-Koordinate der linken oberen Ecke der Vergrößerung
' 9.) Schreibmodus   (nähere Erläuterung siehe Text und GfA-Basic-Handbuch PUT)
END
' *********************************************************
' **                                                     **
' ** Hier beginnt die superschnelle Vergrößerungsroutine **
' **                                                     **
' *********************************************************
PROCEDURE great(vx%,vy%,x%,y%,br%,ho%,xo%,yo%,mode%)
  LOCAL zoom$,xw%,yw%            !Definierem der lokalen Variablen
  xw%=xo%+br%*vx%                !Errechnen des äußersten X-Punktes der Kopie
  yw%=yo%+ho%*vy%                !Errechnen des äußersten Y-Punktes der Kopie
  '
  ' Die Vergrößerungsschleifen laufen rückwärts,
  ' da sonst Probleme auftauchen, falls Teile der Kopie
  ' in das Original reichen, sprich:
  ' Vergrößerung schon vergrößerter Graphikteile !!!
  ' ----------------------------------------------------
  '
  ' **** Vergrößerung der Vorlage an der Y-Achse ****
  '
  FOR i%=y%+ho% DOWNTO y%        !Schleife fürs Einlesen der Zeilen
    GET x%,i%,x%+br%,i%,zoom$    !Einlesen einer Zeile
    FOR j%=1 TO vy%              !Schleife fürs Setzen der Zeile
      PUT xo%,yw%,zoom$,mode%    !Vergrösserung durch Vy%-mal setzen der Zeile
      DEC yw%                    !Nächste Zeile eins weiter oben
    NEXT j%                      !Nächstes mal Zeile setzen
  NEXT i%                        !Nächste Zeile einlesen
  '
  ' **** Vergrößerung der Kopie an der X-Achse
  '
  FOR i%=xo%+br% DOWNTO xo%      !Schleife fürs Einlesen der Spalten
    GET i%,yo%,i%,yo%+ho%*vy%,zoom$ !Einlesen einer Spalte
    FOR j%=1 TO vx%              !Schleife für Setzen der Spalte
      PUT xw%,yo%,zoom$,mode%    !Vergrösserung durch Vx%-mal setzen der Spalte
      DEC xw%                    !Nächste Spalte eins weiter links
    NEXT j%                      !Nächstes mal Spalte setzen
  NEXT i%                        !Nächste Spalte einlesen
RETURN                           !...Und das war's auch schon !!! Good-Bye!

FASTZOOM.BAS

Gerald Schmieder



Aus: ST-Computer 11 / 1988, Seite 72

Links

Copyright-Bestimmungen: siehe Über diese Seite