Как я могу преобразовать от DWORD RGBA до ints?

Если Вам нравятся динамические языки, испытывают Pygame? Плюс я думаю, что можно быть нацелены на OpenGL с этим, также... зависит от того, на что Вы смотрите. XNA Game Studio является большой... или u, хотят посмотреть на некоторое программное обеспечение Mac

5
задан drowneath 18 October 2009 в 00:11
поделиться

3 ответа

На вашем месте я бы придерживался мультипликативно-аддитивных операций в функциях упаковки / распаковки. Примерно так

unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{        
  return ((iA * 256 + iR) * 256 + iG) * 256 + iB;
}

с функцией симметричной распаковки

RGBA DWORD2RGBA(unsigned long dwColor)
{        
  RGBA tmp; /* why did you declare it static??? */

  tmp.B = dwColor % 256; dwColor /= 256;
  tmp.G = dwColor % 256; dwColor /= 256;
  tmp.R = dwColor % 256; dwColor /= 256;
  tmp.A = dwColor % 256; /* dwColor /= 256; */

  return tmp;
}

Обратите внимание, что во всем коде есть только одна «магическая константа».

Конечно, если у вас есть внешняя спецификация, которая написана в терминах битовых шаблонов в упакованных данных, версия, основанная на битовых операциях и операциях сдвига, может быть предпочтительнее. Тем не менее

unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{        
  return (((((iA << 8) + iR) << 8) + iG) << 8) + iB;
}

RGBA DWORD2RGBA(unsigned long dwColor)
{        
  RGBA tmp; /* why did you declare it static??? */

  tmp.B = dwColor & 0xFF; dwColor >>= 8;
  tmp.G = dwColor & 0xFF; dwColor >>= 8;
  tmp.R = dwColor & 0xFF; dwColor >>= 8;
  tmp.A = dwColor & 0xFF; /* dwColor >>= 8; */

  return tmp;
}

имеет гораздо меньше «магических констант».

Теперь вы можете обернуть повторяющиеся действия / подвыражения в макросы или, лучше, встроенные функции и получить очень компактный и читаемый упаковщик / распаковщик.

10
ответ дан 18 December 2019 в 10:46
поделиться

Если вы не возражаете использовать целые числа байтового размера для RGBA, вы можете использовать объединение. [ edit Это широко используемый подход, и вы вряд ли найдете компилятор, который его не поддерживает, но, строго говоря (как мне сказали), это незаконный взлом. В большинстве случаев лучший подход - выполнить математическое или двоичное преобразование, но я оставлю эту половину своего ответа на месте, потому что это может помочь читателю понять, что люди делают, когда видят этот тип кода в реальной жизни. world]

union RGBA
{
    DWORD dword;
    unsigned char RGBA[4];
    struct RGBAstruct
    {
        unsigned char b;
        unsigned char g;
        unsigned char r;
        unsigned char a;
    }
};

Затем вы можете получить доступ к зеленому компоненту как:

RGBA colour;
int green = (int) colour.RGBA[2];

или

int green = (int) colour.RGBAstruct.g;

и получить доступ к значению DWORD как

DWORD value = colour.dword;

. Если вам нужно, чтобы значения RGBA были значениями типа int или вы хотите использовать подход преобразования, тогда вам необходимо использовать побитовые операторы.

Вы кодируете их почти правильно, но вам нужно использовать побитовый оператор OR |, а не логический OR || оператор:

DWORD value = (iA << 24) | (iR << 16) | (iG << 8) | iB;

Чтобы пойти в обратном направлении:

int iA = (value >> 24) & 0xff;
int iR = (value >> 16) & 0xff;
int iG = (value >> 8) & 0xff;
int iB = (value) & 0xff;
3
ответ дан 18 December 2019 в 10:46
поделиться

Вы можете пойти другим путем, например:

iA = rgb >> 24; iR = (0x00FF0000 & rgb) >> 16; iG = (0x0000FF00 & rgb) >> 8; iB = (0x000000FF & rgb);

2
ответ дан 18 December 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: