注册 登录
编程论坛 VB6论坛

为什么颜色值还可以有负值,什么情况?

yuma 发布于 2023-04-25 19:59, 1897 次点击
只有本站会员才能查看附件,请 登录
15 回复
#2
吹水佬2023-04-26 07:57
Point返回的是24位数,有符号显示-1(0xFFFFFF)应该是白色(RGB:255,255,255)
#3
yuma2023-04-30 17:56
AI说,-1表示为透明色。

在计算机编程中,颜色值通常表示为一个整数。对于32位颜色,这个整数可以表示为一个包含四个8位组件(RGBA)的值:红色(R),绿色(G),蓝色(B),和透明度(A)。每个组件的取值范围是0到255。然后,这四个组件的值被组合成一个32位整数。

颜色值可以等于-1,是因为在某些情况下,-1具有特殊的含义。例如,在某些编程语言和库中,-1可能表示透明颜色或未定义的颜色。这里的-1实际上是一个32位整数,它的二进制表示形式为全1(11111111 11111111 11111111 11111111),即RGBA四个组件的值都是255,表示白色且完全透明。

当然,这种表示方法和含义可能因编程语言、库或框架而异。在某些情况下,颜色值可能需要进行特定的处理或转换,以便正确地表示和使用。
#4
吹水佬2023-04-30 19:51
以下是引用yuma在2023-4-30 17:56:29的发言:

AI说,-1表示为透明色。

在计算机编程中,颜色值通常表示为一个整数。对于32位颜色,这个整数可以表示为一个包含四个8位组件(RGBA)的值:红色(R),绿色(G),蓝色(B),和透明度(A)。每个组件的取值范围是0到255。然后,这四个组件的值被组合成一个32位整数。

颜色值可以等于-1,是因为在某些情况下,-1具有特殊的含义。例如,在某些编程语言和库中,-1可能表示透明颜色或未定义的颜色。这里的-1实际上是一个32位整数,它的二进制表示形式为全1(11111111 11111111 11111111 11111111),即RGBA四个组件的值都是255,表示白色且完全透明。

当然,这种表示方法和含义可能因编程语言、库或框架而异。在某些情况下,颜色值可能需要进行特定的处理或转换,以便正确地表示和使用。

这说法是针对32位像素的颜色定义
你提的问题也许不一定是AI说的一回事
可以这样试试:
看看 Se/65536 的值是什么。如果是0xFFFF,那Point方法返回的是32位颜色值;如果是0xFF,那Point方法返回的是24位颜色值。
#5
yuma2023-04-30 20:53
回复 4楼 吹水佬
当se=-1时,se /65536结果如下:

只有本站会员才能查看附件,请 登录
#6
吹水佬2023-05-01 06:43
回复 5楼 yuma
变成有符号整数运算了
或者这样直接观测一下:
HEX(Picture1.Point(I, J))
#7
yuma2023-05-01 17:58
看看 Se/65536 的值是什么。如果是0xFFFF,那Point方法返回的是32位颜色值;如果是0xFF,那Point方法返回的是24位颜色值。

当se=-1时:
hex(se /65536) = 0

hex(se)=FFFFFFF
#8
吹水佬2023-05-01 18:04
以下是引用yuma在2023-5-1 17:58:16的发言:

看看 Se/65536 的值是什么。如果是0xFFFF,那Point方法返回的是32位颜色值;如果是0xFF,那Point方法返回的是24位颜色值。

当se=-1时:
hex(se /65536) = 0

hex(se)=FFFFFFF

不能用 se/65536 运算,VB好像没有32位无符号整数的数据类型,不能声明无符号整数类型变量。
最好直接用 HEX(Picture1.Point(I, J)) 观测,不要通过“中介”。

另:hex(se)=FFFFFFF 这是28位,好像没有28位像素的说法,是不是多了一个“F”,还是少了一个“F”。

[此贴子已经被作者于2023-5-1 18:12编辑过]

#9
吹水佬2023-05-03 09:54
测试一下,就如2楼说的。
只有本站会员才能查看附件,请 登录
#10
yuma2023-05-20 18:57
颜色值为-1并不是指代任何一种颜色,因为在颜色编码系统中,负数通常不是有效的颜色值。因此,无法将颜色值为-1与任何颜色相关联。而白色的颜色值一定是65535,而不是-1。
#11
吹水佬2023-05-20 20:53
以下是引用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
#12
吹水佬2023-05-20 21:04
以下是引用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编辑过]

#13
风吹过b2023-05-21 15:23

位域都出来了

VB6 里的颜色一般就二种,一种是 RGB,各8位,最终使用 long 保存,共占4个字节。最高位不用。
   还一种就是 QBASIC颜色表,使用一个函数来得到RGB。
所以在VB6 里的函数返回颜色的函数中,一般不考虑 RGB16bit 情况。
但有一种情况例外,在控件中加载了一个 16位颜色 的图片,然后取点颜色时,就可能需要考虑是否存 RGB16bit 情况,
#14
吹水佬2023-05-21 16:56
问题是使用了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;


#15
macalwen2023-05-30 21:24
图片具体颜色值,自己编程从BMP文件读取,结合调色板,自然可以知道。或者试一下九楼得出的三个16进制数用RGB函数显示
#16
yuma2023-06-22 07:47
因为我的程序遍历了Picture图片控件框的边缘,得知图片框是边缘为1像素宽的矩形框,显示了颜色值为-1
1