Farbreduzierung duch nutzen von ASCII-Zeichen.

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Nixsager »

Hi

Es geht um die Grafikbearbeitung, um das Dithering eines Bildes.

In der Konsole bzw. im Textmodus kann man ja mit Hilfe der Vorder-, Hintergrundfarbe und durch die Nutzung der ASCII-Zeichen (░, ▒, ▓) weitere als die 16 vorgegebenen Farben simulieren. Ich nutze zusätzlich noch das Leerzeichen und Chr-219 (█) weil es für mich einfacher ist.

Mit Hilfe folgender Berechnung, kann durch Angabe des RGB-Wertes für Farbe 1 und Farbe 2, und durch das Mischverhältnis bzw. die Sichtbarkeit in Prozent von Farbe 1 die Mischfarbe berechnet werden.
Die Formel muss drei mal, jeweils für jeden Grundfarbton genutzt werden.

Code: Alles auswählen

 
[Ergebnis] = (([Farbe 1]*[Mischverhältnis]) + ([Farbe 2]*(100-[Mischverhältnis]))) / 100
 

Für die fünf genutzten ASCII-Zeichen habe ich fünf Mischverhältnisse mit 0, 25, 50, 75 und 100 Prozent.

Somit habe ich 1280 Kombinationsmöglichkeiten. Aber dadurch das Ergebnis bei bei gleicher Vorder- und Hintergrundfarbe, oder dadurch Das Farbe 1 ein Mischverhältnis zu Farbe 2 von 25 Prozent oder das Farbe 2 ein Mischverhältnis zu Farbe 1 von 75 Prozent identisch ist, habe ich nur so um die 369 Farben.

Welche Farben ich durch Verkleinerung mit der Nutzung der bilinearen Interpolation des erstellten Bildes erhalte, weiss ich mit der Hilfe durch meine Methode.
Die Frage ist jetzt, wie kriege ich die gegenteilige Methode also die Fehlerdiffusion/das Dithering eines Bildes hin, wenn das im Ergebnis nur maximal 16 Farben und drei Schattierungen haben darf.
Die Floyd-Steinberg-Methode kann ich hier ja nicht nutzen, weil das Mischverhältnis durch die ASCII-Zeichen vorgegeben ist.

So das ich den RGB-Wert der gewünschten Farbe angebe und ich als Ergebnis die Vorder-, Hintergrundfarbe und das Mischverhältnis erhalte.

Gruß vom Nixsager

P.S.
Nachtrage zu meiner unverständlichen Frage.
Wenn man den Text schon mehrmals im Kopf durchgegangen ist, sieht man die Fehler nicht mehr schon schnell. Vor allem wenn man ihn mehrmals bearbeitet.

Ich hoffe die Frage ist jetzt verständlicher.
Zuletzt geändert von Nixsager am Di 8. Nov 2016, 18:33, insgesamt 1-mal geändert.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Linkat »

Hallo Nixsager,
das Durchlesen deines Beitrages hat mich doch gerade aufgeregt!!.

Deine Frage:

Code: Alles auswählen

Die Frage ist jetzt, wie die gegenteilige Methode also die Fehlerdiffusion hin?

ist absolut unverständlich.

Bitte gib dir ein bischen Mühe beim Formulieren und Abfassen eines Beitrages. Auch solltest du die Fehler in der Überschrift, Groß-Kleinschreibung und das/dass im Text korrigieren. Bedenke wie viele Leute diesen Beitrag lesen und sich durch deinen Text durchquälen. Vielleicht möchtest du ja auch Hilfe.

Ich möchte jetzt keine Diskussion über die Form eines Beitrages anfangen.
Die Kritik musste einfach sein.

Gruß, Linkat
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Mathias »

In der Konsole bzw. im Textmodus kann man ja mit Hilfe der Vorder-, Hintergrundfarbe und durch die Nutzung der ASCII-Zeichen (░, ▒, ▓) weitere als die 16 vorgegebenen Farben simulieren. Ich nutze zusätzlich noch das Leerzeichen und Chr-219 (█) weil es für mich einfacher ist.

Was willst du damit für Farben simulieren ?
Oder willst du eine Art PixelMatrix simulieren, wen der Benutzer mehrere Meter vom Bildschirm entfernt hockt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Nixsager »

Beim Raster-Dithering wird ja durch nutzen eines Raster mit Hilfe der zur Verfügung stehenden Farben mehrere Farben simuliert bzw. nachgeahmt.
Und das nutze ich mit Hilfe der der erweiterten ASCII-Zeichen.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Mathias »

Was ist dein Ziel, willst du Bilder im Text-Modus darstellen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Nixsager »

Wieso nicht?
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Mathias »

Wieso nicht?

Ich hätte da noch was lustige für dich, ein Grafik-Fenster im Text-Modus. Läuft nur auf EGA uns höher.
Dateianhänge
MIKADOP.zip
(17.09 KiB) 122-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von wp_xyz »

Linkat hat geschrieben:das Durchlesen deines Beitrages hat mich doch gerade aufgeregt!!.

Deine Frage:

Code: Alles auswählen

Die Frage ist jetzt, wie die gegenteilige Methode also die Fehlerdiffusion hin?

ist absolut unverständlich.

Bitte gib dir ein bischen Mühe beim Formulieren und Abfassen eines Beitrages. Auch solltest du die Fehler in der Überschrift, Groß-Kleinschreibung und das/dass im Text korrigieren. Bedenke wie viele Leute diesen Beitrag lesen und sich durch deinen Text durchquälen. Vielleicht möchtest du ja auch Hilfe.

Es ist schlimm, wieviel man hier inzwischen raten muss, um einen Text zu verstehen. Ich überlege mir inzwischen, nur noch auf verständliche Fragen zu antworten. Ich habe es eben in einem anderen Thread schon mal geschrieben: Wieso soll ich meine Zeit opfern, jemandem zu helfen, der sich selbst nicht die Zeit nimmt, seinen Text durchzulesen und zu korrigieren?

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Nixsager »

Die Idee zu so was hatte ich auch schon.
Im Grunde ist das relativ einfach umzusetzen.

Aber das habe ich irgendwo noch was besseres. ein 3D-Spiel im Textmodus.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Linkat »

@Nixsager

Was soll das? Was ist das für ein Satz?

Code: Alles auswählen

Aber das habe ich irgendwo noch was besseres. ein 3D-Spiel im Textmodus.


Du liest die Beiträge deines Threads wohl nicht.
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Mathias »

Die Idee zu so was hatte ich auch schon.
Im Grunde ist das relativ einfach umzusetzen.

Die EGA/VGA-Karte hat auch einen 512-Zeichen Textmodus. Die oberen 256-Zeichen hatte man für das Grafik-Fenster missbraucht.
Nur musste man aber ein Bit vom Attribut opfern.

Die EGA-Karte war dazumal schon recht fortschrittlich, nur schade, das davon fast nichts genutzt wurde.
Auch konnte man dem Attribut einen von 64 Farbtönen zuordnen.
Dies wäre vielleicht noch eine alternative zu deinem ersten Post.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Nixsager »

Mit den EGA-Farben hätte ich zwar mehr Farben zur Verfügung, aber die Frage wäre die Selbe.
Wie wendet man das Dithering auf einem Bild mit Hilfe der vorgegebenen Grenzen an?

Da ich ja die möglichen Kombinationen mit Hilfe von Schleifen erhalten, dachte ich daran diese Daten in ein Array zu schreiben und dann nach dem eingegebenen RGB-Wert in diesem Array mit Hilfe eines Vergleiches zu suchen.
Aber da ich nur so um die 369 Farben habe, muss ich die Farbe die der vorgegebenen am nächsten ist, nehmen.
Aber hier ist dann die Frage, wie stellt man so einen Vergleich an.
Diese Vergleichsmethode scheint mir ein bisschen langsam zu sein.

Als Bilder habe ich die Ergebnisse meiner Methode angehängt.
Das erste zeigt wie es im Textmodus aussieht, und das zweite wie es aussieht wenn das Bild mit Hilfe der bilinearen Interpolation verkleinert wurde.
Dateianhänge
Textmodus-Farbmischungen.png
Textmodus-Farbmischungen.png (4.29 KiB) 3055 mal betrachtet
Textmodus-Farbmischungen-Interpoliert.jpg
Textmodus-Farbmischungen-Interpoliert.jpg (13.48 KiB) 3177 mal betrachtet
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Michl »

Nixsager hat geschrieben:Es geht um die Grafikbearbeitung, um das Dithering eines Bildes.
Schöne Idee! Anbei ein kleines Projekt, wie man sowas umsetzen könnte (läuft aber nur unter Windows und ist bei der Ausgabe langsam, da Crt verwendet wird). Vielleicht hilft es dir ja als Anregung?!
Dateianhänge
ConsolePict.zip
(93.31 KiB) 131-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Nixsager »

Danke!

Aber Anregung???

Du hast das erstens mein Problem gelöst, und bist sogar noch ein Stück weiter gegangen. was ich bei erfolgreicher Umsetzung auch noch machen wollte, nämlich ein Bild anzeigen, bzw. es als Konvertierer nutzen.

Ich muss mir den Code genauer anschauen.
Aber was mir aufgefallen ist, du erstellst auch erst mal eine Tabelle mit allen Kombinationen.
Wozu du Abs nutzt haben ich noch nicht verstanden. Ich vermute mal um die Farben zu glätten bzw. die Werte auf eine ganz Zahlen zu runden. Mir fällt gerade nicht ein wie ich das besser ausdrücken soll.
Ich mache das folgendermaßen.

Code: Alles auswählen

 
If (((TextRGBColor[ForegroundColorIndex].B * CharRGBValue) MOD 100) <> 0) or
   ((TextRGBColor[BackgroundColorIndex].B * (100 - CharRGBValue) MOD 100) <> 0) then
      Inc(RGBBResult);
 


Aber wie du die richtige Kombination der Vorder-, Hintergrundfarbe und das benötigte Zeichen raus findest, muss ich unbedingt raus finden!

Ich wollte (wie man hier lesen kann) anders vorgehen.
Ich wollte ja bei einem RGB-Wert von $AAFFBB zum Beispiel. erst mal die Reihenfolge der höherwertigsten Grundfarbe der Reihe nach, also 231, raus finden.
Dann wollte ich in der Tabelle erst mal den Eintrag raus suchen, dem der Grünwert am nächsten ist, dann unter Beachtung des Wertes der dem Grünwert am nächsten ist, den Wert suchen dem der des Blauwertes am nächsten ist und so weiter.
Und natürlich so, das ich auch einen richtigen Eintrag finde wenn Rot einen höheren Wert als Blau oder Grün hat.
Bloß da kommen ich gerade nicht weiter.

Zu dem Thema langsame Ausgabe wegen der Crt-Unit, habe ich ja extra schon ein Thema aufgemacht.
Aber das ist eine gute Frage, weil man unter DOS nicht genauso vorgehen kann wie bei eine Konsole von Windows, Linux oder MacOs.

Aber zwei Sachen sind mir aufgefallen.
Das die Hintergrundfarben auf 8 begrenzt sind.
Und das Farbverfälschung auftauchen. Ich habe ein Textprogramm gemacht, das mit ein Textbild mit 16 Vordergrundfarben * 16 Hintergrundfarben * 5 Zeichen ausgibt.
Zeichen 1 und 5 kann man vernachlässigen, da das ganze Zeichen ausgefüllt ist, nur mit dem Unterschied das die Vorder- oder Hintergrundfarbe im Vordergrund ist.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Michl »

Nixsager hat geschrieben:Aber Anregung???
Na wirklich hilfreiche Antworten kann ich zu dem Thema nicht geben, da ich sowas noch nicht gemacht hatte. Daher habe ich mich gestern abend kurz hingesetzt und es einmal selbst probiert. Das Ergebnis siehst du hier, ob es dir eine Hilfe ist, kann ich nicht sagen.

Nixsager hat geschrieben:Aber was mir aufgefallen ist, du erstellst auch erst mal eine Tabelle mit allen Kombinationen.
Ja, zuerst definiere ich die genutzten vier Chars (░, ▒, ▓, █). Dann deren Anteil Vordergrundfarbe/Hintergrundfarbe (wie von dir oben geschrieben) in Prozent (25, 50, 75, 100). Dann definiere ich in einem Array, welche RGBA-Werte (da ich TFPColors nutze) die 16 EGA Farben haben (die Definition gibt es sicherlich schon irgendwo in FPC, habe aber nicht danach gesucht). Dann definiere ich in einem Array entsprechend der Prozent Vordergrundfarbe/Hintergrundfarbe und genutzer Char, welchem RGBA-Wert dieser entspricht (Achtung, TFPColor nutzt Word zur Speicherung der RGBA-Werte, also den linken Byte-Wert).

Nixsager hat geschrieben:Wozu du Abs nutzt haben ich noch nicht verstanden. Ich vermute mal um die Farben zu glätten bzw. die Werte auf eine ganz Zahlen zu runden.
Nein, ich lese eine Grafikdatei ein und gehe jeden Pixel dieses TFPImages durch und suche nach dem nächstliegenden RGB-Wertes in dem letztgenannten Array. Dabei bilde ich einfach die Differenz (daher Abs) der jeweiligen Farbkanäle Rot, Grün, Blau und addiere die Differenz. Die Farbe, deren Differenz vom TFPImages Pixels und einem Eintrag des Arrays am niedrigsten ist (am nächsten liegt), wird in einem neuen Array gespeichert, welches dem Abbild des TFPImage entspricht.

Nixsager hat geschrieben:Ich wollte (wie man hier lesen kann) anders vorgehen.
Ich wollte ja bei einem RGB-Wert von $AAFFBB zum Beispiel. erst mal die Reihenfolge der höherwertigsten Grundfarbe der Reihe nach, also 231, raus finden.
Dann wollte ich in der Tabelle erst mal den Eintrag raus suchen, dem der Grünwert am nächsten ist, dann unter Beachtung des Wertes der dem Grünwert am nächsten ist, den Wert suchen dem der des Blauwertes am nächsten ist und so weiter.
Und natürlich so, das ich auch einen richtigen Eintrag finde wenn Rot einen höheren Wert als Blau oder Grün hat.
Ja, das ist kein Problem. Da gibt es sicher ganz viele verschiedene Herangehensweisen.

Nixsager hat geschrieben:Aber zwei Sachen sind mir aufgefallen.
Das die Hintergrundfarben auf 8 begrenzt sind.
Ja, in der Konsole kann ich nur die Hintergrundfarben 0..7 setzen, die Hintergrundfarbe 8..15 entsprechen wieder 0..7. Weiß nicht, ob man das ändern kann, habe mich damit nicht beschäftigt, nur festgestellt.

Nixsager hat geschrieben:Und das Farbverfälschung auftauchen. Ich habe ein Textprogramm gemacht, das mit ein Textbild mit 16 Vordergrundfarben * 16 Hintergrundfarben * 5 Zeichen ausgibt.
Zeichen 1 und 5 kann man vernachlässigen, da das ganze Zeichen ausgefüllt ist, nur mit dem Unterschied das die Vorder- oder Hintergrundfarbe im Vordergrund ist.
Wie zuvior geschrieben, ging das bei mir nicht Out of the Box. Wenn man als Hintergrundfarbe ebenfalls 16 Farben und nicht nur 8 nutzen kann/könnte, käme man sogar mit nur 2 Chars (░ und ▒) aus, da das Char ▓ durch Invertierung von ░ genutzt werden könnte und █ durch z.B. ▒ Vordergrund- = Hintergrundfarbe erreicht würde.

Vielleicht helfen dir die Hinweise ein wenig.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten