鱼C论坛

 找回密码
 立即注册
查看: 1730|回复: 0

[技术交流] C语言位运算实现-Ps颜色反向

[复制链接]
发表于 2021-6-26 17:23:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在C语言学习的过程中,边学边练习是一个锻炼思维的一种好方法。
其实位运算,的用非常多,比如颜色运算,嵌入式,以及逻辑电路等用的最多的。

下面我就用我们学到C语言知识位运算来实现一个**Ps的功能        -        反向**
首先我们先知道**Ps的反向**功能在哪,没有接触Ps的各位C友们这里教一下大家。
填充一个颜色为66ccff
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021 ... ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NDEwOTM2,size_16,color_FFFFFF,t_70#pic_center)
然后执行反向,这里你可以用Ctrl+I或者在图像->调整->反向
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021 ... ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NDEwOTM2,size_16,color_FFFFFF,t_70#pic_center)
瞬间变了一种颜色,色值为993300
这是让我想到了RGB色值,66ccff的色值为102,204,255
则反向过后的色值为993300的色值为153,51,0

这让我很惊讶,255变成了0这就很符合位运算的反取操作符的要求
255色值的二进制位 11111111反取之后正好是00000000

代码思路安排,第一版,因为方法不止一个,有很多个。
先看第一个方法,也是最好的。

```c
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char u8_t;             /*
        * 使用typedef建立一个uint8_t类型
        * char虽然是字符型,但它也能存储整形
        * 取值范围在0~255
        * 一旦超出255会溢出
                                        */
void reverse ( void )
{
        u8_t R , G , B ,                                // 用于用户输入
                rR , rG , rB;                           // 用于做去反操作
        printf ( "Input RGB Color Value: " );
        scanf ( "%hhd %hhd %hhd" , &R , &G , &B );           /*
        * 记住这里只能用%hhd(8位整形,全称: short short decimal)来输入.
        * 绝对不能用%d(32位整形,全称: decimal),否则会出现溢出现象.
        * gcc也会报警告说,你必须把%d改为%s.
        * 好了这里不多说了,有点啰嗦!
                                                        */
        rR = ~R ,
                rG = ~G,
                rB = ~B;
        /*
        * 这里做位运算的反取操作符
        * 例如我输入的数值是: 255        二进制是8个1
        * 转为二进制为:      11111111 反取之后 00000000
        * 比如我喜欢66ccff这个hex颜色值
        * rgb是: 102 205 255
        * 转二进制: 102 == 1100110  反取之后 0011001
        * 转二进制: 204 == 11001100 反取之后 00110011
        * 转二进制: 255 == 11111111  反取之后 00000000
        * 66ccff 反取之后就变成了 993300
        */

        printf ( "Orginal RGB Color Value: %-2d %-2d %-2d\n",R , G , B );
        printf ( "Reverse RGB Color Value: %-2d %-2d %-2d  " , rR , rG , rB );
        /*
        * 打印是不要使用%hhd,打印是会出溢出的情况。
        * 必须是%hhd以上的类型比如: %hd %d %ld.
        * 使用%hd或者%d就行了。
        */
}

int main ( int argc , char *argv[] )
{
        while ( 1 )
        {
                system ( "cls" );
                reverse ( );
                getchar ( );
                getchar ( );
        }
        return 0;
}
```
这是第一个方法,使用位运算的反取操作符来实现的。
当然还有一种方法也能实现位运算的操作,就是使用减法,我们刚刚看了一下,255的二进制是8个1,反向过来是0,那么255-255是不是就等于0呀,第二个思路出来了。

```c
#include <stdio.h>
#include <stdlib.h>
#define RGB_MAX_VALUE   255             // RGB最大数值
typedef unsigned char u8_t;             /*
        * 使用typedef建立一个uint8_t类型
        * char虽然是字符型,但它也能存储整形
        * 取值范围在0~255
        * 一旦超出255会溢出
                                        */
void reverse ( void )
{
        u8_t R , G , B ,                                // 用于用户输入
                rR , rG , rB;                           // 用于做去反操作
        printf ( "Input RGB Color Value: " );
        scanf ( "%hhd %hhd %hhd" , &R , &G , &B );           /*
        * 记住这里只能用%hhd(8位整形,全称: short short decimal)来输入.
        * 绝对不能用%d(32位整形,全称: decimal),否则会出现溢出现象.
        * gcc也会报警告说,你必须把%d改为%s.
        * 好了这里不多说了,有点啰嗦!
                                                        */
        rR = RGB_MAX_VALUE - R ,
                rG = RGB_MAX_VALUE - G,
                rB = RGB_MAX_VALUE - B;
        /*
        * 这里使用RGB最亮的数值255,255 255 255就是RGB颜色最亮的颜色。
        * 用最亮的颜色减去当前颜色,就能得到反向的颜色。
        */

        printf ( "Orginal RGB Color Value: %-2d %-2d %-2d\n",R , G , B );
        printf ( "Reverse RGB Color Value: %-2d %-2d %-2d  " , rR , rG , rB );
        /*
        * 打印是不要使用%hhd,打印是会出溢出的情况。
        * 必须是%hhd以上的类型比如: %hd %d %ld.
        * 使用%hd或者%d就行了。
        */
}

int main ( int argc , char *argv[] )
{
        while ( 1 )
        {
                system ( "cls" );
                reverse ( );
                getchar ( );
                getchar ( );
        }
        return 0;
}
```
好了关于位运算的知识就聊到这里,希望大家能在编程的路上发现更多新的大陆。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-16 10:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表