Header einer IMG-Datei

Ähnliche Dokumente
Schleifenprogrammierung in C/C++, Fortran und Pascal

Programmierkurs: Delphi: Einstieg

MAXIMUM2.STR Struktogramme. Aufgabe: 3 Zahlen eingeben, größte Zahl ermitteln und ausgeben.

Suchen und Sortieren Sortieren. Heaps

Klausur in 12.1 Themen: Zahlsysteme, Grundlagen von Delphi (Bearbeitungszeit: 90 Minuten)

(Kurs B2 Grundlagen der Bildbearbeitung)

Delphi Grundkurs Seite 31

Das Turbo Pascal Lösungsbu

QR Code. Christina Nemecek, Jessica Machrowiak

Kurs 1575, Musterlösung zur Winter Klausur 2003/04

Formularbearbeitung mit EPLAN 5.60/5.70

Informatik GK 12 Klassen Klassen programmieren in Delphi am Beispiel der konkreten Klasse Auto

Digitale Bildverarbeitung (DBV)

Steuern des GSR-Interface mit QBasic

Sortieren durch Einfügen. Prof. Dr. W. Kowalk Sortieren durch Einfügen 1

phycam VM Remapping

Buch-Add-Ons. Jürgen Bayer. Object Pascal-Tipps und Tricks. 1 Konvertieren und auf numerische Werte überprüfen 2

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

FlowFact Alle Versionen

Kurs 1613 Einführung in die imperative Programmierung

Wir lernen PowerPoint - Grundkurs - Präsentation

PDF-Dateien erstellen mit edocprinter PDF Pro

Dingsda - Bedienungsanleitung unter Windows

Slices und Rollover für die Startseite einer Bildergalerie

H. Tornsdorf М. Tornsdorf. Das große Buch zu

Programmierung in Delphi

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Grafikformate. Grafikformate. Digitale Bildverarbeitung Bildkompression

E-PRIME TUTORIUM Die Programmiersprache BASIC

Arbeiten mit Turbo Pascal 5.0

Belegarbeit für Algorithmen und Programmierung 1 & 2. Thema : Datenbank zur Erfassung von LP s, CD s & MC s

BEDIENUNGSANLEITUNG Programmier-Software FPS10SOFT

Erzherzog Johann Jahr 2009


Bildbearbeitung in Word und Excel

VWA Rhein-Neckar Dipl.-Ing. Thomas Kloepfer. Kommunikation I (Internet) Übung 4 PHP

Bedienungsanleitung DP3 Report

Grundlagen der Informatik 2

Web Datei Formate GIF JPEG PNG SVG. Einleitung. GIF Graphic Interchange Format. JPEG Joint Photographic Expert Group. PNG Portable Network Graphic

12 Dokumente verwalten

Index. Symbole! 23!= B Bedingte Ausführung

Druckerscriptsprache

Über Arrays und verkettete Listen Listen in Delphi

BAUINFORMATIK. SS 2013 Vorlesung 1 Johannes Lange

P r o g r a m m a b l a u f s t e u e r u n g

HTML Programmierung. Aufgaben

Zielstellung - "bildhafte" Darstellung von Informationen. "Ein Bild sagt mehr als 1000 Worte"

KOMPRIMIERUNGS & VERSCHLÜSSELUNGS- TOOL

Fernschach-Verwaltung mit Chess Base

Bildbearbeitung: Grafikformate II und Farbmodelle

BEI UNS RICHTIG! Sie suchen nach einer Möglichkeit die Druckausgaben eines Programms in ein Handbuch zu übertragen? Hier werden Sie fündig!

Bilder im BMP Format (1)

Von: Sven Weltring, Viola Berlage, Pascal Küterlucks, Maik Merscher

WORKSHOP für das Programm XnView

VWA Rhein-Neckar Dipl.-Ing. Thomas Kloepfer. Kommunikation I (Internet) Übung 1 Telnet und FTP

Simple Picture Slicer

Dr. Monika Meiler. Inhalt

HEINZ MARTIN PRINTSCREEN BETRIEBSANLEITUNG. Rev 2.11

Das Handbuch zu KSnapshot

2. Darstellung von Information im Computer

Ein Word-Dokument anlegen

Achtung! Speichern nicht vergessen

Shell-Programmierung

Projekt: Programmierung mit dem. Grafikfähiger Taschenrechner CASIO CFX-9850GB Plus

Bedienungsanleitung Anlassteilnehmer (Vereinslisten)

PSRDesigner. Punkt und Streifenrasterplatinen Designer

Mit Wordpad unter Windows 7 arbeiten

Sortieren. Eine Testmenge erstellen

Access [basics] Programmieren mit Arrays. Beispieldatenbank. Arrays. Eindimensionale Arrays. VBA-Grundlagen Programmieren mit Arrays

Sin-Funktion vgl. Cos-Funktion

USB-Stick (USB-Stick größer 4G. Es ist eine größere Partition notwendig als die eines 4GB Rohlings, der mit NTFS formatiert wurde)

Import von Daten aus Word nach KlasseDozent

Zugriff auf Daten der Wago über eine Webseite

Die i-tüpfelchen: Favicons

GCM 100 GRAF-SYTECO H019A00. SYsteme TEchnischer COmmunication anzeigen, bedienen, melden, steuern, visualisieren und zählen

Übungen Programmieren 1 Felix Rohrer. Übungen

Es gibt situationsabhängig verschiedene Varianten zum Speichern der Dokumente. Word bietet im Menü DATEI unterschiedliche Optionen an.

Informationszentrum Hochschule Karlsruhe. Anleitung Plotter

Tutorium Learning by doing WS 2001/ 02 Technische Universität Berlin. Erstellen der Homepage incl. Verlinken in Word 2000

Stefan Gössner Multimedia: Eine Einführung. Was ist Multimedia? Was ist ein Medium? Was ist Multimedia? Multimedia?

ECDL / ICDL Tabellenkalkulation

TR75E002-A FA / Bedienungsanleitung Industrie-Handsender-Verwaltung IHV DEUTSCH

Hilfe zur Dokumentenverwaltung

Version 0.3. Installation von MinGW und Eclipse CDT

12. ArcView-Anwendertreffen Workshop Programmierung in ArcGIS. Daniel Fuchs. Wo kann eigene Programmierung in ArcGIS verwendet werden?

Dateiname Name(n) und Matrikelnr. des/der Bearbeiter Tel.-Nr. und -Adresse für den Fall, dass die Diskette nicht lesbar ist.

Einführung in die Angewandte Bioinformatik

Befundempfang mit GPG4Win

Begriffe: (grafische) Benutzeroberfläche, (grafische) Benutzerschnittstelle,

Hochschule Niederrhein Grundlagen der Prof. Dr. Nitsche Fachbereich 03 Java Programmierung Bachelor Informatik SS 2015 Übung 1. Grundlagen von Java

Optionen. Optionen Allgemein

Variablen eines einfachen Typs können jeweils nur einen Wert annehmen. Turbo-Pascal stellt 6 einfache Datentypen zur Verfügung.

19. Mai 2015 L A TEX. Grafiken. Prof. Dr. Alexander Braun // Wissenschaftliche Texte mit LaTeX // WS 2014/15

Einführung zum MS Visual Studio

Sommersemester 2003 Martin Ellermann Heiko Holtkamp. Interaktive Webseiten mit PHP und MySQL

Transkript:

Bits mit Image Das IMG-Grafikformat entschlüsselt Neben dem PCX Grafikformat ist das IMG Format von GEM weit verbreitet. Obwohl der überwältigende Erfolg von Windows 3.0 das Ende von GEM einzuläuten scheint, gibt es nach wie vor viele Grafikprogramme, die IMG Dateien erzeugen. Damit Sie Ihre wertvollen Bilddaten auch weiterhin verwenden können, legen wir das IMG Format offen. Der generelle Aufbau einer IMG-Datei unterscheidet sich nur in wenigen Punkten von anderen Grafikformaten. Zu Beginn der Datei steht der Header mit den Eckdaten der Grafik. Alle Werte sind mit zwei Byte codiert, wobei aber zu beachten ist, daß das Low- und High-Byte des Wortes jeweils vertauscht ist. Es steht immer zuerst das High-Byte und erst danach folgt das Low-Byte. Der Header besteht derzeit aus 8 Worten, also 16 Byte, deren Bedeutung in der Tabelle erläutert ist. Da die Pixelgröße in Mikrometer gespeichert ist, lassen sich IMG-Bilder mit den richtigen Proportionen auf unterschiedlichen Geräten ausgeben. Der siebte Eintrag im Header (Wort 6) gibt die Länge einer Zeile an. Er wird für jeweils eine Farbebene angegeben. Im Gegensatz zu den meisten anderen Grafikformaten wird die Höhe des Bildes nicht im Header gespeichert. Daraus ergeben sich eine Reihe von Problemen bei der korrekten Skalierung des Bildes. Wort Header einer IMG-Datei Bedeutung 0 Version der Datei (in der Regel 1) 1 Kopflänge in Worten 2 Anzahl der Farbebenen 3 Länge eines Musters 4 Pixelbreite in Mikrometer 5 Pixelhöhe in Mikrometer 6 Länge einer Zeile in Pixel = Bits 7 Anzahl der Elemente in der Datei Wenn man ein und dasselbe Bild sowohl im IMG als auch im PCX-Format speichert, fällt sofort auf, daß die IMG-Datei in der Regel kleiner ist als die entsprechende PCX-Datei. Und das hat seinen Grund. Während PCX nur eine Lauflängen-Komprimierung kennt, werden in IMG-Dateien gleich vier verschiedene Komprimiermethoden angewandt: vertikale Wiederholung, Solid Run, Pattern Run und Bit String. Bei der einfachsten Methode, der vertikalen Wiederholung, werden einfach identische Bildschirmzeilen zusammengefaßt. Dazu benötigt GEM insgesamt vier Byte. Die ersten drei Byte dienen als Flag zur Erkennung des Codes und haben immer die Werte 00h, 00h und FFh. Im vierten Byte steht schließlich die Anzahl der identischen Bildschirmzeilen. Damit lassen sich maximal 255 Zeilen in 4 Byte unterbringen, aber diese enorme Komprimierung bringt auch Nachteile mit sich. Da die maximale Anzahl der Bildschirmzeilen nicht bekannt ist, muß die Ausgaberoutine immer prüfen, ob nicht die letzte Bildschirmzeile erreicht worden ist. Anderenfalls könnte es zu unangenehmen Überraschungen kommen. Innerhalb einer Zeile kennt GEM drei Methoden zum Codieren der Farbinformationen. Jede Zeile besteht aus einer (CGA und Hercules) oder mehreren Farbebenen (EGA und VGA). Alle Ebenen einer Zeile werden nacheinander codiert, wobei GEM versucht, die einzelnen Bits bestmöglich zu packen. Wenn mehrere aufeinanderfolgende Bytes entweder nur den Wert 00h oder FFh haben, genügt es, die Anzahl der sich wiederholenden Bytes zu codieren. Diese Lauflängenkomprimierung wird Solid Run genannt. In nur einem Byte lassen sich bei Schwarz-weiß-Darstellungen bis zu 127 Byte codieren. Haben die aufeinanderfolgenden Bytes den Wert FFh (schwarz), wird das das erste Bit des codierten Byte auf 1 gesetzt. Die restlichen 7 Bit des codierten Byte repräsentieren die Länge der aufeinanderfolgenden Bytes mit dem Wert FFh. Das gleiche gilt für ein Feld von aufeinanderfolgen 00h-Bytes (weiß). In diesem Fall wird das erste Bit des codierten Byte auf 0 gesetzt. Wenn ein Bild aus Mustern zusammengesetzt ist, lassen sich diese zu einem Pattern Run zusammenfassen. Allerdings offenbart sich dabei eine kleine Schwäche des Formats. Die Länge eines Musters ergibt sich aus Wort 3 des Headers und gilt für alle Muster der Datei. Ein Muster muß also immer dieselbe Länge haben. In der Regel wird der Wert 2 (Byte) verwendet.

Im Gegensatz zum Solid Run muß dieses Format über ein Flag zur Kennzeichnung der Komprimiermethode verfügen. GEM verwendet dazu den Wert 00h, dem die Anzahl der Muster und das Muster selbst folgen. Handelt es sich um ein einmaliges Muster, so muß auch GEM kapitulieren. Solche Bytefolgen können lediglich unkomprimiert als sogenannter Bit String abgelegt werden. Als Erkennungsflag verwendet GEM den Wert 80h, dem die Anzahl der Bytes und die Werte selbst folgen. Betrachtet man sich diese Codes, so ergibt sich eine zwangsläufige Reihenfolge bei der Decodierung. Denn die Solid-Run-Methode verfügt über kein Erkennungsflag. Deshalb müssen zuerst alle übrigen Flags abgefragt werden. Für die Praxis bedeutet dies: Test auf vertikale Wiederholung (mehrere identische Zeilen) Test auf Pattern Run und Bit String Alles übrige ist ein Solid Run Im Gegensatz zum PCX-Format verfügen IMG-Dateien über keinerlei Farbpaletten-Informationen. Die Farben sind so zu setzen, wie sie im Speicher stehen. Diese Schwäche ist ein weiterer Grund dafür, daß das Format immer seltener eingesetzt wird. Allerdings gibt es noch viele Archive mit IMG-Dateien, so daß man nur wissen muß wie diese Dateien codiert sind. Im folgenden stellen wir daher ein Programm (Listing) vor, das in der Lage ist, IMG-Dateien auf CGA-, EGA-, VGA- und Hercules-Bildschirmen darzustellen. Sie können es mit Turbo oder Quick Pascal kompilieren. Sie starten das Programm mit dem Befehl SHOWIMG Dateiname. Den Namen der IMG-Datei können Sie mit oder ohne Dateiendung eingeben. Das Lesen von IMG-Dateien und das Darstellen der Bilder ist im allgemeinen recht einfach. Etwas schwieriger ist das Drucken und das Konvertieren zu einem anderen Format. Es ergeben sich nämlich eine Reihe von Problemen, die durch die mögliche vertikale Wiederholung ausgelöst werden. Es führt letztendlich kein Weg daran vorbei, einen temporären Puffer zu verwalten, der in der Lage ist, bis zu 255 Zeilen zu halten. In diesem Fall müssen Sie eine virtuelle Speicherverwaltung in Ihr Programm einfügen. Dietmar Bückart

Pascal Programm zur Bildschirmausgabe von IMG Dateien {$R-,S-,I-} USES CRT, DOS, GRAPH; IMGFile IMGName Pattern Muster MusterLen, Planes, Breite, Links, MaxBits, ActX,ActY gd, gm : FILE OF BYTE; : STRING[79]; : ARRAY [1..16] OF BYTE; : ARRAY [0..4095] OF BYTE; : WORD; : INTEGER; FUNCTION GetIMGHeader : INTEGER; I, J : BYTE; HeadLen : WORD; Assign (IMGFile, IMGName); Reset (IMGFile); DOSERROR := IOResult; IF DOSERROR <> 0 THEN GetIMGHeader := DOSERROR; EXIT; Seek (IMGFile, 2); { die Versionsnummer überspringen } Read (IMGFile, I, J); { die Länge des Vorspanns lesen } HeadLen := I*256+J; { Bytes vertauschen! } Read (IMGFile, I, J); { Anzahl der Planes lesen } Planes := PRED(I*256+J); { Bytes vertauschen! } Read (IMGFile, I, J); { Musterlänge lesen } MusterLen := I*256+J; { Bytes vertauschen! } Seek (IMGFile, 12); { Erzeuger-Info überspringen } Read (IMGFile, I, J); { Bildbreite lesen } Breite := I*256+J; { Bytes vertauschen! } Links := ((640-Breite) DIV 2) AND $FFF8; Seek (IMGFile, HeadLen*2); GetIMGHeader := 0; PROCEDURE SetEGAWritePlane(Nr : BYTE); PORT[$3C4] := 2; PORT[$3C5] := 1 SHL Nr; PROCEDURE Anzeigen (v,f: BYTE; Count: WORD); I : BYTE; L, Adrs : WORD; L := ActY; { Bildschirmzeile übernehmen } IF (gd=3) OR (gd=9) { richtige EGA-Plane setzen } THEN SetEGAWritePlane(f); { falls EGA oder VGA } IF (ActX+Count*8) > MaxBits { rechten Rand beachten! } THEN Count := (MaxBits DIV 8) - (ActX DIV 8); FOR I := 0 TO PRED(v) DO CASE gd OF 3, 9 : { VGA } Adrs := L*80 + (ActX SHR 3); Move (Muster, Mem[$A000:Adrs], Count);

7 : { Hercules } Adrs := (L AND 3) SHL 13 + 90*(L SHR 2) + (ActX SHR 3); Move (Muster, Mem[$B000:Adrs], Count); 1 : { CGA } Adrs := (L AND 1) SHL 13 + 80*(L SHR 1) + (ActX SHR 3); Move (Muster, Mem[$B800:Adrs], Count); INC(L); IF L > GetMaxY THEN EXIT; INC(ActX, Count*8); PROCEDURE GetScanLine; I, J, C, Farbe, VertRep : BYTE; Count : WORD; Read (IMGFile, I, J, C); IF (I=0) AND (J=0) AND (C=$FF) THEN Read (IMGFile, VertRep) ELSE IF (I=0) AND (J=0) THEN EXIT ELSE Seek (IMGFile, FilePos(IMGFile)-3); VertRep := 1; FOR Farbe := 0 TO Planes DO ActX := Links; WHILE (ActX < Breite+Links) DO CASE I OF $00: { Pattern Run } FOR J := 1 TO MusterLen DO Read (IMGFile, Pattern[J]); FOR J := 0 TO 1-1 DO Move (Pattern, Muster[J*MusterLen], MusterLen); Count := I*MusterLen; $80: { BitString } FOR J := 0 TO PRED(I) DO Read (IMGFile, Muster[J]); Count := I; ELSE Count := I AND $7F; IF (I AND $80)=0 THEN FillChar (Muster, Count, 0) ELSE FillChar (Muster, Count, $FF); IF ActY <= GetMaxY THEN Anzeigen(VertRep, Farbe, Count); INC(ActY, VertRep);

PROCEDURE EncodeIMG; WHILE (NOT Eof(IMGFile)) { Dateiende noch nicht erreicht } AND (NOT KeyPressed) { und keine Taste gedrückt } AND (ActY < GetMaxY) { und Bildschirmende nicht erreicht } Do GetScanLine; { Zeile bearbeiten } IF (ParamCount = 0) THEN Writeln(^J^M'Sie haben keinen Dateinamen angegeben.'^j^m); HALT; END ELSE IMGName := ParamStr(1); IF Pos('.', IMGName)=0 THEN IMGName := IMGName+'.img'; IF (GetIMGHeader <> 0) THEN Writeln(^J^M'Datei ', IMGName, ' nichtgefunden!'^j^m); HALT; ActX := 0; ActY := 0; DetectGraph(gd, gm); InitGraph(gd, gm, ''); CASE gd OF { für Test im Anzeigen() } 1, 3, 9 : MaxBits := 640; 7 : MaxBits := 720; EncodeIMG; REPEAT UNTIL KeyPressed; Close (IMGFile); RestoreCrtMode; END. aus mc 01/91 Seite 116-119