-
主要是位移转换的问题。
例如:24 位彩色 RGB(0x50、0x60、0x70)转换为 565 到 16 位
r = r & 0xf8 = (01010000 & 11111000) = 01010000(前 5 位有效)。
g = g & 0xfc = (01100000 & 11111100) = 01100000(前 6 位有效)。
b = b & 0xf8 = (01110000 & 11111000) = 01110000(前 5 个有效)。
color 是 16 位短 int 类型,上面的 8 位是 r 的 5 位和 g 的前 3 位的组合。
高可以这样写:高 = r | g<<5)?它应该很高 = r |G>>5)。
high = r | g>>5) = 01010000 | 01100000>>5) = 01010000 | 00000011 = 01010011
low = (g<<3) |b>>3) = (01100000<<3) |01110000>>3) = 0000000 | 0001110 = 00001110
所有低位和高位组合为 color=(high <<8) |low=(00000000 01010011<<8) |00000000 00001110) = (01010011 000000000)|(00000000 00001110) = 01010011 00001110 = 01010 011000 01110(565) (此结果是 r 的前 5 位数字、g 的前 6 位数字和 b 的前 5 位数字)。
微窗中 888 到 565 转换的宏观定义如下:更好地理解。
从 RGB colorval 创建 16 位 5 6 5 格式像素 (0x00bbggrr)* * c 是无符号长型值 0x00bbggrr
in this format, alpha is ignored. #define color2pixel565(c) \
(c) &0xf8) <8) |c) &0xfc00) >5) |c) &0xf80000) >19))
-
高的计算是错误的。 它似乎很高 = r | g>>5);(下面 = 右 abcd..)x 表示 0 1)。
r = r & 0xf8;设 r=abcdefgh,则 r=abcde000;
g = g & 0xfc;设 g=ijklmnop,则 g=ijklmn00;
b = b & 0xf8;设 b=qrstuvwx,则 b=qrstu000;
high = r | g>>5);g 向右移动 5 位 (00000ijk),或 r因此,高=abcdeijk
low = (g<<3) |b>>3);G 向左移动 3 位 (LMN00000),或 B 向右移动 3 位 (000QRSTU)。因此,low=lmnqrstu
color= (high <<8) |low;高位向左移动 8 位,然后用低位移动,所以 color=abcdeijklmnqrstu
其中 ABCDE 为 5 位红色,ijklmn 为 6 位绿色,QRSTU 为 5 位蓝色。
-
工程师朋友们,这些**在网络上都不是很齐全,大家可以找苏州启普微往下走。
-
问题不清楚,你问为什么会发生编译错误?
如果你想得到一个准确的答案,你必须把错误的现象描述清楚,而且越详细越好,这样你最有可能得到一个准确的答案。
-
需要您一份副本才能完成。
-
这个人做了类似的事情,可以交流。
-
qimage image(channel_, qimage::format_rgb32);
int width = ;
int height = ;
if(iscontinuous(image) &iscontinuous(channel_b) &iscontinuous(channel_g) &iscontinuous(channel_r))
如果图像占用的内存是连续的,则只需一个循环即可处理。
-
地址 第一行的第一列是0x80,第二行的第一列是0xc0
前两句话是自定义字符。
设置起始地址0x40后,可以写入8字节的点阵数据,即形成一个字符。 >>>More
我想你要从计算机的角度来考虑,也许你知道它的用法,但C程序不仅仅是选择结构,你还要弄清楚这些**是如何变成exe的? 总的来说,我们应该对为什么我们应该在开头添加 include 和 for 循环条件有一个大致的了解,以及 while do 和 do while 有什么区别。 比如我们需要对4个数字的大小进行排名,只是看一下,但是计算机必须对每个数字进行比较,等等,所以我认为学习C语言重要的是从计算机的角度来思考问题。 >>>More