Farbtiefe von Bildern

Alles zum Thema DOS was nicht in die anderen Kategorien passt
Antworten
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Farbtiefe von Bildern

Beitrag von drzeissler »

Guten Abend,

in frühen Doszeiten waren die Rechner nicht gerade mit hochauflösenden Grafikkarten die zudem noch eine große Anzahl an Farben darstellen konnten gesegnet.

Es gab früher daher Bilder die entweder auf 256 Farben "optimiert" waren, oder 32K bzw. 64K Farben hatten. 24 oder gar 32Bit Farbtiefe war früher unter Dos noch nicht so verbreitet.

Irgendwie habe ich ein Verständnisproblem, was die Anzahl von Farben betrifft.

Ziel ist es, Bilder zur Darstellung auf den Retro-Rechnern zu optimieren, d.h. es sollen so wenig wie möglich an Verschlechterungen festzustellen sein.

Ausgangsmaterial sind True-Color Bilder, Endergebnis sollen 64K-Bilder sein.

Wenn ich bspw. ein Bild von PaintshopPro die Echtfarben zählen lasse, dann kommen hierbei ca. 160 Tausend unterschiedliche Farben heraus. Wechsel in auf 64K Farbtiefe sind es aber nur noch rund 15 Tausend. Ich hätte erwartet, dass es zumindest auf die 64k Farbtiefe voll nutzt.

Weis jemand, woran das liegt ?

Danke
Doc

Hier das Original:
http://gfxzone.planet-d.net/personal/la ... -smok.html
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
SeriTools
MemMaker-Benutzer
Beiträge: 65
Registriert: Do 2. Jun 2011, 13:53
Wohnort: Wuppertal
Kontaktdaten:

Re: Farbtiefe von Bildern

Beitrag von SeriTools »

Hi,

das liegt wohl an der Speicherung der Farbwerte. Bei 256-farbigen Bildern gibt es eine Palette am Anfang der Datei, in der die angegebenen Indizes mehrbytigen Farbwerten zugeordnet werden.

Bei 64K Farben (aka 16-Bit) wird das für jeden Farbwert einzeln gespeichert (http://en.wikipedia.org/wiki/High_color).

lg SeriTools
wobo
DOS-Guru
Beiträge: 613
Registriert: So 17. Okt 2010, 14:40

Re: Farbtiefe von Bildern

Beitrag von wobo »

drzeissler hat geschrieben: Irgendwie habe ich ein Verständnisproblem, was die Anzahl von Farben betrifft.

[...]
Ausgangsmaterial sind True-Color Bilder, Endergebnis sollen 64K-Bilder sein.

Wenn ich bspw. ein Bild von PaintshopPro die Echtfarben zählen lasse, dann kommen hierbei ca. 160 Tausend unterschiedliche Farben heraus. Wechsel in auf 64K Farbtiefe sind es aber nur noch rund 15 Tausend. Ich hätte erwartet, dass es zumindest auf die 64k Farbtiefe voll nutzt.

Weiss jemand, woran das liegt ?
Farben werden im PC-Bereich (VGA) durch den Rot-Grün-Blau-Farbraum (RGB) beschrieben. Bei 24bit TC werden die Rot-, Grün- und Blauanteile einer Farbe durch je 8 bit beschrieben (3*8bit=24bit). Praktisch bedeutet dies, dass die Rot-, Grün-, Blauanteile einer Farbe je durch Intensitätsabstufungen aus dem Wertebereich von 0-255 (8 bit) dargestellt werden. Hast Du z.B. in 24 bit TC (genauso bei 32 bit TC) ein Bild was nur reine Rottöne verwendet, dort aber alle Helligkeitsabstufungen, dann verwendet das Bild lediglich 256 verschiedene Farben: nämlich 256 Farben, die sich nur dadurch unterscheiden, dass der Rotanteil der Farbe zwischen 0..255 variiert, während die Grün- und Blauanteile alle Null sind.


Im 64k-Mode stehen nur noch 16bit anstelle von 24bit zur Verfügung. Die RGB-Anteile werden durch Rot (5 bit), Grün (6 bit) und Blau (5 bit) beschrieben. Willst Du jetzt das Rotton-Bild aus obigen Beispiel in dem 64k-Mode darstellen, so hast Du für die Rottöne nur noch 5 bit, d.h. 32 verschiedene Abstufungen. Unser Rotton-Bild würde daher im 64k-Mode nur noch mit 32 Farben dargestellt.

Der 64k-Mode umfasst - anders als die 256-Farbmodi - also nicht die besten 64k-Farben aus TC, sondern er erfasst eben nur fixe 64k, die (theoretisch) immer dieselben sind.

Das Rotton-Bild aus obigen Beispiel würde z.B. im 256-Farbmodus besser dargestellt. Der 256-Farbmodus (in der Standardausführung VGA) erlaubt die Zusammenstellung der 256 Farben aus einem 18 bit Farbraum, wobei Rot, Grün und Blau alle je 6 bit umfassen, d.h. 64 Intensitäten ausmachen können. Das Rotton-Bild aus obigen Beispiel würde daher im 256-Farbmodus mit 64 Farben dargestellt, da dort eben max. 64 verschiedene Rottöne möglich sind.

Zwar erlauben viele Programme auch den Einsatz von Filter/Ditherfunktionen bei der Reduzierung der Farben. Aber auch diese können nicht zaubern. Bei dem Rotton-Bild aus obigen Beispiel können ein Großteil der Grün- und Blaufarben aus dem 64k-Modus einfach nicht verwendet werden.
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Farbtiefe von Bildern

Beitrag von DOSferatu »

Daß auf ca. 15tausend und nicht 65536 Farben gewandelt wird, hängt damit zusammen, daß 16bit-Bilder (und 15bit-Bilder) keine Farbpalette benutzen, sondern so gespeichert werden, wie es die Grafikkarte auch im 16bit-Mode anzeigen würde. Im 16Bit-Mode werden die 16 bit (meistens) so zusammengesetzt: 5 Bit für Rot (also 32 Rot-Stufen), 6 Bit für Grün (also 64 Grün-Stufen) und 5 Bit für Blau (also 32 Blau-Stufen), die Farbbits sind dann wirklich so auf die 16 Bit aufgeteilt:

Code: Alles auswählen

15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
B  B  B  B  B  G  G  G  G  G  G  R  R  R  R  R
Das heißt: Von den 24bit-Farben werden einfach von Rot und Blau die unteren 3 Bit weggeschnitten und von Grün die unteren 2 Bit. Daß nicht 65536 Farben benutzt werden, sondern weniger, liegt einfach daran, daß es kaum "kakelbunte" Bilder gibt, die ALLE 65536 Farben benutzen, die mit dieser Methode darstellbar sind - will sagen: Wenn im Bild nichts vorkommt, das Pink/Lila ist, sind die ganzen Farbkombinationen aus Blau und Rot, die dies darstellen, nicht benutzt.

Mir ist jedenfalls kein Grafikformat bekannt, das für mehr als 256 Farben noch eine Farbpalette benutzt. (Außerdem kenne ich persönlich gar keine Grafikformate [was nicht heißen soll, daß es so etwas nicht geben könnte], die 15bit oder 16bit sind - dies geschieht eigentlich nur auf dem Rechner, weil der entsprechende Grafikmodus eingestellt ist.

Ein Grafikformat wie Du es meinst (also mit einer 16Bit Palette) würde für jeden Pixel 2 Byte brauchen - und die Palette selbst wäre 196608 Bytes groß. Bei vielen kleinen und mittelgroßen Bildern hätte man kaum Speicherersparnis durch das Wandeln von 24bit in ein solches Format - man hätte lediglich einen Qualitätsverlust.

Desweiteren wird/wurde bei Wandlung von 24bit-Bildern in z.B. 8bit (palettenbasiert) Bildern zunächst erst einmal eine "Sub-Palette" gebildet, die z.B. alle 15bit Farben hat und 64kB groß ist. Diese 64kB sind nicht die Farben selbst (diese sind ja durch ihre "Stelle" definiert, da immer BBBBBGGGGGRRRRR), sondern 16bit große Zähler (Word). Dann wird das Bild abgescannt, die auftretenden Farben (ohne die jeweiligen unteren 3 Bit jeder Phase) jeweils gezählt, d.h. der Zähler an dieser Stelle erhöht. Und am Ende werden dann entweder die meisten 256 Farben genommen. Oder ähnliche zusammengefaßt und genommen und dann die meisten. Oder andere, kniffligere Methoden benutzt. (16bit reichen als Zähler normalerweise aus. Steht ein Zähler auf 65535, wird nicht weitergezählt - es können ja nicht ALLE 32768 Farben mehr als 65535mal vorhanden sein - das wäre ein riesiges Bild...)
Das ist z.B. eine der Methoden, die ich benutze, um von 24bit in 8bit zu wandeln (mit der "beste Verteilung" Methode). Und es könnte sein, daß viele andere Leute ebenfalls untere Farbphasenbits eliminieren vor dem eigentlichen Wandeln.

Ein anderer Grund könnte natürlich ein ganz profaner sein:
Es werden keine Bits abgeschnitten, aber das 24bit-Bild enthielt eben nur ca. 15tausend Farben (aus 16777216 möglichen), so daß bei Wandlung in 16bit gar nicht 65536 gebraucht wurden!
Zuletzt geändert von DOSferatu am Sa 28. Apr 2012, 10:23, insgesamt 1-mal geändert.
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Farbtiefe von Bildern

Beitrag von DOSferatu »

Oh, da hat wobo wohl gleichzeitig mit mir eine Antwort geschrieben und er war schneller fertig.
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Farbtiefe von Bildern

Beitrag von drzeissler »

Aha! Das erklärt dann auch, warum solche Bilder mit nur 256! Farben möglich sind.
http://gfxzone.planet-d.net/personal/la ... oison.html

Dennoch muss es auch Profitools geben, die das Maximum aus Bildern herausholen, selbst wenn die Bilder nur noch 32K oder 64K Farben haben. Ich kann mich ganz dunkel an meinen 386er erinnern. Da gab es Bilder von einem Spaceshuttle-Start. Das war mit mehr als 256 Farben, hatte aber keine 16,7 Mio dennoch sah man keinen Unterschied, also keine Raster oder so.

Wie Du schon richtig bemerkt hast, liegt die Darstellung auch an dem Bild bzw. dessen Palette selbst.
Dieses hier wird in 64K Farben gar nicht so sehr verschlechtert.
http://gfxzone.planet-d.net/personal/la ... nster.html

Thx
Doc
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Farbtiefe von Bildern

Beitrag von freecrac »

DOSferatu hat geschrieben:Oh, da hat wobo wohl gleichzeitig mit mir eine Antwort geschrieben und er war schneller fertig.
Und ich habe ehrlich gesagt gleich auf deine Antwort gehofft, weil du es immer so schön erklären kannst.
Aber zwei Antworten sind ja auch nicht schlecht, dann kann man es noch einmal aus einen anderen Perspektive betrachten.

Dirk
Brueggi

Re: Farbtiefe von Bildern

Beitrag von Brueggi »

Sorry, aber ich buddel den Thread mal wieder aus. Kann jemand mal Schritt für Schritt erklären, wie man z. B. ein 8-Bit-Bild in 16 oder nur 2 Farben wandelt, wobei man bei 2 Farben z. B. ein Dithering anwendet, damit es nicht einfach nur "Nearest Color" ist. Ich meine jetzt keinen Source-Code, sondern eine Art Checkliste, welche Punkte notwendig sind. Den Source "popel" ich mir dann selbst irgendwie aus :-)))

Ich würde mir dann nämlich gerne eine TPU basteln, mit der man ein (BMP) Bild in 4- oder 8-Bit "runterkonvertieren" kann in 2-Bit :-)
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Farbtiefe von Bildern

Beitrag von DOSferatu »

Naja, ich würde sagen, um ein Bild - welcher Art auch immer - in nur ZWEI Farben zu wandeln (und dithern), wandelt man es erstmal in Graustufen, bzw geht über die "Graustufen-Stufe".
Normalerweise rechnet man die einzelnen Phasen Rot/Grün/Blau zusammen, und zwar
ROT*3+Grün*5+Blau*1
(wobei 3, 5 und 1 nicht die korrekten Werte sind, die sind noch etwas anders)
Das ist so, weil die Farbphasen ja eine unterschiedliche Helligkeit haben.
Dann erhält man in dem Fall ein Ergebnis, das man durch 9 teilen muß.
Die richtigen Werte sind:
Rot: 0,299
Grün: 0,587
Blau 0,114
Und die ergeben zusammen 1.
ABER das wäre natürlich Overkill, da beispielsweise alles *299, *587 und *114 und dann /1000 zu rechnen.
Besser wäre es meiner Meinung nach, 3 Tabellen zu erstellen, die für
ROT 256 Werte enthalten von 0* 0,299 bis 255*0,299 (76)
GRÜN 256 Werte enthalten von 0* 0,587 bis 255*0,587 (150)
BLAU 256 Werte enthalten von 0*0,144 bis 255*0,144 (29)
oder NOCH besser, die Ergebnisse als WORDS zu machen, in 256er schritten.

Dann kann man indiziert auf die Tabellen zugreifen, erhält 3 Words, die man addiert und erhält dann im HIGHbyte davon einen Wert 0-255, der dem Grauwert entspricht.

OK, soweit, so gut.
Dann erstellt man NOCH eine Tabelle, die Dithers enthält.
BEISPIEL: Man erstellt 256 Blocks aus 16x16 Bits, d.h. man braucht 32 Byte pro "Block". Diese Blocks füllt man dann mit Pixeln, aber nicht von oben nach unten, sondern nach dem "regulären Raster" Prinzip:

Ich schreib jetzt mal als Hex rein, wie die Pixel in der Reihenfolge reinmüssen:

Code: Alles auswählen

 00 C0 30 F0 0C CC 3C FC 03 C3 33 F3 0F CF 3F FF
 80 40 B0 70 8C 4C BC 7C 83 43 B3 73 8F 4F BF 7F
 20 E0 10 D0 2C EC 1C DC 23 E3 13 D3 2F EF 1F DF
 A0 60 90 50 AC 6C 9C 5C A3 63 93 53 AF 6F 9F 5F
 08 C8 38 F8 04 C4 34 F4 0B CB 3B FB 07 C7 37 F7
 88 48 B8 78 84 44 B4 74 8B 4B BB 7B 87 47 B7 77
 28 E8 18 D8 24 E4 14 D4 2B EB 1B DB 27 E7 17 D7
 A8 68 98 58 A4 64 94 54 AB 6B 9B 5B A7 67 97 57
 02 C2 32 F2 0E CE 3E FE 01 C1 31 F1 0D CD 3D FD
 82 42 B2 72 8E 4E BE 7E 81 41 B1 71 8D 4D BD 7D
 22 E2 12 D2 2E EE 1E DE 21 E1 11 D1 2D ED 1D DD
 A2 62 92 52 AE 6E 9E 5E A1 61 91 51 AD 6D 9D 5D
 0A CA 3A FA 06 C6 36 F6 09 C9 39 F9 05 C5 35 F5
 8A 4A BA 7A 86 46 B6 76 89 49 B9 79 85 45 B5 75
 2A EA 1A DA 26 E6 16 D6 29 E9 19 D9 25 E5 15 D5
 AA 6A 9A 5A A6 66 96 56 A9 69 99 59 A5 65 95 55
Wenn Du willst, gebe ich da mal so Dithermasken für ASM aus, habe das schon hier generiert.
Das besteht aus 256*16 Words.

Das Ganze funktioniert nun so, daß man bei jedem Pixel folgendes tut:
Man nimmt die unteren 4 Bit der Zeilennummer als Y und die unteren 4 Bit der Spaltennummer.als X. Dann nimmt man die Grau-Helligkeit des Pixels (0 bis 255), nennen wir sie A.
Und aus (A+Y)*2 holt man ein Word und checkt das X-te Bit (indem man z.B. einfach Wert ROR (X+1) macht und Carry testet oder Wert ROR X und dann TEST WERT,1.
Jedenfalls erhält man damit, ob Farbe 0 oder 1 gesetzt werden muß, wobei 0 = schwarz , 1= weiß.
(also das Bit 0 des Wertes ist nach ROR Wert,X halt die Farbe).

Wer aufgepaßt hat, bemerkt, daß es eigentlich 257 Werte sein müßten, denn wenn man ein 16x16 Bitl Feld nacheinander mit Bits füllt, gibt es ja einen Null-Zustand (ohne Bits) und dann eben die 256 Zustände für jedes Bit, das dazukommt.
Ich persönlich würde das einfach ausgleichen, indem ich eine der Matrizen weglasse und dafür die "ganz leer" (0) und "ganz voll" (255) Matrix mit komplett mit Nullbits (für 0) und Einsbits (für 255) füllt.

Oder man macht die Tabellen für die Graustufen so, daß es 257 Grau-Werte gibt- Aber dann ist das alles nicht mehr so schön 8bit/16bit-basiert.

Ich sage mal so: Da man das Bild natürlich spalten-/zeilenweise durcharbeitet, braucht man natürlich nicht umständlich immer die Zeile oder Spalte "herausfinden", weil die sich ja normal erhöhen...
Das heißt: Für jede Stelle des Bildes wird entschieden, welcher Pixel da "angemessen" ist - das ist natürlich nur für das ganze Bild sinnvoll. Ein einzelner Bildpixel kann ja nur schwarz oder weiß sein und es hängt von der Graustufe UND seiner Position im Bild ab.
Man kann das ganze natürlich reduzieren, indem man keine 16x16- sondern eine 8x8-Pixel Matrix für das Dither benutzt.

Es gibt noch eine andere Möglichkeit - OHNE so feste Dither:
Man generiert genau solche Graustufen wie vorher. Und dann erzeugt man bei jedem Pixel einen Zufallswert zwischen 0 bis 255. Und wenn die Graustufe kleiner als der Zufallswert ist, macht man den Pixel schwarz, ansonsten weiß. Man kann sich auch eine kurze Tabelle solcher Zufallswerte machen und diese immer wiederholen lassen. (Dann braucht man sie nicht generieren.) Sie sollte nur nicht die gleiche Breite wie das Bild haben oder ein ganzzahliger Teiler dieser Breite sein, da man sonst ungewollte senkrechte Linien einbaut.

Ich könnte jetzt schon auf der Stelle ein kleines ASM-Programm schreiben, das genau das Obengesagte tut.

Ich hoffe, ich konnte mit diesen Anregungen etwas helfen.
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Farbtiefe von Bildern

Beitrag von drzeissler »

zeig uns aber auch mal die ergebnisse die so ein programm "errechnet".

früher als die grafikkarten nicht viele farben gleichzeitig darstellen konnten,
wurde ja auch immer ordentlich gedithert. ich hab mich immer gefragt ob
man das hinterher noch so toll hinbekommt.

die besten ergebnisse waren immer dann, wenn das quellenmaterial schon in
der "endfarbtiefe" erstellt wurde.

letztlich macht aber ein cga-emulator auch nur aus 4 farben, zwei und der
rest bekommt muster nach irgend einer vorbestimmten formel.

Doc
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Farbtiefe von Bildern

Beitrag von DOSferatu »

Das oben von mir beschriebene "Verfahren" dient nur erst einmal zur Wandlung von farbigen Bildern in 2-farbige Dither-Bilder.
Um farbige Bilder in Bilder mit weniger Farben zu wandeln, würde ich das folgende tun:
1. Das Bild scannen und die meisten - oder besser noch "bestverteiltesten" Farben finden. (ich habe dazu eine Methode entwickelt)
2. für jeden Pixel die 2 ähnlichsten Farben finden. Dann mit einer "Wahrscheinlichkeit", die der Ähnlichkeit der Farben zur richtigen Farbe entspricht, eins der Raster auswählen (oder eben mit Uufallsgenerator - siehe oben) und dann eben Pixel in Farbe 0 oder 1 setzen.
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Farbtiefe von Bildern

Beitrag von drzeissler »

aus den beiden 256Farben-Bildern:

- VGA mit 16 Farben
- EGA mit 16 Farben

Bild
Bild
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Farbtiefe von Bildern

Beitrag von drzeissler »

true-color in 16 bit-versionen wäre "nice to have" ;-)

Bild
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
Antworten