| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1876 人关注过本帖
标题:为什么颜色值还可以有负值,什么情况?
只看楼主 加入收藏
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用yuma在2023-5-20 18:57:11的发言:

颜色值为-1并不是指代任何一种颜色,因为在颜色编码系统中,负数通常不是有效的颜色值。因此,无法将颜色值为-1与任何颜色相关联。而白色的颜色值一定是65535,而不是-1。

问题出在用有符号整数去表达颜色值,颜色值是用无符号整数来表达。
颜色值没有-1的说法,RGB各为0~255(0x00~0xFF),是无符号整数类型。
而Picture1.Point(I,J)返回值定义的是24位颜色值,最大值为0xFFFFFF,即RGB各为255(0xFF),是白色的定义。
用有符号整数去表达24位的0xFFFFFF就是-1了。
ps:
 8bit有符号整数0xFF为-1
16bit有符号整数0xFFFF为-1
24bit有符号整数0xFFFFFF为-1
32bit有符号整数0xFFFFFFFF为-1
64bit有符号整数0xFFFFFFFFFFFFFFFF为-1
2023-05-20 20:53
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用yuma在2023-5-20 18:57:11的发言:

而白色的颜色值一定是65535,而不是-1。


65535(0xFFFF)是16位值,如果说的是16位像素颜色值也不一定是白色。
看看16位像素颜色定义的数据结构
程序代码:
typedef struct _RGB16bit_
{
    union _RGB_
    {
        struct _RGB555_
        {
            unsigned short int N:1;
            unsigned short int B:5;
            unsigned short int G:5;
            unsigned short int R:5;
        } RGB555;
        struct _RGB565_
        {
            unsigned short int B:5;
            unsigned short int G:6;
            unsigned short int R:5;
        } RGB565;
    } RGB;
} RGB16bit, *PRGB16bit;


[此贴子已经被作者于2023-5-20 21:06编辑过]

2023-05-20 21:04
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 

位域都出来了

VB6 里的颜色一般就二种,一种是 RGB,各8位,最终使用 long 保存,共占4个字节。最高位不用。
   还一种就是 QBASIC颜色表,使用一个函数来得到RGB。
所以在VB6 里的函数返回颜色的函数中,一般不考虑 RGB16bit 情况。
但有一种情况例外,在控件中加载了一个 16位颜色 的图片,然后取点颜色时,就可能需要考虑是否存 RGB16bit 情况,

授人于鱼,不如授人于渔
早已停用QQ了
2023-05-21 15:23
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
问题是使用了Picture控件,具体处理的是什么图片不清楚,没得测试。
重点是Picture像素的颜色数值,这与单纯的“颜色”数值是两回事。
常见的BITMAP像素位数有1、4、8、16、24或32(bit),1、4、8时用一个颜色表来描述像素的颜色,分别是2、16、256个表项,通过索引号获取颜色值;> 8 时,没有颜色表项。
像素颜色定义的数据结构
程序代码:
typedef struct _RGB1bit_
{
    unsigned char index0:1;
    unsigned char index1:1;
    unsigned char index2:1;
    unsigned char index3:1;
    unsigned char index4:1;
    unsigned char index5:1;
    unsigned char index6:1;
    unsigned char index7:1;
} RGB1bit, *PRGB1bit;

typedef struct _RGB4bit_
{
    unsigned char index0:4;
    unsigned char index1:4;
} RGB4bit, *PRGB4bit;

typedef struct _RGB8bit_
{
    unsigned char index;
} RGB8bit, *PRGB8bit;

typedef struct _RGB16bit_
{
    union _RGB_
    {
        struct _RGB555_
        {
            unsigned short int N:1;
            unsigned short int B:5;
            unsigned short int G:5;
            unsigned short int R:5;
        } RGB555;
        struct _RGB565_
        {
            unsigned short int B:5;
            unsigned short int G:6;
            unsigned short int R:5;
        } RGB565;
    } RGB;
} RGB16bit, *PRGB16bit;

typedef struct _RGB24bit_
{
    unsigned char B;
    unsigned char G;
    unsigned char R;
} RGB24bit, *PRGB24bit;

typedef struct _RGB32bit_
{
    unsigned char B;
    unsigned char G;
    unsigned char R;
    unsigned char A;
} RGB32bit, *PRGB32bit;


2023-05-21 16:56
macalwen
Rank: 2
等 级:论坛游民
帖 子:8
专家分:14
注 册:2023-5-30
收藏
得分:0 
图片具体颜色值,自己编程从BMP文件读取,结合调色板,自然可以知道。或者试一下九楼得出的三个16进制数用RGB函数显示
2023-05-30 21:24
yuma
Rank: 12Rank: 12Rank: 12
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1934
专家分:3012
注 册:2009-12-22
收藏
得分:0 
因为我的程序遍历了Picture图片控件框的边缘,得知图片框是边缘为1像素宽的矩形框,显示了颜色值为-1

心生万象,万象皆程序!
本人计算机知识网:http://bbs.为防伸手党,本站已停止会员注册。
2023-06-22 07:47
快速回复:为什么颜色值还可以有负值,什么情况?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019747 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved