Ankündigung

Einklappen
Keine Ankündigung bisher.

RGB->HSV und HSV->RGB Bausteine

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    RGB->HSV und HSV->RGB Bausteine

    Ich habe heute im Rahmen der Erstellung eines neuen LBS sowohl die Funktionen convertRGBtoHSV() und convertHSVtoRGB() als auch die LBS RGB->HSV und HSV->RGB benutzt. Irgendwie habe ich immer inkonsistente Ergebnisse bekommen, die ich auch nicht mit Umrechnern im Internet übereinbringen konnte. Die beiden Funktionen liefern die korrekten Ergebnisse.

    Ich habe dann mal in die beiden LBS Bausteine reingeschaut und vermute, dass die Ausgänge falsch gesetzt werden. Wenn ich es richtig verstanden habe, soll die Ausgabe ein HEX String sein, d.h. sowohl RGB als auch HSV jeweils im Wertebereich 00-FF liegen.

    Im Moment wird der Ausgang (Hier das Beispiel LBS RGB->HSV) wie folgt berechnet:

    PHP-Code:
    $hsv=convertRGBtoHSV($r,$g,$b);
    if (
    $hsv!==false) {
    $hsvhex=($hsv[0]*256*256) + ($hsv[1]*256) + $hsv[2];
    setLogicLinkAusgang($id,1,sprintf("%06X",$hsvhex)); 
    Wenn ich es nun wie folgt ändere:

    PHP-Code:
    $hsv=convertRGBtoHSV($r,$g,$b);
    if (
    $hsv!==false) {
    setLogicLinkAusgang($id,1,dechex($hsv[0]).dechex($hsv[1]).dechex($hsv[2])); 
    dann erhalte ich genau die HSV Werte, den ich auch in diesem Rechner nachvollziehen kann.

    Habe allerdings die Berechnung

    PHP-Code:
    $hsvhex=($hsv[0]*256*256) + ($hsv[1]*256) + $hsv[2];
    setLogicLinkAusgang($id,1,sprintf("%06X",$hsvhex)); 
    gerade noch mal in einem separaten php-Skript getestet und eigentlich funktioniert es, nur im LBS nicht.
    Habe es dann noch mal als Mini Logik nachgestellt:

    2016-03-25 21_12_39-EDOMI · Administration.png

    HSV->RGB mit #aabbcc danach RGB->HSV. Eigentlich müsste doch wieder #aabbcc herauskommen, oder?

    Wenn ich in beiden LBS den Ausgang in der von mir modifizierten Weise setze, dann funktioniert es wie erwartet:

    2016-03-25 21_18_19-EDOMI · Administration.png

    Ich will nicht ausschließen, dass ich etwas grundsätzlich falsch verstanden haben, aber ich kann es nicht selbst auflösen.
    Christian, kannst du mir helfen?

    VG
    André




    #2
    Merkwürdig... Sollte eigentlich funktionieren

    Deine Variante in Ehren, aber die funktioniert hier nur zufällig: Bei 010101 wird sie gnadenlos scheitern, da dechex() keine führenden Nullen ergänzt

    Guck' ich mir mal bei Gelegenheit an, danke für den Hinweis schonmal!
    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

    Kommentar


      #3
      habe das in meinem LBS ähnlich gemacht und du hast natürlich recht, da fehlt noch das str_pad() um es immer auf 2 Stellen zu bringen.

      Kommentar


        #4
        Soooo... Hab' mal drübber geguckt

        Quick-and-dirty-Lösung ist z.B. so:

        18000062:

        PHP-Code:
                        if ($rgb!==false) {
                            
        setLogicLinkAusgang($id,1,sprintf("%02X",$rgb[0]).sprintf("%02X",$rgb[1]).sprintf("%02X",$rgb[2]));
                        } 

        18000063:

        PHP-Code:
                        if ($hsv!==false) {
                            
        setLogicLinkAusgang($id,1,sprintf("%02X",$hsv[0]).sprintf("%02X",$hsv[1]).sprintf("%02X",$hsv[2]));
                        } 

        Übrigens: Die Konvertierung RGB -> HSV -> RGB ergibt nicht immer den Ausgangswert, da HSV -> RGB mathematisch betrachtet mehrere Lösungen haben kann. Außerdem kommen "Rundungsfehler" hinzu, da der HSV-Farbraum eigentlich Float-basierend ist, die Hex-Werte aber natürlich Bytes.

        Jetzt sollte es also funktionieren - warum es bislang offenbar nicht klappte, weiß ich auf die Schnelle nicht zu sagen... Für mich war die "Formel" logisch Aber offenbar habe ich irgendetwas übersehen... Aber egal, Hauptsache es funzt jetzt Besten Dank nochmal für den Hinweis!
        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

        Kommentar


          #5
          Ja ich frage mich auch warum es nicht funktioniert, denn deine Formel habe ich in einem kleinen PHP Skript getestet. Die Funktioniert.
          Schon komisch. Aber wie du bereits sagst, Hauptsache es funktioniert. Danke.

          Kommentar


            #6
            Echt?! Bei mir funktionierte die Zauberformel nicht - auch nicht "extern". Lieferte genau die von Dir genannten Werte. Ich muss mal in mich gehen und darüber nachdenken Ist ja eigentlich eher triviales "Bitshiftung" für Arme... Aber naja - Hauptsache....
            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

            Kommentar


              #7
              Ich habe da so eine Ahnung... Die eigentlichen Konvertierungsfunktionen liefern glaube ich Floatwerte (muss ich morgen mal nachgucken). Daher kann z.B. r durchaus auch 128.1234 sein Es fehlt also in der alten "Formel" noch ein intVal() oder ein &255

              Ich hatte die Funktionen irgendwann mal in float abgeändert und die LBS dabei "vergessen".
              EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

              Kommentar


                #8
                Verdacht bestätigt... Das war der Fehler! Ich habe die Konvertierungsfunktionen irgendwann auf Float umgestellt und dabei vergessen, die beiden LBS anzupassen.

                Korrekt muss es also so aussehen:

                PHP-Code:
                setLogicLinkAusgang($id,1,sprintf("%02X",round($rgb[0])).sprintf("%02X",round($rgb[1])).sprintf("%02X",round($rgb[2])));

                bzw.

                setLogicLinkAusgang($id,1,sprintf("%02X",round($hsv[0])).sprintf("%02X",round($hsv[1])).sprintf("%02X",round($hsv[2]))); 
                Ist dann im nächsten Update korrigiert.
                EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                Kommentar

                Lädt...
                X