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



  • 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