请教:关于RGB颜色值的判断。。。

shen_wei 2017-03-08 09:26:03
取随机的RGB颜色值,R(0 - 255)G(0 - 255)B(0 - 255)。

给定一个任意值,判断该值所对应的所有的RGB值。。

1、举例:给定一个 32 的值则符合标准RGB值如下。。

RGB(32,0,0)
RGB(0,32,0)
RGB(0,0,32)
RGB(32,32,0)
RGB(32,0,32)
RGB(0,32,32)
RGB(32,32,32)

2、符合倍数关系的值:(32 * 7) 不超过 255 只能取 7

RGB(64,0,0)
RGB(0,64,0)
RGB(0,0,64)
RGB(64,64,0)
RGB(64,0,64)
RGB(0,64,64)
RGB(64,64,64)

对于这样的 RGB 应该如何去判断哪???求解法。。。
...全文
1338 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Vove7 2018-06-12
  • 打赏
  • 举报
回复
存map吧 ,,,,,
赵4老师 2017-03-09
  • 打赏
  • 举报
回复
带→代
赵4老师 2017-03-09
  • 打赏
  • 举报
回复
引用 19 楼 worldy 的回复:
UINT a=RGB(mr,mg,mb); unsigned char *p=&a; if(p[0]%32==0 && p[1]%32==0 && p[2]%32==0) { 颜色正确; }
将255带进去算算?
schlafenhamster 2017-03-09
  • 打赏
  • 举报
回复
C(3,1)+C(3,2)+C(3,3)=3+3+1=7 种
赵4老师 2017-03-08
  • 打赏
  • 举报
回复
楼上忘i++了:
#include <stdio.h>
int main() {
    int r,g,b,R,G,B;
    int n,f,m,i;

    while (1) {
        while (1) {
            printf("input N(1/2/4/8/16/32/64/128,0 exit):");fflush(stdout);
            rewind(stdin);
            if (1==scanf("%d",&n)) {
                if (n==0) return 0;
                f=0;
                switch (n) {
                case 1:case 2:case 4:case 8:case 16:case 32:case 64:case 128:
                    f=1;
                break;
                }
                if (f) break;
            }
        }
        printf("========%d========\n",n);
        m=256/n;
        i=0;
        for (r=0;r<=n;r++) {
        for (g=0;g<=n;g++) {
        for (b=0;b<=n;b++) {
            R=r*m;if (R>=256) R=255;
            G=g*m;if (G>=256) G=255;
            B=b*m;if (B>=256) B=255;
            printf("%8d (%3d,%3d,%3d)\n",i,R,G,B);
            i++;
        }
        }
        }
    }
    return 0;
}
//input N(1/2/4/8/16/32/64/128,0 exit):7
//input N(1/2/4/8/16/32/64/128,0 exit):1
//========1========
//       0 (  0,  0,  0)
//       1 (  0,  0,255)
//       2 (  0,255,  0)
//       3 (  0,255,255)
//       4 (255,  0,  0)
//       5 (255,  0,255)
//       6 (255,255,  0)
//       7 (255,255,255)
//input N(1/2/4/8/16/32/64/128,0 exit):2
//========2========
//       0 (  0,  0,  0)
//       1 (  0,  0,128)
//       2 (  0,  0,255)
//       3 (  0,128,  0)
//       4 (  0,128,128)
//       5 (  0,128,255)
//       6 (  0,255,  0)
//       7 (  0,255,128)
//       8 (  0,255,255)
//       9 (128,  0,  0)
//      10 (128,  0,128)
//      11 (128,  0,255)
//      12 (128,128,  0)
//      13 (128,128,128)
//      14 (128,128,255)
//      15 (128,255,  0)
//      16 (128,255,128)
//      17 (128,255,255)
//      18 (255,  0,  0)
//      19 (255,  0,128)
//      20 (255,  0,255)
//      21 (255,128,  0)
//      22 (255,128,128)
//      23 (255,128,255)
//      24 (255,255,  0)
//      25 (255,255,128)
//      26 (255,255,255)
//input N(1/2/4/8/16/32/64/128,0 exit):8
//========8========
//       0 (  0,  0,  0)
//       1 (  0,  0, 32)
//       2 (  0,  0, 64)
//       3 (  0,  0, 96)
//       4 (  0,  0,128)
//       5 (  0,  0,160)
//       6 (  0,  0,192)
//       7 (  0,  0,224)
//       8 (  0,  0,255)
//       9 (  0, 32,  0)
//      10 (  0, 32, 32)
//      11 (  0, 32, 64)
//      12 (  0, 32, 96)
//      13 (  0, 32,128)
//      14 (  0, 32,160)
//      15 (  0, 32,192)
//      16 (  0, 32,224)
//      17 (  0, 32,255)
//... ...
//     720 (255,255,  0)
//     721 (255,255, 32)
//     722 (255,255, 64)
//     723 (255,255, 96)
//     724 (255,255,128)
//     725 (255,255,160)
//     726 (255,255,192)
//     727 (255,255,224)
//     728 (255,255,255)
//input N(1/2/4/8/16/32/64/128,0 exit):0
//
赵4老师 2017-03-08
  • 打赏
  • 举报
回复
N等分就使用三位N进制数:
#include <stdio.h>
int main() {
    int r,g,b,R,G,B;
    int n,f,m,i;

    while (1) {
        while (1) {
            printf("input N(1/2/4/8/16/32/64/128,0 exit):");fflush(stdout);
            rewind(stdin);
            if (1==scanf("%d",&n)) {
                if (n==0) return 0;
                f=0;
                switch (n) {
                case 1:case 2:case 4:case 8:case 16:case 32:case 64:case 128:
                    f=1;
                break;
                }
                if (f) break;
            }
        }
        printf("========%d========\n",n);
        m=256/n;
        i=0;
        for (r=0;r<=n;r++) {
        for (g=0;g<=n;g++) {
        for (b=0;b<=n;b++) {
            R=r*m;if (R>=256) R=255;
            G=g*m;if (G>=256) G=255;
            B=b*m;if (B>=256) B=255;
            printf("%8d (%3d,%3d,%3d)\n",i,R,G,B);
        }
        }
        }
    }
    return 0;
}
//input N(1/2/4/8/16/32/64/128,0 exit):7
//input N(1/2/4/8/16/32/64/128,0 exit):1
//========1========
//       0 (  0,  0,  0)
//       0 (  0,  0,255)
//       0 (  0,255,  0)
//       0 (  0,255,255)
//       0 (255,  0,  0)
//       0 (255,  0,255)
//       0 (255,255,  0)
//       0 (255,255,255)
//input N(1/2/4/8/16/32/64/128,0 exit):2
//========2========
//       0 (  0,  0,  0)
//       0 (  0,  0,128)
//       0 (  0,  0,255)
//       0 (  0,128,  0)
//       0 (  0,128,128)
//       0 (  0,128,255)
//       0 (  0,255,  0)
//       0 (  0,255,128)
//       0 (  0,255,255)
//       0 (128,  0,  0)
//       0 (128,  0,128)
//       0 (128,  0,255)
//       0 (128,128,  0)
//       0 (128,128,128)
//       0 (128,128,255)
//       0 (128,255,  0)
//       0 (128,255,128)
//       0 (128,255,255)
//       0 (255,  0,  0)
//       0 (255,  0,128)
//       0 (255,  0,255)
//       0 (255,128,  0)
//       0 (255,128,128)
//       0 (255,128,255)
//       0 (255,255,  0)
//       0 (255,255,128)
//       0 (255,255,255)
//input N(1/2/4/8/16/32/64/128,0 exit):8
//========8========
//       0 (  0,  0,  0)
//       0 (  0,  0, 32)
//       0 (  0,  0, 64)
//       0 (  0,  0, 96)
//       0 (  0,  0,128)
//       0 (  0,  0,160)
//       0 (  0,  0,192)
//       0 (  0,  0,224)
//       0 (  0,  0,255)
//       0 (  0, 32,  0)
//       0 (  0, 32, 32)
//       0 (  0, 32, 64)
//       0 (  0, 32, 96)
//       0 (  0, 32,128)
//       0 (  0, 32,160)
//       0 (  0, 32,192)
//       0 (  0, 32,224)
//       0 (  0, 32,255)
//... ...
//       0 (255,255,  0)
//       0 (255,255, 32)
//       0 (255,255, 64)
//       0 (255,255, 96)
//       0 (255,255,128)
//       0 (255,255,160)
//       0 (255,255,192)
//       0 (255,255,224)
//       0 (255,255,255)
//input N(1/2/4/8/16/32/64/128,0 exit):0
//
shen_wei 2017-03-08
  • 打赏
  • 举报
回复
引用 12 楼 xianglitian 的回复:
我只想问问你的问题是怎么来的 有什么具体的需求么
需求,举例说明吧。。 RGB(255,0,0)// 然后 8 等分颜色值。。。(0 -- 255) 256 / 8 = 32 根据等分后的值,来判断这个值是不是属于 RGB(255,0,0)的等分值。。。。等分值可以调正颜色的亮度与明暗!! (注:该颜色值是为了亮LED灯使用的)
摩登码农 2017-03-08
  • 打赏
  • 举报
回复

void CheckColor(DWORD  dwColor)
{
	BYTE     r,g,b;
	COLORREF ColorRGB = RGB(0,0,0);

	for(r=0; r<=255; r++)
	{
		if (r % dwColor == 0)
		{
			for (g=0; g<=255; g++)
			{
				if (g % dwColor == 0)
				{
					for(b=0; b<=255; b++)
					{
						if(b % dwColor == 0)
							ColorRGB = RGB(r,g,b);//这里就是满足RGB都是dwColor倍数的颜色
						//做你想做的操作,把ColorRGB存起来或者输出或者。。。
					}
				}
			}
		}	
	}

向立天 2017-03-08
  • 打赏
  • 举报
回复
我只想问问你的问题是怎么来的 有什么具体的需求么
shen_wei 2017-03-08
  • 打赏
  • 举报
回复
int CCRgbDlg::GetClr(int nData,COLORREF cr)
{
	if (RGB(nData,0,0) == cr)
	{
		return 0;
	}
	else if (RGB(0,nData,0) == cr)
	{
		return 1;
	}
	else if (RGB(0,0,nData) == cr)
	{
		return 2;
	}
	else if (RGB(nData,nData,0) == cr)
	{
		return 3;
	}
	else if (RGB(nData,0,nData) == cr)
	{
		return 4;
	}
	else if (RGB(0,nData,nData) == cr)
	{
		return 5;
	}
	else if (RGB(nData,nData,nData) == cr)
	{
		return 6;
	}
	return -1;
}
对比判断并返回值。。。
shen_wei 2017-03-08
  • 打赏
  • 举报
回复
引用 9 楼 zgl7903 的回复:
规则都写出来了,还是什么难题? 无非是把数据缓存变量

void ColorTrace(BYTE bIn)
{
  for(int i=1; bIn*i<=255; i++)
  {
    BYTE bVal = (BYTE)(bIn*i);

    TRACE(_T("%u=[%06X %06X %06X %06X %06X %06X]\n"),
      bVal,
      RGB(bVal,    0,    0),
      RGB(   0, bVal,    0),
      RGB(   0,    0, bVal),
      RGB(bVal, bVal,    0),
      RGB(bVal,    0, bVal),
      RGB(   0, bVal, bVal),
      RGB(bVal, bVal, bVal)      
      );
  }
}

void CDlg1Dlg::OnButton1() 
{
  ColorTrace(32);
}

//调试输出
32=[000020 002000 200000 002020 200020 202000]
64=[000040 004000 400000 004040 400040 404000]
96=[000060 006000 600000 006060 600060 606000]
128=[000080 008000 800000 008080 800080 808000]
160=[0000A0 00A000 A00000 00A0A0 A000A0 A0A000]
192=[0000C0 00C000 C00000 00C0C0 C000C0 C0C000]
224=[0000E0 00E000 E00000 00E0E0 E000E0 E0E000]

我也是写规则然后想想才如何做的。。。
zgl7903 2017-03-08
  • 打赏
  • 举报
回复
规则都写出来了,还是什么难题? 无非是把数据缓存变量

void ColorTrace(BYTE bIn)
{
  for(int i=1; bIn*i<=255; i++)
  {
    BYTE bVal = (BYTE)(bIn*i);

    TRACE(_T("%u=[%06X %06X %06X %06X %06X %06X]\n"),
      bVal,
      RGB(bVal,    0,    0),
      RGB(   0, bVal,    0),
      RGB(   0,    0, bVal),
      RGB(bVal, bVal,    0),
      RGB(bVal,    0, bVal),
      RGB(   0, bVal, bVal),
      RGB(bVal, bVal, bVal)      
      );
  }
}

void CDlg1Dlg::OnButton1() 
{
  ColorTrace(32);
}

//调试输出
32=[000020 002000 200000 002020 200020 202000]
64=[000040 004000 400000 004040 400040 404000]
96=[000060 006000 600000 006060 600060 606000]
128=[000080 008000 800000 008080 800080 808000]
160=[0000A0 00A000 A00000 00A0A0 A000A0 A0A000]
192=[0000C0 00C000 C00000 00C0C0 C000C0 C0C000]
224=[0000E0 00E000 E00000 00E0E0 E000E0 E0E000]

shen_wei 2017-03-08
  • 打赏
  • 举报
回复
引用 6 楼 Janxionwang 的回复:


void main
{
COLORREF r,g,b;
RGB(r,g,b);//在这里引入你要判断的RGB值
if(32 == r && 32==g && 32==b)    // 有RGB(32,0,0)这种情况。。
{
if(r%32==0 && g%32==0 && b%32==0)
}
}
有RGB(32,0,0)这种情况。。
shenyi0106 2017-03-08
  • 打赏
  • 举报
回复
算了,看来还是我的功力不够,理解不了你的需求,自动PASS吧
摩登码农 2017-03-08
  • 打赏
  • 举报
回复


void main
{
COLORREF r,g,b;
RGB(r,g,b);//在这里引入你要判断的RGB值
if(32 == r && 32==g && 32==b)
{
if(r%32==0 && g%32==0 && b%32==0)
}
}
shenyi0106 2017-03-08
  • 打赏
  • 举报
回复
====> 0 ~ 7 8 ~ 15 16 ~ 23 24 ~ 31 =====> bit序号 ====> 11111111 11111111 11111111 11111111 =====> 一个4字节整数的二进制表示方式 ====> A R G B =====> 一个ARGB的排列方式 ====> ARGB(255, 255, 255, 255) =====> 一个完全不透明的白色 基于以上的4条,给定任意个值,它的RGB值都是可以知道的。 不知道是否满足你的算法要求?
shen_wei 2017-03-08
  • 打赏
  • 举报
回复
引用 3 楼 shenyi0106 的回复:
[quote=引用 2 楼 shen_wei 的回复:] [quote=引用 1 楼 shenyi0106 的回复:] 很抱歉,我没能看懂你的例子。 RGB不是R8B8G8么,什么时候变成了R32G0B0了?我没见过有这种组合。或者我理解错了。 给定一个任意的32位值,那应该是4字节,对应的应该是RGBA(各占8个字节),如果只需要提取RGB的话,去掉前(或者后)8个字节就是对应的RGB24(3个字节)了,没有什么映射关系啊? 备注,RGB颜色表: 16bit RGB: R5G6B5 24bit RGB: R8G8B8 32bit RGB: X8R8G8B8, A8R8G8B8 通常用的好像就这几种
RGB颜色的取值 R 范围(0 - 255)G 范围(0 - 255)B 范围(0 - 255) 是这个意思。。 RGB (32,0,0) 则表示R = 32 G = 0 B = 0 [/quote] 单个颜色分量只有8bit,你的R32怎么来的?或者如果非要用R32那也应该是R(32%8) 又或者你用的是更高级的颜色系统,已经不是普通PC的32位颜色系统了,如果是这样,我没接触过,所以就不好回答了[/quote]

#define RGB(r,g,b)          ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
shenyi0106 2017-03-08
  • 打赏
  • 举报
回复
引用 2 楼 shen_wei 的回复:
[quote=引用 1 楼 shenyi0106 的回复:] 很抱歉,我没能看懂你的例子。 RGB不是R8B8G8么,什么时候变成了R32G0B0了?我没见过有这种组合。或者我理解错了。 给定一个任意的32位值,那应该是4字节,对应的应该是RGBA(各占8个字节),如果只需要提取RGB的话,去掉前(或者后)8个字节就是对应的RGB24(3个字节)了,没有什么映射关系啊? 备注,RGB颜色表: 16bit RGB: R5G6B5 24bit RGB: R8G8B8 32bit RGB: X8R8G8B8, A8R8G8B8 通常用的好像就这几种
RGB颜色的取值 R 范围(0 - 255)G 范围(0 - 255)B 范围(0 - 255) 是这个意思。。 RGB (32,0,0) 则表示R = 32 G = 0 B = 0 [/quote] 单个颜色分量只有8bit,你的R32怎么来的?或者如果非要用R32那也应该是R(32%8) 又或者你用的是更高级的颜色系统,已经不是普通PC的32位颜色系统了,如果是这样,我没接触过,所以就不好回答了
shen_wei 2017-03-08
  • 打赏
  • 举报
回复
引用 1 楼 shenyi0106 的回复:
很抱歉,我没能看懂你的例子。 RGB不是R8B8G8么,什么时候变成了R32G0B0了?我没见过有这种组合。或者我理解错了。 给定一个任意的32位值,那应该是4字节,对应的应该是RGBA(各占8个字节),如果只需要提取RGB的话,去掉前(或者后)8个字节就是对应的RGB24(3个字节)了,没有什么映射关系啊? 备注,RGB颜色表: 16bit RGB: R5G6B5 24bit RGB: R8G8B8 32bit RGB: X8R8G8B8, A8R8G8B8 通常用的好像就这几种
RGB颜色的取值 R 范围(0 - 255)G 范围(0 - 255)B 范围(0 - 255) 是这个意思。。 RGB (32,0,0) 则表示R = 32 G = 0 B = 0
shenyi0106 2017-03-08
  • 打赏
  • 举报
回复
很抱歉,我没能看懂你的例子。 RGB不是R8B8G8么,什么时候变成了R32G0B0了?我没见过有这种组合。或者我理解错了。 给定一个任意的32位值,那应该是4字节,对应的应该是RGBA(各占8个字节),如果只需要提取RGB的话,去掉前(或者后)8个字节就是对应的RGB24(3个字节)了,没有什么映射关系啊? 备注,RGB颜色表: 16bit RGB: R5G6B5 24bit RGB: R8G8B8 32bit RGB: X8R8G8B8, A8R8G8B8 通常用的好像就这几种
加载更多回复(3)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧