Я понимаю, что то, что я пытаюсь сделать, небезопасно. Но я просто занимаюсь тестированием и обработкой изображений, поэтому мое внимание здесь сосредоточено на скорости.
В настоящий момент этот код дает мне соответствующие байты для 32-разрядного типа значений пикселей.
struct Pixel {
unsigned char b,g,r,a;
};
Я хотел проверить, есть ли у меня пиксель под определенным значением (например, r, g, b <= 0x10
). Я решил, что хотел бы просто условно протестировать бит и биты пикселя с помощью 0x00E0E0E0
(здесь я мог бы иметь неправильную ориентацию), чтобы получить темные пиксели.
Вместо того, чтобы использовать этот уродливый беспорядок (*((uint32_t*)&pixel))
, чтобы получить 32-битное значение unsigned int, я решил, что должен быть способ настроить его, чтобы я мог просто использовать pixel.i
, сохраняя при этом возможность ссылаться зеленый байт с помощью pixel.g
.
Могу ли я это сделать? Это не сработает:
struct Pixel {
unsigned char b,g,r,a;
};
union Pixel_u {
Pixel p;
uint32_t bits;
};
Мне нужно будет отредактировать существующий код, чтобы сказать pixel.p.g
, чтобы получить зеленый цветный байт. То же самое произойдет, если я это сделаю:
union Pixel {
unsigned char c[4];
uint32_t bits;
};
Это тоже сработает, но мне все равно нужно изменить все на индекс в c
, что немного уродливо, но я могу заставить его работать с макросом, если мне действительно нужно.