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

Re: Farbreduzierung duch nutzen von ASCII-Zeichen.

Beitrag von Nixsager »

Michl hat geschrieben: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.

Ich hätte wohl den Zwinker-Smiley anhängen sollen.
Ich meinte damit das es keine Anregung ist, sondern ein fast perfekte Lösung. Zum dem fast Perfekt weiter unten.

Michl hat geschrieben:(Achtung, TFPColor nutzt Word zur Speicherung der RGBA-Werte, also den linken Byte-Wert).

Hast du deswegen den SHL-Befehl beim heraus finden des RGB-Wertes der Kombinationen.
Der Scheint mir unnötig zu sein.

Michl hat geschrieben: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.

Irgendwie irritiert mich das neue Array.
Dafür nutzt du ja die GetTwoColorChar-Funktion. Da findet doch nur eine suche in dem Array statt, und das nächste was passt gibt zu als TTwoColorChar-Typ zurück.

Das will ich ja ähnlich machen, dazu aber mehr weiter unten.

Michl hat geschrieben: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.

Ich konnte die Hintergrundfarben erhöhen.
Im Fenstermodus der Konsole und Windows werden die Vordergrundfarben nicht blinkend dargestellt.
Aber das hat die Farbgenauigkeit nicht verbessert.
Irgendwie fängt der Fehler bei den Grautönen an.

Michl hat geschrieben:Ja, das ist kein Problem. Da gibt es sicher ganz viele verschiedene Herangehensweisen.

Ein Beispiel. wenn man ein Bild auf 256 Farben reduziert kann man bei GIMP die Fehlerdiffusion einstellen wie die Farben behandelt werden sollen.
Erstelle ein Bild mit mehreren Grüntönen aber nicht mit dem Grünwert $FF.
Dann verringere die Farben des Bildes und versuche mit dem RGB-Wert $00FF00 das Farbe wird dann nicht den Wert $00??00 haben, sonder kann auch z.B. der Wert $23DD43 haben.
Bei deiner Methode erhalte ich für den RGB-Wert $00FF00 den Farbecode 2 (Grün).
Bei meiner Tabelle die ich abarbeite will (wäre schön wenn es eine besser Methode geben würde, aber ich kam ja nicht mal auf deine Methode) würde ich die Vordergrundfarbe 10, die Hintergrundfarbe 0 und das Zeichen für 100 % erhalte.
Diese Methode wäre Farbtreuer als deine.

Michl hat geschrieben: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.

Wäre sinnvoll wenn nur das Zeichen für 25 oder 75 % zur Verfügung stehen würde.
Dafür müsste man aber ein kleine Vergleichsfunktion hinzufügen, und das würde mehr Code und Platz in Anspruch nehmen als es mit Nutzung des Zeichen nimmt.
Aber so gesehen könnte man eines der Zeichen bei eine Benutzerdefinierten Schrift weglassen, und man hätte Platz für ein anderes Zeichen.

Michl hat geschrieben:Vielleicht helfen dir die Hinweise ein wenig.

Du hast es eher gelöst, und nach meiner Meinung elegant.
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:Hast du deswegen den SHL-Befehl beim heraus finden des RGB-Wertes der Kombinationen.
Der Scheint mir unnötig zu sein.
Genau, deswegen habe ich z.B. Rotkanalwert shl 8 gemacht, damit ich von den $FF auf $FF00 komme. Unnötig ist es allerdings nicht, da wenn ich ein rotes Pixel vom TFPImage (Farbe (TFPColor) Red = $FF00; Green = $0000; Blue = $0000; Alpha = $FFFF) mit dem Byte-Red, (also $FF) vergleiche, wird in der Differenz immer nur Schwarz gewählt werden, da $0000 viel näher am $FF liegt, als $FF00.
Das ist halt eine Besonderheit, wenn man mit TFPImage und TFPColor arbeitet, daß die Farbkanäle 16bit, statt 8bit tief sind.

Nixsager hat geschrieben:Irgendwie irritiert mich das neue Array.
Dafür nutzt du ja die GetTwoColorChar-Funktion. Da findet doch nur eine suche in dem Array statt, und das nächste was passt gibt zu als TTwoColorChar-Typ zurück.
Dieses Array ist quasi das TFPImage. Wobei darin nicht Pixel, sondern der Record Typ TTwoColorChar (also Hintergrundfarbe, Vordergrundfarbe und verwendetes Char) hinterlegt sind, sodaß beim Zeichnen nur der Record aus x, y ausgelesen werden muss und keine neuen Berechnungen stattfinden. Man kann natürlich auch auf dieses Array verzichten und On the Fly die Hintergrundfarbe, Vordergrundfarbe und das verwendetes Char berechnen (würde bei diesem Beispiel nicht ins Gewicht fallen), aber es ist guter Stil, daß Berechnungen möglichst außerhalb eines Paint-Ereignisses stattfinden, um möglichst flüssiges Zeichnen zu ermöglichen (wie gesagt, bei diesem Beispiel zu vernachlässigen, habe ich mir aber irgendwie so angewöhnt).

Nixsager hat geschrieben:Bei meiner Tabelle die ich abarbeite will (wäre schön wenn es eine besser Methode geben würde, aber ich kam ja nicht mal auf deine Methode) würde ich die Vordergrundfarbe 10, die Hintergrundfarbe 0 und das Zeichen für 100 % erhalte.
Diese Methode wäre Farbtreuer als deine.
Das ist doch gut! Versuche deinen Weg zu gehen! Ich wollte dir nur Hilfestellung geben (und das kann ich vor allem, wenn ich selber sowas oder ähnliches mal gemacht habe und dir etwas Code zeigen kann). Wie geschrieben, gibt es sicher viele und bessere Herangehensweisen. Ich hatte die gewählt, wofür mir die Handwerkszeuge in der Konsole (TFPImage) bekannt sind und wie ich deine Idee verstanden hatte. Gern kannst du Teile aus dem Code nehmen und was neues daraus machen. Besser ist es, wenn du deinen eigenen Weg findest.

Mehr vertiefen kann ich das Problem eigentlich nicht, da ich ganz andere Baustellen habe. Aber wenn du an einer kongreten Stelle nicht weiterkommst (möglichst mit einer genauen Beschreibung des Teilproblems und der erwartenden Lösung), kannst du gern hier fragen.

Ich wünsche dir viel Erfolg weiterhin!

Code: Alles auswählen

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

Antworten