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:
- Ein (einfacher) Drucker oder ein Plotter
- Eine Photozelle mit logarithmischem A/D-Wandler
- Scannersoftware mit USM-Algorithmen zum Verdoppeln der BildschÀrfe
- Scannenswerte Vorlagen
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.
Hardware
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.
Das Platinenlayout im MaĂstab 1:1
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.
Bild 1: Das Schaltbild
Die Software
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:
- Alle Funktionen und MenĂŒpunkte sind mausgesteuert. ZusĂ€tzlich kann die rechte Maustaste einige MenĂŒpunkte direkt auf dem Bildschirm auswĂ€hlen (z.B. aus dem Druckertreiber).
- Eingaben mĂŒssen mit der < Return >-Taste beendet werden.
- Zusammen mit dem Drucker treiber speichert bzw. lÀdt man auch alle Bildkorrekturdaten.
- Der eigentliche Druckertreiber (im MenĂŒ ganz oben) schickt folgende vier unterschiedlichen Zeichenketten a den Drucker:
4.1 Zuerst wird der Drucker initialisiert. Dies geschieht einmalig vor der Abtastung und stellt Geschwindigkeit, VorschĂŒbe oder Ă€hnliches eil Diese Zeichenkette wird unte dem MenĂŒpunkt âInitialisierenâ eingegeben.
4.2 WĂ€hrend der Abtastung wird fĂŒr jeden horizontalen Vorschub die 2. Zeichenkette (âHör. Vorschubâ) ausgegeben.
4.3 FĂŒr jede neue Zeile muĂ ein WagenrĂŒcklauf und ein Zeilenvorschub erfolgen. Das erledigt die dritte Zeichenkette. (âVert. Vorschubâ)
4.4 Die vierte Zeichenkette soll den Drucker wieder in den normalen Betriebszustand zurĂŒckstellen. Sie wird unter âAbschluĂâ eingegeben.
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 >.
Scanner - Praxis
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:
- Die Vorlage muĂ gleichmĂ€Ăig ausgeleuchtet werden. Die Ausleuchtung wird durch Abtasten eines weiĂen Blatt Papiers kontrolliert. Hierbei stellt man in Blattmitte mit dem Abtasthelligkeitsregler an der kleinen Elektronik etwa 8 Helligkeitspunkte ein und fĂ€hrt anschlieĂend an die PapierrĂ€nder. Die Helligkeitswerte dĂŒrfen sich nur unwesentlich verĂ€ndern.
- Fremdlicht muà man abschirmen. Ein nahes Fenster beleuchtet mit. Wenn nun plötzlich Wolken aufziehen, kommt es zu einem horizontalen Schattenstreifen.
- Reflexionswinkel unbedingt vermeiden. Die oftmals glĂ€nzenden Vorlagen reflektieren wie ein Spiegel. Schlimmstenfalls sieht unser Scanner dann nur noch eine GlĂŒhbirne bzw. Neonröhre.
- Beim Flachbettplotter hat es sich bewĂ€hrt, die Photozelle um 45° zu neigen. Dadurch wirft sich die Photozelle selbst keinen Schatten. Die Belichtungslampe hat einen Abstand von ca. 80 cm und steht senkrecht ĂŒber der Vorlage.
- Beim Drucker gibt es weniger Reflexionsprobleme, denn auf der gewölbten Vorlage konzentriert sich die Reflexion auf einer Linie. Die Lichtquelle (senkrecht ĂŒber der Walze) darf wesentlich nĂ€her ĂŒber der eingespannten Vorlage sein. 30 cm Abstand genĂŒgen zur gleichmĂ€Ăigen Ausleuchtung.
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Ă:
- Ein Bild von der GröĂe 100 * 100 mm soll auf 150 * 150 Bildschirmpixel gescannt werden.
- Dazu mĂŒssen 75 * 75 Abtast-Pixel (=Urpixel) eingescannt werden.
- Die Schrittweite horizontal betrÀgt 100 mm / 75 = 1.33 mm
- Die Schrittweite vertikal betrÀgt ebenfalls 1.33 mm
- Der Druckertreiber wird entsprechend der obigen Vorgabe eingestellt. Horizonta1-und Vertikalvorschub lassen sich auf 1.4 mm einstellen. Das ist nahe genug am Wunschwert 1.33 mm. Das abgetastete Bild fĂ€llt also etwas kleiner als gewĂŒnscht aus. Mit der Option âZoomâ kann das Wunschformat spĂ€ter genau erreicht werden.
- Da das Urpixel etwas gröĂer geraten ist, benötigt man auch weniger Abtast-Schritte: 100 mm / 1.4 mm = ca. 71 Schritte
- Die Schrittzahlen sind unter Schrittzahl horizontal bzw. vertikal einzugeben.
- Die Abtastöffnung der Photozelle wÀhlt man etwas kleiner als die Schrittweite (Hier also ca. 1mm Durchmesser).
- Die Steuercodes fĂŒr den Druckertreiber werden fĂŒr die Abtastschrittweite 1,4 mm ediert. Diese Zeichenkette paĂt den Drucker- (bzw. Plotter-) Typ an.
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:
- USM breit: Normalerweise sind Eigaben von ca. 5 praxisgerecht. Gibt man 0 ein, bleibt die SchĂ€rfe auf Urbildniveau. âUSM breitâ arbeitet auf Urpixel-Ebene und verstĂ€rkt dĂŒnne Linien und kleine Punkte. Es funktioniert nur, wenn die Abtastöffnung der Photozelle stimmt (Sie muĂ etwas kleiner als die Abtastschrittweite sein).
- USM schmal: Auf Werte um die Zahl 5 stellen. âUSM schmalâ arbeitet auf Bildschirmpixel-Ebene (also 1/4 Urpixel) und verhindert u.a. die âTreppchen-Effekteâ an diagonal verlaufenden Kanten. Auch hier muĂ die Breite der Abtastöffnung stimmen.
- Umfang: Funktioniert analog zu Helligkeit und Kontrast mit dem Vorteil, daĂ sich die beiden Einstellungen nicht beeinflussen. Licht wirkt nicht auf dunkle Bildinhalte und umgekehrt. Wenn Abtastkontrast und -helligkeit gestimmt haben, gibt man hier die Zahl 0 ein, ansonsten zwischen +-5.
- Gradation: Ăhnlich wie Umfang. Diese Einstellungen wirken aber nur auf ganz bestimmte Helligkeitsbereiche. Normalerweise stellt man 0 ein. Falls erforderlich, gibt man Werte bis +-5 ein. Positive Zahlen erhöhen stets die Helligkeit und umgekehrt. Die Gradation verĂ€ndert hellere, mittelhelle und dunkle Grautöne unabhĂ€ngig voneinander.
Ich wĂŒnsche noch viel SpaĂ beim Basteln und hoffe, daĂ mein kleines Programm Verwendung findet.
Der Autor selbst
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