Konvertieren von Hex zu RGB. Wo ist mein Fehler?!



  • Hallo

    Wenn ich die html hex string zu rgb konvertieren, dann zeigt er mir zwar eine farbe an, aber die falsche. irgendwo ist da ein fehler, aber wo?

    COLORREF HexToRGB(CString strHex)
    {
    	int iRed   = atoi(strHex.Left(0));
    	int iGreen = atoi(strHex.Mid(2, 2));
    	int iBlue  = atoi(strHex.Right(2));
    	return RGB(iRed,iGreen,iBlue);
    }
    

    gruß
    Thorsten



  • edit: der hex string sieht z.B. so aus: FA1212



  • Glaub im Hex stehen die Zahlen in verkehrter Reihenfolge...
    Also

    1212FA



  • ich wandle die RGB werte so in hex um

    strColor.Format("%02X%02X%02X",GetRValue(m_rgbColor),GetGValue(m_rgbColor),GetBValue(m_rgbColor));
    

    und kriege dann FA1212

    nun möchte ich das wieder rückgängig machen, aber wie?!
    wo liegt mein fehler?! 😕 😞



  • Oh mein Gott, mach es so wie du es zu erst machen wolltest... Nur halt Rot und Blau vertauschen. Dann kriegste auch die richtige Farbe raus!



  • Left(0)????



  • was ist an Left(0) falsch?!



  • Wenn du die ersten beiden Zeichen eines Strings erhalten willst, musst du
    Left(2) verwenden, also insgesamt:

    COLORREF HexToRGB(CString strHex)
    {
        int iRed   = atoi(strHex.Left(2));
        int iGreen = atoi(strHex.Mid(2, 2));
        int iBlue  = atoi(strHex.Right(2));
        return RGB(iRed,iGreen,iBlue);
    }
    


  • Sowieso fällt mir jetzt erst einmal auf, wie (schuldigung) falsch dein Code ist

    Angenommen, deine Farbe ist FA1212, dann wird
    iRed = atoi("FA") = 0
    iGreen = atoi("12") = 12
    iBlue = atoi("12") = 12,

    du erhälst also die Farbe RGB(0, 12, 12) und da stimmt kein einziger RGB-Wert!



  • Hab die Lösung gefunden. Es lag an atoi!

    Das hier ist die Lösung:

    int _httoi(const TCHAR *value)
    {
      struct CHexMap
      {
        TCHAR chr;
        int value;
      };
      const int HexMapL = 16;
      CHexMap HexMap[HexMapL] =
      {
        {'0', 0}, {'1', 1},
        {'2', 2}, {'3', 3},
        {'4', 4}, {'5', 5},
        {'6', 6}, {'7', 7},
        {'8', 8}, {'9', 9},
        {'A', 10}, {'B', 11},
        {'C', 12}, {'D', 13},
        {'E', 14}, {'F', 15}
      };
      TCHAR *mstr = _tcsupr(_tcsdup(value));
      TCHAR *s = mstr;
      int result = 0;
      if (*s == '0' && *(s + 1) == 'X') s += 2;
      bool firsttime = true;
      while (*s != '\0')
      {
        bool found = false;
        for (int i = 0; i < HexMapL; i++)
        {
          if (*s == HexMap[i].chr)
          {
            if (!firsttime) result <<= 4;
            result |= HexMap[i].value;
            found = true;
            break;
          }
        }
        if (!found) break;
        s++;
        firsttime = false;
      }
      free(mstr);
      return result;
    }
    
    COLORREF HexToRGB(CString strHex)
    {
    	int iRed   = _httoi(strHex.Left(2));
    	int iGreen = _httoi(strHex.Mid(2, 2));
    	int iBlue  = _httoi(strHex.Right(2));
    	return RGB(iRed,iGreen,iBlue);
    }
    

    danke an alle!!!!



  • Perfekt!



  • wäre das nicht was fürs Faq?! 🙄


Anmelden zum Antworten