代码中怎样把RGB颜色值转换成16进制?

代码中怎样把RGB颜色值转换成16进制?,第1张

rgb颜色格式是由3组0~255的数字构成,分别是红(Red)、绿(Green)、蓝(Blue)的色值。
转为16进制就是分别把红绿蓝三种颜色的色值转为十六进制,前面加个井号
例如:
rgb(255,255,255),255的16进制为FF,所以结果就是#FFFFFF。

“IconArea_text=” 是指文字的颜色代码!不过要注意的是这里的颜色代码和html的颜色不太一样,显示出来的是后面6位颜色编码的RGB模式中R和B对调后的颜色!
0x00FF0000
如果在取色器里面 看到的代码是 #0f6b86 (是一种蓝色)
那么 在用的时候 就要 0x00 + 866b0f (这里对调 前两位{R}和 后两位{B})
得到的 就是 0x00866b0f 显示的就是你所选择的蓝色,其他颜色同理置换~~

不知道你的程序是怎么显示颜色的。一般#FFFFFF这种类型用来表示24位RGB颜色,软件里用0xFFFFFF表示。R\G\B各占8位,这里R=G=B=0xFF
所以黑色是0x000000,R\G\B都是0
白色是0xFFFFFF,都是0xFF
红色0xFF0000,只有Red是0xFF,其余是0
绿色是0x00FF00,只有绿色是0xFF,其余是0
蓝色是0x0000FF,只有蓝色是0xFF,其余是0

所以你里的绿色和蓝色都是对的。

颜色跟进制没有多大关系的,而且你说的0x和#都是16进制的表示,
只不过前面的加了透明度的两位,#的那个没有透明度(但是是可以加上的)
颜色的数值表示一般为
xx
xxxxxx
前两位是透明度,后六位为三原色,0xff989898等价于#ff989898
不要透明度的话是#989898

代码如下:

#include <stdioh>
#include <mathh>
#include <Windowsh>
#define WIDTHBYTES(bits) (((bits)+31)/324)
// 保存位图
void SaveBitmap(
PBITMAPFILEHEADER pFileHdr, 
PBITMAPINFOHEADER pInfoHdr, 
LPRGBQUAD pRGBQUAD, 
size_t paletteNum, 
const unsigned char bmpData, 
size_t bmpDataSize, 
const char file)
{
FILE pf = fopen(file, "wb");
fwrite(pFileHdr, sizeof(BITMAPFILEHEADER), 1, pf);
fwrite(pInfoHdr, sizeof(BITMAPINFOHEADER), 1, pf);
if (pRGBQUAD != NULL) {
fwrite(pRGBQUAD, paletteNum  sizeof(RGBQUAD), 1, pf);
}
fwrite(bmpData, bmpDataSize, 1, pf);
fclose(pf);
}
// 转换位图,将白色像素转换为红色
void ConvertBitmap(const char file, const char new_file)
{
FILE pf = fopen(file, "rb");
// 读取文件头
BITMAPFILEHEADER fileHeader;
memset(&fileHeader, 0, sizeof(fileHeader));
fread(&fileHeader, sizeof(fileHeader), 1, pf);
// 读取信息头
BITMAPINFOHEADER infoHeader;
memset(&infoHeader, 0, sizeof(infoHeader));
fread(&infoHeader, sizeof(infoHeader), 1, pf);
switch (infoHeaderbiBitCount) {
// 处理24位位图
case 24: {
// 读取位图数据
fseek(pf, fileHeaderbfOffBits, SEEK_SET);
unsigned char bmpData = (unsigned char )malloc(infoHeaderbiSizeImage);
fread(bmpData, infoHeaderbiSizeImage, 1, pf);

// 修改位图,将白色像素转换为红色像素,这里只是简单的替换
int widthBytes = WIDTHBYTES(infoHeaderbiWidth  infoHeaderbiBitCount);
for (int i = 0; i < infoHeaderbiHeight; i++) {
unsigned char line = bmpData + widthBytes  i;
for (int j = 0; j < infoHeaderbiWidth; j++) {
int offset = j  (infoHeaderbiBitCount / 8);
if (line[offset] == 0xff &&
line[offset + 1] == 0xff &&
line[offset + 2] == 0xff) {
line[offset] = 0x00;
line[offset + 1] = 0x00;
line[offset + 2] = 0xff;
}
}
}
// 保存
SaveBitmap(&fileHeader, &infoHeader, NULL, 0, bmpData, infoHeaderbiSizeImage, new_file);
free(bmpData);
break;
}
// 处理 8位,4位位图
case 8:
case 4:  {
// 读取调色板数据
long paletteNum = (long)pow(20, infoHeaderbiBitCount);
RGBQUAD pRGBQUAD = (RGBQUAD )malloc(paletteNum  sizeof(RGBQUAD));
fread(pRGBQUAD, paletteNum  sizeof(RGBQUAD), 1, pf);
// 读取位图数据
fseek(pf, fileHeaderbfOffBits, SEEK_SET);
unsigned char bmpData = (unsigned char )malloc(infoHeaderbiSizeImage);
fread(bmpData, infoHeaderbiSizeImage, 1, pf);
// 查找颜色索引
BYTE whiteIdx = 0;
BYTE redIdx = 0;
for (long i = 0; i < paletteNum; i++) {
if (pRGBQUAD[i]rgbRed == 0xff &&
pRGBQUAD[i]rgbGreen == 0xff &&
pRGBQUAD[i]rgbBlue == 0xff) {
whiteIdx = i;
}
if (pRGBQUAD[i]rgbRed == 0xff &&
pRGBQUAD[i]rgbGreen == 0x00 &&
pRGBQUAD[i]rgbBlue == 0x00) {
redIdx = i;
}
}
// 修改位图,将白色像素转换为红色像素,这里只是简单的替换
int widthBytes = WIDTHBYTES(infoHeaderbiWidth  infoHeaderbiBitCount);
for (int i = 0; i < infoHeaderbiHeight; i++) {
unsigned char line = bmpData + widthBytes  i;
for (int j = 0; j < widthBytes; j++) {
if (infoHeaderbiBitCount == 8) {
if (line[j] == whiteIdx) {
line[j] = redIdx;
}
}
else if (infoHeaderbiBitCount == 4) {
if ((line[j] & 0x0f) == whiteIdx) {
line[j] = line[j] & 0xf0 | redIdx;
}
if (((line[j] >> 4) & 0x0f) == whiteIdx) {
line[j] = (line[j] & 0x0f) | ((redIdx << 4) & 0xf0);
}
}
}
}
// 保存
SaveBitmap(&fileHeader, &infoHeader, pRGBQUAD, paletteNum, bmpData, infoHeaderbiSizeImage, new_file);
free(bmpData);
free(pRGBQUAD);
break;
}
} // end of switch
fclose(pf);
}
int main()
{
ConvertBitmap("images/test24bmp", "images/test24_newbmp");
ConvertBitmap("images/test16bmp", "images/test16_newbmp");
ConvertBitmap("images/test256bmp", "images/test256_newbmp");
ConvertBitmap("images/test_binbmp", "images/test_bin_newbmp");
system("pause");
return 0;
}

运行结果:

一个比较简单的办法:在中找到一个颜色和主色调一致的像素点作为基准点,计算中每个像素点RGB值和基准点RGB值的差值(像素点-基准点),用该差值和新的主色调颜色RGB值进行加算,即得到该像素点的新值,在把该值SetPixel就行了。需要注意的是,加算的时候需要把RGB值每个分量单独拿出来计算,最大值是0xFF,如果该分量的加算结果超过了0xFF,那么它就等于0xFF,同时对该分量的前一个分量加1。
例如0x1000FF
+
0xEA8466
结算结果应该是0xFA85FF,而不是0xFA8565。这种算法只能得到近似值,不过在视觉上基本符合要求。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13362042.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-21
下一篇 2023-07-21

发表评论

登录后才能评论

评论列表(0条)

保存