Farbreduzierung duch nutzen von ASCII-Zeichen.

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitragvon Nixsager » 8. Nov 2016, 13:43 Farbreduzierung duch nutzen von ASCII-Zeichen.

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 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!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Linkat » 8. Nov 2016, 15:21 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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
Linkat
 
Beiträge: 388
Registriert: 10. Sep 2006, 22:24
Wohnort: nr Stuttgart
OS, Lazarus, FPC: Linux Mint 18.3 64 bit; Lazarus 1.8.0 FPC 3.0.4; Raspbian, Windows 7 | 
CPU-Target: AMD 64Bit, ARM 32Bit
Nach oben

Beitragvon Mathias » 8. Nov 2016, 17:09 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4274
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Nixsager » 8. Nov 2016, 17:22 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Mathias » 8. Nov 2016, 17:24 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Was ist dein Ziel, willst du Bilder im Text-Modus darstellen ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4274
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Nixsager » 8. Nov 2016, 17:24 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Wieso nicht?
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Mathias » 8. Nov 2016, 17:34 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4274
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 8. Nov 2016, 18:04 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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?
wp_xyz
 
Beiträge: 2621
Registriert: 8. Apr 2011, 08:01

Beitragvon Nixsager » 8. Nov 2016, 18:10 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Linkat » 8. Nov 2016, 18:24 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

@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.
Linkat
 
Beiträge: 388
Registriert: 10. Sep 2006, 22:24
Wohnort: nr Stuttgart
OS, Lazarus, FPC: Linux Mint 18.3 64 bit; Lazarus 1.8.0 FPC 3.0.4; Raspbian, Windows 7 | 
CPU-Target: AMD 64Bit, ARM 32Bit
Nach oben

Beitragvon Mathias » 8. Nov 2016, 18:33 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4274
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Nixsager » 8. Nov 2016, 18:45 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Michl » 11. Nov 2016, 22:47 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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?!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2260
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Nixsager » 12. Nov 2016, 00:21 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Michl » 12. Nov 2016, 11:32 Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

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; 
Michl
 
Beiträge: 2260
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried