Если вы не возражаете использовать целые числа байтов для RGBA, вы можете использовать объединение. [Редактировать Это общепринятый подход, и вы вряд ли найдете компилятор, который его не поддерживает, но, строго говоря, (так мне говорят) это незаконный хак. Лучший подход в большинстве случаев - сделать математическое или двоичное преобразование, но я оставлю половину своего ответа на месте, потому что он может помочь читателю понять, что делают люди, когда видят этот тип кода в реальном мир]
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, а не логический ИЛИ || Оператор:
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;
Возможно, это просто опечатка, но вы должны использовать '' 'оператор в функции упаковки, а не' || '. – AnT
Почему ваш «tmp» объявлен «статическим»? Вы намеревались вернуть указатель? – AnT
Иногда я получаю предупреждение о компиляторе, когда возвращаю переменную, объявленную в функции. Поэтому я объявил это статическим, чтобы предотвратить предупреждение.? Нет? –