从ARGB转换为RGBA
Conversion from ARGB to RGBA
我正试图为我的任务编写自己的Color结构。我的目标是,我的缓冲区将始终包含一个RGBA值,即使它是用ARGB值初始化的。
我有两个建设者:
- 分别获取uint8_t类型的R、G、B、A值-工作方式类似于符咒
- 获取一个uint32_t,该uint32_t包含ARGB值-问题从这里开始:我有一个方法可以将提供的ARGB转换为RGBA("fromArgb"(。似乎只有转换为RGBA颜色红色效果良好,所有其他颜色转换都无效
示例:
-
颜色红色=颜色(0xFFFF0000(//运行良好(包含以下值:十六进制:#FF0000FF;R: 255,G:0,B:0,A:255(
-
颜色绿色=颜色(0xFF008000(//错误-实际上是粉红色(包含值:十六进制:#008000FF R:255,G:0,B:128,A:0(
-
Color blue=颜色(0xFF0000FF(//错误-实际上是黄色(包含值:十六进制:#0000FFFF R:255,G:255,B:0,A:0(
-
Color yellow=颜色(0xFFFFFF00(//错误-实际上是Pinkish颜色(包含值:十六进制:#FFFF00FF R:255,G:0,B:255,A:255(
我似乎找不到问题。我将非常高兴得到社区的支持!
示例源代码:
struct Color
{
public:
/* Works fine!!! */
Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255)
{
buffer((r << 0) | (g << 8) | (b << 16) | (a << 24))
}
Color(const uint32_t argb)
{
buffer = fromArgb(argb);
}
inline uint32_t fromArgb(uint32_t argb)
{
return
// Source is in format: 0xAARRGGBB
((argb & 0x00FF0000) << 8) | //RR______
((argb & 0x0000FF00) << 8) | //__GG____
((argb & 0x000000FF) << 8) | //____BB__
((argb & 0xFF000000) >> 24); //______AA
// Return value is in format: 0xRRGGBBAA
}
inline uint8_t getRed(void) const
{
return (buffer >> 0) & 0xFF;
}
inline uint8_t getGreen(void) const
{
return (buffer >> 8) & 0xFF;
}
inline uint8_t getBlue(void) const
{
return (buffer >> 16) & 0xFF;
}
inline uint8_t getAlpha(void) const
{
return (buffer >> 24) & 0xFF;
}
/* Works fine!!!*/
std::string getHex(void) const
{
std::string result = "#";
char colorBuffer[255] = {};
// Order is intentionally end to beginning
sprintf_s(colorBuffer, 255, "%.2X", getAlpha());
result.append(colorBuffer);
sprintf_s(colorBuffer, 255, "%.2X", getBlue());
result.append(colorBuffer);
sprintf_s(colorBuffer, 255, "%.2X", getGreen());
result.append(colorBuffer);
sprintf_s(colorBuffer, 255, "%.2X", getRed());
result.append(colorBuffer);
return result;
}
private:
uint32_t buffer;
}
在我看来,该类持有ABGR值,因此从ARGB到RGBA的转换显然没有帮助。这似乎是正确的(尽管未经测试(。
inline uint32_t fromArgb(uint32_t argb)
{
return
// Source is in format: 0xAARRGGBB
((argb & 0x00FF0000) >> 16) | //______RR
((argb & 0x0000FF00)) | //____GG__
((argb & 0x000000FF) << 16) | /___BB____
((argb & 0xFF000000)); //AA______
// Return value is in format: 0xAABBGGRR
}
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在DXGI格式之间转换RGBA数据
- 从前期浮动RGBA转换为8位RGBA的有效方法
- 使用无法获得适当的输出将RGBA转换为YUV422格式
- OpenCV C++:将RGBA转换为HSL,然后拆分通道
- 如何将BGRA缓冲区转换为RGBA缓冲区格式
- 将双rgba颜色值转换为十六进制字符
- 使用 C++ 将 RGBA 值转换为 2D 数组
- OpenCV 2.3:将Mat 转换为 RGBA 像素数组
- 将RGBA值转换为ABGR十六进制值
- 如何在OpenCV中转换RGBA数组到Mat
- OpenGL转换RGBA字节像素到图像整数数组
- 将数据缓冲器(YUV)转换为QImage(RGBA)