Bilder i dator Vi ska se på bilder främst ur perspektivet datorstödd dokumentframställning. Det ligger nog något i talesättet»en bild säger mer än tusen ord.» Man behöver kunna infoga bilder i sina dokument, rita bilder och anpassa bilder så att de passar i dokument. Bilder finns av många slag: fotografier av olika slag, målningar och teckningar, diagram och datorgenererade bilder av 2D- eller 3D-objekt är några exempel. Det finns också många sätt att få in bilder i dator: bilden finns redan i dator, man kan använda bildläsare eller digitalkamera, man kan rita med musen eller ritplatta och något lämpligt program eller man kan göra en beskrivning av bilden (programmera). Det är ibland bra att göra en skiss med penna och papper, bildläsa den och renrita i något ritprogram. Exempel på program är Photoshop, Illustrator för teckning, språk såsom Postscript, Metafont och picture-omgivningen i Latex.
Postscript Postscript är ett»sidbeskrivningsspråk». Operationer påverkar»aktuell sida», en bitkarta (eller en bitkarta för varje delfärg). När en sida är färdig sänder operatorn showpage sidan till tryckverket och bitkartan återställs. Postscript är text som lätt kan överföras mellan program och också kan läsas av människor. Postscript-programmet tolkas normalt av en dator i utskriftsutrustningen. Postscript Language: Reference Manual (Addison & Wesley) 1990. URL Postscript har en lång historia med rötter från Ivan Sutherland vid företaget Evans and Sutherland via John Warnock och John Gaffney vid The ES Design System. John W flyttade till Xerox PARC 1978 och skapade där tillsammans med Martin Newell och Chuck Geschke JAM (John and Martin?) 1981. De gjorde sedan drivrutiner till många av Xerox laserskrivare. Steg mot enhetsoberoende gjordes med språket Press 1982 och med Interpress 1985. Interpress hade ungefär samma funktioner som tidig Postscript men binär lagring. Xerox ville inte släppa Interpress fritt. John W, Chuck G bildade tillsammans med Dough Brotz Adobe 1984 och skapade där Postscript. Ett viktigt steg är att Apple baserade sina laserskrivare på Postscript. Idag använder nästan alla laserskrivare och fotosättare samt många skärmhanterare PS. En ny tendens är att skrivare och skärmar istället arbetar direkt med PDF. PDF kan säga vara en kompilerad och komprimerad form av Postscript utan de programmeringskonstruktioner som finns i Postscript.
Postscript används alltså internt i de flesta datorsystem, men kan också användas som ett språk för människor att konstruera bilder med. Några begrepp i Postscript Aktuell sida trycks med showpage. De flesta geometriska former konstrueras i två steg: Först beskriver man konturer/banor (path). Konturer kan målas med angiven pensel och färg. Figur kan fyllas med angiven färg. Konturer byggs med räta linjer, cirkelbågar och kubiska splines. Färg kan vara gråton eller kulör. Tvåtonsbilder, gråtonsbilder och färgbilder kan infogas. Beskrivning av former underlättas av att man lätt kan ändra koordinatsystemet. Postscript är stackorienterat. Operander läggs på (exekverings-)stacken. Operatorer tar argument från stacken och lägger resultat på stacken samt kan ha bieffekter. Datatyper i Postscript är: integer, real, boolean, array, string, name, dictionary, operator, file, mark, null, save, fontid. Exempel 40 60 add 2 div Stackens successiva utseende med toppen åt höger:.. 40. 40 60. 100. 100 2. 50
Procedurer /average {add 2 div} def.. average. average {add 2 div} Operatorn def gör att proceduren {add 2 div} lagras under namnet average i aktuell symboltabell (dictionary). 17 40 60 average == pstack skriver 50.0 17 Man kan skicka en Postscript-fil till en Postscript-skrivare och få den tolkad och utskriven. Filen bör inledas med: %!PS-Adobe-3.0 Photoshop kan konvertera Postscript och EPS till bildpunktsbild, Acrobat med Distiller kan konvertera till PDF och Ghostview kan visa Postscript och EPS. Några viktiga avlusningshjälpmedel är operatorerna vadsomhelst == skriver toppelementet pstack skriver varje stackelement med == Med x y på stacken ger 180 mul cos exch 180 mul cos add 2 div 0.5(cos(180x) + cos(180y)). /box{ 0 1 rlineto 1 0 rlineto 0-1 rlineto closepath} def 72 72 scale 2 4.5 moveto box 0.04 setlinewidth stroke 5.5 2 moveto box fill showpage x y rlineto closepath
x y moveto num setlinewidth stroke fill showpage name value def Koordinatsystem Initialt är origo i nedre vänstra hörnet, x är åt höger och enheten är 1/72 inch. Koordinatsystemet kan flyttas, skalas, vridas och skjuvas (med transformationsmatris för»homogena koordinater»). Varje utmatningssystem har ett eget koordinatsystem, x. Postscript har alltid ett aktuellt koordinatsystem, x, och en aktuell transformation, T, som konverterar koordinater i det aktuella koordinatsystemet till enhetens koordinatsystem xt = x. En ändring av koordinatsystemet från x till x beskrivs också med en transformationsmatris, T. Om vi låter punkter vara radvektorer kan transformationsmatrisen skrivas som a b 0 c d 0 t x t y 1
men i Postscript skrivs den [a b c d t x t y ] (kallas matrix). Koordinatsystem kan ändras med operatorn matrix concat som åstadkommer T := matrixt eller med någon av t x t y translate [1 0 0 1 t x t y ] s x s y scale matrix=[s x 0 0 s y 0 0] v rotate [cos v sin v sin v cos v 0 0] Transformationer av detta slag är inte säkert kommutativa ordningen kan spela roll. 72 72 scale 2 2 translate /box{newpath 0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto closepath} def 1 72 div setlinewidth gsave box stroke 1 2 scale box stroke 30 rotate box stroke grestore 3 0 translate box stroke 30 rotate box stroke 1 2 scale box stroke showpage ger En transformationsmatris av formen [1 0 cos v sin v] innebär skjuvning dvs. ändring av vinkeln
mellan koordinataxlarna från 90 till v grader..
Rita en tårta /slice{ newpath 0 0 moveto 1 0 translate 15 rotate 0 15 sin translate 0 0 15 sin -90 90 arc closepath} def newpath x y translate vinkel rotate x y r v 1 v 2 arc % rosett 72 2.54 div dup scale 8 8 translate 4 4 scale 0.05 setlinewidth 2 1 13 { 13 div setgray gsave slice gsave fill grestore 0 setgray stroke grestore 30 rotate } for showpage gsave grestore s x s y scale num setgray fill beg steg gräns proc for
x 1 y 1 x 2 y 2 x 3 y 3 curveto
Text i Postscript Ett teckensnitt är en symboltabell (dictionary) som bl.a. innehåller en procedur för varje tecken en kodningstabell (encoding vector) som avbildar från 0..255 till namn på en»glyfprocedur» metrikinformation Teckensnitt av typ 1 är kodade, alltid konturer, effektiva typ 3, användardefinierade med glyfprocedurer av godtyckligt slag typ 0, sammansatta av tecken ur andra teckensnitt Grundstorleken är 1 enhet /smallfont /Times-Roman findfont 9 scalefont def /medfont /Times-Roman findfont 12 scalefont def /bigfont /Times-Roman findfont 18 scalefont def 228 204 moveto bigfont setfont (Architecture) show 228 174 moveto medfont setfont (In the sense in which Architecture) show 228 160 moveto (is an art) show showpage Architecture In the sense in which Architecture is an art name findfont dict dict faktor scalefont dict dict setfont string show proc string kshow
Litteraler»Litteraler» är skrivsätt för värden. Tecknen ( ) < > [ ] { } / % är specialtecken. Tal: 12-98 +17 -.002-1. 0.0 123.6e10 1E-5 8#1777 Vektor: [ 123 /abc (xyz) ] Procedur: {add 2 div} Symboltabell: << /Type /Font /Subtype /Type1 /BaseFont /Helvetica >> Syntax för strängar string == "(" ch * ")". ch =="\n"! "\r"! "\t"! "\b"! "\f"! "\\"! "\("! "\)"! "\" 0 3 oktala siffror! "\" radbyte! "\" annat tecken! tecken utom \. Sträng i sedecimal form (bas 16) <901fA> Strukturkonventioner Postscript-dokument bör följa»konventioner för strukturering av Postscript-dokument» (DSC version 3.0). Konventionen innebär att man lägger in rader som inleds med %% och således är kommentarer för interpretatorn men som ger viktig information till program som ska hantera Postscript-dokument. EPSF använder dessa funktioner för att beskriva objekt som kan fogas in i Postscriptdokument. En EPSF (encapsulated Postscript file) ska inledas med: %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: llx lly urx ury där ll betyder»lower left» och ur betyder»upper right». Koordinaterna bestämmer klippning och
relationen mellan EPS-objektets koordinatsystem och omgivningen. En EPS-fil innehåller ofta en lågupplöst bild att visa på skärmen. EPSF-exempel %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 5 5 105 105 10 setlinewidth 55 10 moveto 45 45 rlineto -45 45 rlineto -45-45 rlineto closepath stroke som bl.a. kan infogas i ett MSWord-dokument eller konverteras till PDF och infogas: Mer om Postscript Ett exempel på att rita en snögubbe. %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 250 330 340 470 /circle {1 1 moveto 0 1 1 0 360 arc} def % Rita en cirkel och förbered för % nästa med 0,2 radie överlapp % och 0,8 så stor /segment {circle gsave 1 setgray fill grestore stroke 0 1.8 translate 0.8 dup scale}
def % Ögat är en punkt ritad med bred % pensel /eye {0.5 1.5 moveto 0 0 rlineto 0.2 setlinewidth 1 setlinecap stroke} def % Näsan är en fylld triangel /nose {0.9 0.9 moveto 2 1 lineto 0.9 1.1 lineto closepath fill} def /snowman {0 setlinewidth segment segment circle gsave 1 setgray fill grestore stroke nose eye} def % Välj skala så att enheten blir % 1 cm. Placera snögubben mitt % på ett A4-papper. Linjebredden % skalas med koordinatsystemet men % bredd 0 tolkas som minsta möjliga % synliga bredd 72 2.54 div dup scale 10 12 translate snowman
Upplösningstest %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 220 220 72 25.4 div dup scale 60 dup scale /min { /a exch def /x exch def a x gt {x} {a} ifelse } def /picstr 2000 string def /j 3 def /m 80 def 2000 2000 8 [2000 0 0-2000 0 2000] {1 1 2000{ /ii exch def /i -3 ii 1 sub 0.003 mul add def % min(255,floor((sin(m* % arctan(x,y))+1)*256)) /f j i atan m mul sin 1 add 256 mul floor 255 min def %från -3 till 3 %beräkna f %lägg i picstr} for picstr ii 1 sub f cvi put} for /j j 0.003 sub def picstr
} image bool proc1 proc2 ifelse om bool är true utförs proc1 annars utförs proc2 bool proc if om bool är true utförs proc int string string string är en teckenvektor med int element numrerade 0..n 1 width height bitspersample matrix datasrc image En bild med height rader, width kolumner, bitspersample bitar per bildpunkt ritas, normalt i enhetskvadraten. matrix avbildar en width height-rektangel på enhetskvadraten i»rad-först-ordning och datasrc lägger en vektor med bilddata på stacken och anropas när image behöver mer bilddata. num floor int int blir floor(num) num cvi int int blir trunc(num) array index any put array[index]:=any
Todo defrita bilder: behovet, frihand och bildläsning eller med ritplatta, banor: Postscript, Illustrator, Metapost, picture, eps, PDF PS: historik, uppbyggnad och exempel, eps Metapost: Metafont, uppbyggnad och exempel picture-omgivningen, andra Latex-paket PDF: Distiller, Acrobat, Gnu, PDF-latex med hjälpmedel och exempel Bilder: lagring: kontinuerliga, bildpunkter, element, program, läsning: bildläsare, kamera, handbildläsare skrivning: bildskärm, laserskrivare, lasersättare, CTP Rastrering, Bildoperationer: geometriska, punktvisa, lokala, transformer Färg: färgseende, färgsyntes, färgomfång, färgrum, kvalitet, kalibrering, karaktärisering, färgtryck Photoshps begrepp, friläggning Datakomprimering, bildlagring, textläsning (OCR) Dokument på webben Presentation/projektion