Das Wort “Scanner” kommt aus dem Englischen. “To scan” bedeutet abtasten oder auch überfliegen. Der Hobby Computeranwender versteht darunter ein Gerät, das Bild-Vorlagen in (s)einen Computer einliest.
Im Gegensatz zu den schnellen Video-Digitizern wird beim Scanner eine lichtempfndliche Photozelle in kleinen Abständen über eine Vorlage geführt. Für jeden Abtastschritt werden dem Computer Helligkeitsdaten übermittelt. So wird die Vorlage Zeile um Zeile eingelesen.
Ausgehend davon kam ich - wie sicherlich andere schon vor mir - auf den Gedanken daß die Photozelle von meinem Drucker fortbewegt werden könnte. Dazu genügt es, sie in ein altes Farbbandgehäuse einzubauen. Mit einer kleinen Sequenz von Steuerzeichen lassen sich die meisten Drucker zum Scannen zweckentfremden. Nach einigen hundert Horizontalschritten folgt ein Wagenrücklauf, um die nächste Zeile zu lesen. Die Vorlagen müssen sich hierbei alle in den Drucker einspannen lassen. Wer einen Flachbettplotter sein eigen nennt, kann z.B. auch Plattenhüllen bequem abtasten. Ein Plotter macht außerdem keine Anstalten bei der Ansteuerung. Einige Drucker zeigen, dank modernster Wegeoptimierung, ein großes Maß an Starrsinn. Manche Geräte versalzen selbst einem trickreichen Programmierer die Suppe, indem sie stets einen Wagenrücklauf abwarten und dann emsig, aber viel zu schnell über die Vorlage flitzen.
Folgendes wird also zum Scannen benötigt:
Die Sache sieht also nicht besonders schwierig aus, zumal meine komfortable Scannersoftware als Public Domain erhältlich ist.
Nur DM 25,- habe ich für meine Elektronik berappt. Nach 4-stündiger Nachtarbeit funktionierte der A/D-Wandler perfekt. Aber dann gab es doch Schwierigkeiten: Die ersten eingescannten Bilder wirkten unscharf und "verrauscht”.
Erst nach und nach gelang, hauptsächlich durch verbesserte Software, ein Scanner mit erstaunlicher Bildqualität.
Die Hardware war, abgesehen von einem kleinen Wackelkontakt, nicht weiter zu verbessern. Die umgewandelten Helligkeitswerte entsprechen, wegen der logarithmischen Kennlinie vom A/D-Wandler, dem tatsächlichen Graueindruck. Die Vorlagen werden außerdem nicht, wie bei vielen Billigscannern, mit Infrarotlicht abgetastet, sondern mit sichtbarem Licht.
Meine Scannersoftware bietet also einige Leckerbissen:
Das abgetastete Originalbild kann vergrößert, verkleinert und gestaucht werden. Auch Helligkeit, Kontrast und Gradation sind nachträglich zu verändern. So kann man z.B. die dunklen Bildbereiche verändern, ohne daß sich die hellen und mittelgrauen Töne verändern.
Die Grauabstufungen sind auf dem s/w-Monitor nur durch Füllmuster darstellbar. Diese Muster sind besonders fein, um ein möglichst realistisches Bild zu erzeugen. Ich habe auch darauf geachtet, daß keine “Kanten-Effekte” zwischen verschiedenen Mustern auftreten.
Die USM-Funktionen (USM = Un-scharf-Maskierung) betonen feine Bilddetails, die beim Abtasten teilweise verloren gingen. Außerdem wird die “Treppchenbildung” vermieden. Diese Funktion kann tatsächlich den Schärfeeindruck verdoppeln. Das ist etwas, was andere Scannersoftware nicht bieten kann.
Das so aufbereitete Bild läßt sich im Degas- oder Binärformat auf Diskette abspeichern. Die Bilder können so mit einem Malprogramm noch weiter verschönert werden.
Mit einer geplanten Version 2.0 kann man in die Farbauflösung umwandeln und die Bilder sogar einfärben.
Die Hardware besteht im wesentlichen aus einem Phototransistor, dem logarithmischen Verstärker und dem 4-Bit-A/D-Wandler.
Die Hardware wird mit dem Joystick-Port verbunden und die Elektronik über diesen Stecker auch mit 5 Volt versorgt. Man bekommt einen solchen Joystick-Stecker im Elektronik-Laden (9-polige D- Buchse). Man muß nur den Metallrahmen entfernen. Zur Not hilft auch das Kabel eines alten Joysticks.
Ich möchte nun ganz kurz die Funktionsweise meiner Schaltung erklären:
Der Phototransistor T3 (BPY 14) liefert einen zur Lichtstärke proportionalen Ausgangsstrom. T1 logarithmiert diesen Strom und wandelt ihn in eine Gleichspannung (maximal 0,7 Volt) um.
Widerstand R2 und C1 filtern Brummspannungen aus. Der nun folgende OP verstärkt diese Spannung. Hier sind die Regler für Abtasthelligkeit (P2) und Kontrast (P1) angebracht.
Transistor T2 steuert eine Leuchtdiode an. Diese LED leuchtet in Abhängigkeit von der “gesehenen” Helligkeit auf.
Alle übrigen ICs dienen zur A/D-Wandlung. Der Eingang befindet sich an IC 1 Pin 6. Beim Aufbau sollte man darauf achten, daß C4, R11 und R10 nicht zu weit weg von IC2 plaziert werden. Man sollte die Digita1-Masse (breites Symbol) und Analog-Masse (schmales Symbol) getrennt verdrahten und erst an C6 miteinander verbinden.
Die gesamte Elektronik wurde auf einer Lochrasterplatine von 30 mm * 80 mm aufgebaut. Man tut sich bei der doppelten Platinenfläche allerdings weniger schwer. IC-Fassungen für IC2, IC3 und IC4 sind kein Luxus, denn die CMOS-ICs sollten erst zum Schluß eingesetzt werden, um deren Zerstörung durch statische Elektrizität zu vermeiden.
Ist die Platine fertig bestückt, wird der Phototransistor über ein längeres abgeschirmtes Kabel angeschlossen. Die Transistorbasis ist nicht belegt. Dieses Anschlußbeinchen wird gekürzt.
Der Phototransistor hat eine Linse. Der Öffnungswinkel beträgt nur 20°. Daher wird schräg einfallendes Licht nicht gesehen. Wegen der Bildschärfe muß man diesen Blickwinkel noch weiter einengen. Normalerweise wird mit einem Pixelabstand von ca. 1mm gescannt.
Dazu baut man den Phototransistor z.B. in eine Kugelschreiberhülse oder ähnliches ein. Das Öffnungsloch an der Spitze sollte zwischen 0.5 und 1 mm groß sein. Der Phototransistor hat dabei einen Mindestabstand von ca. 10mm zur Öffnung. Grundsätzlich gilt, daß kleine Vorlagen auch kleine Öffnungen benötigen. Ist die Öffnung aber zu klein, verschwinden u.U wichtige Bilddetails in den Abtastzwischenräumen. U.U. ist dann der Phototransistor BPW 13 (=BPW 14 ohne Linse) besser geeignet. Alternativ kann der Phototransistor auch in eine ausgediente Farbbandkassette eingepaßt werden. Man bohrt an geeigneter Stelle ein kleines Loch mit oben erwähntem Durchmesser in die Kassette.
Die Abtastöffnung muß einerseits möglichst nahe an der Vorlage angebracht sein, andererseits darf sie nicht das Abtastlicht unterbrechen. Kunststoffe sind meistens etwas lichtdurchlässig. Deshalb sollte man das Ganze mit schwarzem Isolierband ©umwickeln bzw. schwarz lackieren. Wenn man das Öffnungsloch verschließt, darf die Schaltung nicht mehr auf das Außenlicht reagieren. Wenn der Phototransistor nicht genügend gegen Fremdlicht abgeschirmt wird, erhält man unscharfe Bilder. Es empfiehlt sich also, die oben erwähnten Tips beachten.
Die Software wurde in GFA-BASIC erstellt. Das Scanner-Programm ist Public Domain - also für jeden zugänglich.
Wie bereits erwähnt, wird die Scanner-Hardware am Joystick-Port betrieben. Mein Scannerprogramm fragt diesen Port mit einem ganz ordinären “Peek”-Befehl ab. Das mag zwar die GEM-Spezialisten etwas schockieren, aber das gibt uns die Möglichkeit, auch andere Hardware durch Ändern dieser Peek-Adresse an anderen Ports einzusetzen.
Zum Scannen muß man einen Druckertreiber laden und diesen der Bildvorlage entsprechend modifizieren. Konkret ist wohl stets die Schrittzahl horizontal und vertikal an die jeweiligen Vorlagen anzupassen. Die Schrittweite (Pixelabstände) sollte ebenfalls auf die Vorlagengröße eingestellt werden.
Wenn alle übrigen Vorbereitungen getroffen sind, kann die Abtastung gestartet werden. Auf dem Bildschirm sieht man Zeile um Zeile ein unscharfes “Urbild” entstehen. Der Abtastvorgang kann, falls erforderlich, jederzeit mit der ESC-Taste gestoppt werden.
Wenn der Abtastvorgang beendet ist, wird das Urbild abgespeichert. Hat man das getan, kommt die Aufbereitung. Man verändert jetzt Helligkeit, Kontrast, Bildschärfe und zoomt bzw. entzerrt das Bild.
Danach speichert man das aufbereitete Bild als Neochrome- (erst ab Version 2.0) oder Degas-File ab.
Die Malprogramme Degas (und Neochrome) helfen, das Bild weiter zu verbessern. Auch Fotomontagen sind möglich.
Die Bedienung des Scannerprogramms erklärt sich praktisch von selbst. Einige Punkte muß ich jedoch noch erwähnen:
Um “Bildstörungen” bzw. Unschärfe zu verhindern, sind zwei einstellbare Verzögerungszeiten (Abtastung horizontal und vertikal) vorhanden.
Der Treiber wird wie folgt ediert:
< ‘ > Dient nur zur optischen Trennung einzelner Zeichen. Die Zeichenketten werden da durch etwas übersichtlicher. Dieses Zeichen wird später übergangen.
< & > weist das Programm an, die nächsten zwei Zeichen als einen hexadezimalen ASCII-Code zu betrachten.
Beispiel:
Eingabestring “T’ex&74'&0D” wird zum Ausgabestring “Text” + < Wagenrücklauf >.
1. Ausleuchten der Vorlage
Der verwendete Phototransistor BPY 14 reagiert auf sichtbares Licht. Eine gewöhnliche Tischlampe sorgt für ausreichende Belichtung der Vorlage. Der Phototransistor selbst hat nämlich keine eingebaute Lichtquelle.
Beim Ausleuchten ist unbedingt folgendes zu beachten:
2. Einstellen von Abtasthelligkeit und Kontrast
Wie bereits in der Schaltungsbeschreibung erwähnt, bietet schon die Elektronik eine Möglichkeit die Abtasthelligkeit und den Abtastkontrast zu verstellen. Diese Einstellregler müssen immer der jeweiligen Vorlage angepaßt werden.
Helligkeit und Kontrast verhalten sich genau so, wie man es von einem Fernsehgerät her kennt:
Zu wenig Kontrast läßt das Bild grau in grau erscheinen (hellgrau war weiß, dunkelgrau war schwarz). Bei zu viel Kontrast wirkt das Bild “hart”. Es fehlen die Mitteltöne (dunkelgrau wird zu schwarz und hellgrau wird zu weiß).
Der Helligkeitsregler hebt oder senkt die Helligkeit aller Bildinhalte gleichmäßig.
Zum Angleich der Regler an die Vorlage geht man zunächst von der Mittelstellung aus. Danach muß zuerst die Helligkeit (P2) und dann der Kontrast (P1) eingestellt werden. Man wiederholt die Einstellung von Helligkeit und Kontrast mehrmals, bis für die hellste Bildpartie (weiß) die Zahl 14 und für die dunkelste die Zahl 1 angezeigt werden.
Die Helligkeitszahl wird rechts unten im Druckermenü ständig angezeigt. Hierbei bedeutet die Zahl 0 das dunkelste Schwarz und die Zahl 15 das hellste Weiß. Es ist also auch möglich, den vollen Zahlenbereich auszuschöpfen indem man die Regler auf 0 bzw. 15 einstellt. Dabei ist es jedoch nicht immer einfach, die Einstellung zu kontrollieren, da ein Weiterdrehen der Regler keine Änderung (kleiner als Null oder größer als 15) bewirkt. Beim Abgleichen von Helligkeit und Kontrast kommt es darauf an. daß die Photozelle auch tatsächlich auf einen sehr hellen bzw. dunklen Bildpunkt gerichtet ist. Hat man diese beiden Stellen im Bild ausfindig gemacht, wird während des Abgleichs immer zwischen diesen beiden Stellen hin und her gefahren, und dabei wird mit den Reglern auf 14 (wenn hell) und 1 (wenn dunkel) abgestimmt. Erfahrungsgemäß ist der Kontrastabgleich unkritischer als der Helligkeitsabgleich. Eine Abweichung von +-1 Helligkeitszahl ist nicht so schlimm, denn das fertig abgetastete Bild läßt sich in Helligkeit und Kontrast nachträglich verändern. Der Menüpunkt hierfür heißt “Umfang”.
3. Einstellen der Bildformate (Druckertreiber)
Vor der Abtastung muß man sich über die gewünschte Bildgröße auf dem Bildschirm im klaren sein.
Zwar bietet meine Software auch eine Möglichkeit, das Bildformat nachträglich zu verändern bzw. zu verzerren. Aber die besten Ergebnisse bekommt man, wenn man das Bild etwa in der Originalgröße beläßt.
Also zückt man besser vorher den Taschenrechner:
Sicher weiß jeder, daß die monochrome Auflösung 640 x 400 Pixel beträgt. Grundsätzlich sollte man für etwa vier Monitorpixel einen Abtastschritt vorsehen. Soll z.B. das Monitorbild vollständig “gefüllt” werden, wären das etwa 320 Abtastpunkte horizontal und 200 Punkte vertikal. (Zwei horizontale mal zwei vertikale Bildpixel kommen auf ein Urpixel). Für den Preis eines unscharfen Bildes verkürzt sich die Abtastzeit, wenn man über dieses Verhältnis hinausgeht. Ein Erhöhen der Abtastpixelzahl bringt hingegen keine nennenswerte Verbesserung der Bildqualität mehr.
Die USM-Routinen in meinem Programm sind bei einem Urpixel/Bildpixel-Verhältnis von 1:4 optimal. USM bringt augenscheinlich die volle Schärfe wieder zurück.
An dem folgenden Beispiel möchte ich erklären, wie der Druckertreiber eingestellt werden muß:
4. Aufbereiten und Verschönern des Urbildes
Die Abtastbilder (Urbilder) können auf Diskette gesichert werden. Vielleicht befinden sich schon einige auf Ihrer PD-Diskette. Diese lassen sich betrachten, indem man sie mit “Lade Urbild” lädt und mit “Zeige Urbild” darstellt.
Das Urbild ist noch unscharf und Gradation, Helligkeit und Kontrast entsprechen noch dem Urzustand. Jedes Urbild kann aber mit den folgenden Optionen verbessert werden:
Ich wünsche noch viel Spaß beim Basteln und hoffe, daß mein kleines Programm Verwendung findet.
Ein Listing des Source-Codes kann man bei mir anfordern (ca. DM 20,-).
Ralf Bager Friedensstr. 10 b 6082 Mörfelden-Walldorf
PS: Es gibt bekanntlich verschiedene TOS-Versionen. Deshalb ist es z.B. beim neuen Blitter-TOS oder beim uralten Disketten-TOS erforderlich, die “Joystick Peek-Adresse” zu ändern. Sonst tappt Dein Scannner im Dunkeln. Man kann diese Funktion mit einem normalen Joystick überprüfen.
Dim T$(65),Dr$<65)
Dim W(65)
Dim Wert%(256)
@Men_init
@Full_init
0Anz_init
@Do_var
Urbild$=Space$(32767)
Bild$=Space$(32767)
Eflag=0
W(23)=3593
T$(23)=Str$(W(23))
'
'
Start:
@Tx
Menu Rollo$()
On Menu Gosub Menue
'
'
Do
On Menu
If Menu(12) =2
Repeat
On Menu
Until Menu(12)=0
@Mausklick(Menu(10),Menu(11))
Endif
Joy2=Peek(W(23))
If Joy2<>Joy1
Joy1=Joy2
Print At (58,24);Joy1;" "
Endif
Loop
'
'
Procedure Mausklick (X, Y)
Menu Off
local I
X=Int(X/8)
Y=Int(Y/16)+1
For I=27 To 65
If Anz%(0,I)+38>X And Anz%(0,I)<X And Anz%(1,I)=Y
Mreq=I
@Menue
Mreq=0
Endif
Next I
Return
'
'
Procedure Menue
If Mreq=0
Me=Menu(0)
Else
Me=Mreq
Endif
On Me Gosub About
On Me-10 Gosub N,Drlad,Urlad,N,Drspei,Urspei,Binspei, Neospei,Degspei
On Me-20 Gosub Kopie, N, Zin,N,N,N,Txin,Txin, Txin,Txin
On Me-30 Gosub Zin, Zin, N, Zin, Zin, N,N, Zoom, N, Zin
On Me-40 Gosub Zin,N,Zin,Zin,Zin,N,Zin,Zin
On Me-50 Gosub Bildcalc, Scan,N,N,N,Par_bild, Scan_bild, N,Ende
Menu Off
Return
'
'
Procedure About
Local A
Alert 0,"* * S C A N N E R * *|C. 1987|Ralf Bager,Mörfelden", 1, "OK", A
Return
'
'
Procedure Drlad
Local Du$
Fileselect "\*.DR1", "", Nam$
If Nam$<>""
If Exist (Nam$)
Open "I",#1,Nam$
For I=10 To 65
If I<>34 And I<>35
Line Input #1,T$(I)
Else
Line Input #1,Du$
Endif
Next I
Close #1
Else
Alert 3,"Datei nicht vorhanden !| | ",1,"OK",Du
Endif
Endif
@Tx
Return
'
'
Procedure Urlad
Local Len
Fileselect "\*.UR1","",Nam$
If Nam$<>""
If Exist (Nam$)
Urbild$=Space$(32767)
Bload Nam$, Varptr (Urbild$)
Len=Cvl (Left$(Urbild$, 4))
T$(34)=Mid$(Urbild$, 5,4)
T$(35)=Mid$(Urbild$, 9,4)
Urbild$=MidS(Urbild$, 13, Len)
Else
Alert 3, "Datei nicht vorhanden !| | ",1,"OK",Du
Endif
Endif
@Tx
Return
'
'
Procedure Urspei
Local Len
Fileselect "\*.UR1","",Nam$
If Nam$<>""
Len=Len(Bild$)
Urbild$=Mkl$ (Len(Urbild$)) +Right$(" "+T$(34),4)+Right$(" "+T$(35), 4)+Urbild$
Bsave Nam$,Varptr(Urbild$),Len+12
Urbild$=Mid$(Urbild$, 13, Len)
Endif
Return
'
'
Procedure Drspei
Fileselect "\*.DR1", "",Nam$
If Nam$<>""
Open "O",#1,Nam$
For I=10 To 65
Print #1,T$(I)
Next I
Close #1
Endif
Return
'
'
Procedure Kopie
@All
If Erg=2
Hardcopy
Endif
Return
'
'
Procedure Scan
Local A$
Cls
@All
If Erg=2
@Disl
@Do_var
@Full_lut
Cls
@Do_scan
Endif
Repeat
A$=Inkey$
Until A$=Chr$(27)
Cls
Menu Rollo$()
@Tx
Return
'
'
Procedure Ende
Menu Kill
End
Return
'
'
Procedure Zin
Local M
M=Me
@Textedit(Anz%(0,M)+18,Anz%(1,M),4,T$(M),-1)
T$(M)=Rueck$
Return
'
'
Procedure Txin
Local M
M=Me
@Textedit(Anz%(0,M)+18,Anz%(1,M),60,T$(M),0)
T$(M)=Rueck$
Return
'
'
Procedure Bildcalc
Local X,Y,P,B,A$
Cls
@Disl
@Do_var
@Full_lut
Cls
@Rahmung(0)
For Y=0 To (W(35)-1)
For X=0 To (W(34)-1)
P=(Y*W(34)+X)/2
B=Asc(Mid$(Urbild$, Int(P),1))
If P-Int(P)>0.1
B=(B And 240)/16
Else
B=B And 15
Endif
@Putpix(X*2,Y*2,2,2,B*16)
Next X
Next Y
@Rahmung(1)
Repeat
A$=Inkey$
Until A$=Chr$(27)
Cls
Menu Rollo$()
@Tx
Return
'
'
Procedure Par_bild
Cls
Menu Rollo$()
@Tx
Return
'
'
' ______________________________
' ab hier kommen untergeordnete Proceduren
' ______________________________
'
'
Procedure Tx
Local M
For M=0 To 65
If Anz%(0,M)>0
@Str_clean(Rollo$(M))
Print At(Anz%(0,M),Anz%(1,M));Rueck$;":"
Print At(Anz%(0,M)+18,Anz%(1,M));T$(M);
Endif
Next M
Return
'
'
Procedure Str_clean (A$)
Local B$, I
For I=Len(A$) To 1 Step -1
B$=Mid$(A$,I,1)
Exit If B$<>"-" And B$<>" " And B$<>"
Next I
A$=Left$(A$,I)
If Left$(A$,1)<>"-"
Rueck$=Left$(A$+"............", 17)
Else
Rueck$=A$
Endif
Return
'
'
Procedure Do_var
Local I,K,A$,B$,C$
Eflag=1
If W(34)*W(35)/2>32767
Error 10
Endif
For I=0 To 65
A$=Rollo$(I)
B$=T$(I)
If Len(A$)>0 And Anz%(0,I)<>0 And Left$(A$, 1)<>"-"
If I<27 Or I>30
W(I)=Val(B$)
Else
Dr$ (1)=""
For K=1 To Len CBS)
C$=Mid$(BS,K,1)
If C$<>"'"
If C$<>"&"
Dr$(I)=Dr$(I)+C$
Else
Dr$(I)=Dr$(I)+Chr$(Val(Mid$(B$,K,3)))
K=K+2
Endif
Endif
Next K
Endif
Endif
Next I
Eflag=0
Return
'
'
Procedure Do_scan
@Rahmung(0)
Urbild$=Space$(Int((W(34)*W(35)+D/2))
Local A,B,X,Y,Z%,A$
Lprint Dr$(27);
Z%=0
For Y=0 To (W(35)-1)
For X=0 To (W(34)-1)
A=B
@Delay(W(31))
B=Peek(Int(W(23)))
Lprint Dr$(28)
If Z%>=1
Z%=0
Mid$(Urbild$,(Y*W(34)+X)/2)=Chr$((A+B*16) And 255)
Else
Inc Z%
Endif
@Putpix(X*2,Y*2,2,2,B*16)
A$=Inkey$
Exit If A$=Chr$(27)
Next X
Lprint Dr$ (29)
@Delay(W(32))
Exit If A$=Chr$(27)
Next Y
Lprint Dr$(30)
@Rahmung(1)
Return
'
'
Procedure Putpix(X,Y,Dx,Dy,H)
Deffill 1,Muster$(Wert%(H))
Pbox X,Y,X+Dx-1,Y+Dy-1
Return
'
' bewertet die Füllmuster nach Helligkeit und erzeugt Wert%()
Procedure Full_lut
Local H, A, Byte, Bit,M, A$
For A=0 To 256
Wert%(A)=300
Next A
For M=0 To 32
Exit If Muster$ (M) =""
H=0
For Byte=1 To 32
A=Asc(Mid$(Muster$(M),Byte,1))
A$=Right$("00000000"+Bin$(A),8)
For Bit=1 To 8
If Mid$(A$, Bit, 1) ="0"
H=H+1
Endif
Next Bit
Next Byte
Wert%(H)=M
Next M
Repeat
A=1
For H=1 To 255
If Wert%(H)=300 And Wert%(H+1)<>300
Wert%(H)=Wert%(H+1)
A=0
Endif
If Wert%(H)=300 And Wert%(H-1)<>300
Wert%(H)=Wert%(H-1)
A=0
Inc H
Endif
Next H
Until A=1
Return
'
'
Procedure All
Alert 2,"Ist der Drucker bereit|und die Anpassung gemacht ?",2,"Abbruch|Start",Erg
Return
'
'
Procedure Disl
Print At(30,11);" ********************";
Print At(30,12);" *** Bitte warten ***"
Print At(30,13);" ********************";
Return
'
'
'_______________________________
' Ab hier kommen Lader für div Feld-Variablen
'-------------------------------
'
' liest menu in Rollo$()
Procedure Men_init
Dim Rollo$(67)
For I=0 To 65
Read Rollo$(I)
Exit If Rollo$(I)="***"
Next I
Let Rollo$(I)=""
Let Rollo$(I+1)=""
Return
' menu text
Data Desk, About SCANNER
Data -------------
Data acc1,acc2,acc3,acc4,acc5,acc6,""
Data I/O ,-lade------------, Druckertreiber , Ur-Bild ,-speichere--
Data Druckertreiber, Ur-Bild, Bild (BIN), Bild(NEO), Bild(P01)
Data ------------, Hardcopy,----------, Joyst.-Peek,""
Data Abtastung ,-Druckertreiber--, Initialisierung, Horiz.-Vorschub
Data Vert .-Vorsch;CR , Abschlu_, Timer Horizontal, Timer Vertikal, -Schrittzahl--, Horizontal, Vertikal,""
Data Aufber., Zoom,-USM---------, breit, schmahl,-Gradation-, Licht, Mittelton, Schatten
Data -Grundwerte-, Licht, Schatten,""
Data Starte, Aufbereitung , Abtastung,""
Data Sonstiges,-zeige-----, Parameter, Bild,------, Ende ,""
Data ***
'
' liest Füllmuster in Muster$()
Procedure Full_init
Dim Muster$(32)
Dim Zeil$(15)
Local A$,V,N,Z
For N=0 To 32
Read A$
Exit If A$="***"
For V=0 To 15
Read A$
Exit If A$="*"
Repeat
A$=A$+A$
Until Len (A$)>=16
Zeil$(V)=Left$(A$,16)
Next V
For Z=V To 15
Zeil$ (Z) =Zeil$ (Z-V)
Next Z
Muster$(N)=""
For Z=0 To 15
Muster$(N)=Muster$(N)+Mki$(Int(Val("&X"+Zeil$(Z))))
Next Z
Next N
Return
' Hier beginnen die Füllmuster-Daten
Data **
Data 0
Data *,*
Data 0100
Data 0
Data 0001
Data 0
Data *,*
Data 0100
Data 0001
Data *,*
Data 0101
Data 0010
Data 1010
Data 0100
Data *,*
Data 01
Data 10
Data *,*
Data 0101
Data 1101
Data 1010
Data 1011
Data *,*
Data 0111
Data 1101
Data *,*
Data 0111
Data 1111
Data 1101
Data 1111
Data *,*
Data 1
Data *,***
'
'
' zeigt wo und welche menu-Einträge angezeigt werden
Procedure Anz_init
Dim Anz%(1,65)
Local X,Y,A
For A=0 To 65
Anz%(0,A)=0
Anz%(1,A)=0
Next A
Do
Read A
Exit If A=999
Read X,Y
Anz%(0,A)=X
Anz%(1,A)=Y
Loop
Return
Data 23,40,22, 26,30,3, 27,1,4,28,1,5,29,1,6,30,1,7
Data 31,1,9,32,40,9,33,1,12,34,1,13,35,1,14,39,40,12
Data 40,40,13,41,40,14, 42,1,17,43,1,18,44,1,19,45,1,20
Data 46,40,17,47,40,18, 48,40,19,999
'
'
' _____________________________
' Ab hier kommen allgemeine Proceduren
' _____________________________
'
'
Procedure Textedit(X,Y,Lmax,A$, Z)
Local B$,L,P,B,C
L=Len(A$)
P=L+1
Do
Print At(X,Y);A$;" "
Print Chr$(27);"p";
If L>0 And P<=L
Print At (X+P-l, Y); Mid$(A$,P, 1);
Print Chr${21); "q" ;
Else
Print At(X+P-l,Y)
Print Chr$(27) ;"q";
Print At (X+P, Y)
Endif
C=Bios (2,2)
B=C And 255
B$=Chr$(B)
C=C/&H10000 And 255
Exit If B=13 Or B=27
If B=127 And L>0 And P<=L
A$=Left$(A$, P-1)+Right$(A$,L-P)
L=Len(A$)
Endif
If B=8 And P>1 And L>0
A$=Left$(A$, P-2)+Right$(A$,L-P+1)
L=Len(A$)
Dec P
Endif
If C=75 And P>1
Dec P
Endif
If C=77 And P<=L
Inc P
Endif
If B=9
P=L+1
Endif
If ((B>31 And B<>127 And Z<>-1) Or (B>44 And B<58 And B<>47 And Z=-1)) And Lmax>L
If L>=P
A$=Left$(A$,P-l)+B$+Right$(A$,L-P+1)
Else
A$=A$+B$
Endif
L=Len(A$)
Inc P
Endif
Loop
Print At (X,Y);A$;" ";
Rueck$=A$
Return
'
' leere Procedur
Procedure N
Return
'
'
Procedure Fehler
Local Du
If Eflag=0
Alert 3,"Fehler Nr.:"+Str$(Err)+"| | ",1,"OK",Du
Close
Else
Alert 3,"Fehler im Druckertreiber|oder in Korrekturdaten| ",1,"OK",Du
Endif
Eflag=0
Cls
Menu Rollo$()
Resume Start
Return
'
'
Procedure Rahmung(A)
Dpoke Intin,A
Vdisys 104
Return
'
'
Procedure Delay(A)
Pause A
Return