Centos7添加删除策略黑名单

开启防火墙:systemctl start firewalld
查看开放的端口和服务以及屏蔽的IP:firewall-cmd –zone=public –list-all
查看系统中查看系统中可用的服务:  firewall-cmd –get-services

允许全部网段访问本机80端口:firewall-cmd –permanent –zone=public –add-port=80/tcp  (–permanent永久生效,没有此参数重启后失效)
查看:                     firewall-cmd –zone= public –query-port=80/tcp

### 添加规则允许规则:
允许全部网段访问本机端口段:          firewall-cmd –permanent –zone=public –add-port=5060-5061/udp
允许[指定IP]访问本机10050:          firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=”ipv4″ source address=”172.17.134.13″ port protocol=”tcp” port=”10050″ accept”

允许[指定IP]访问本机全部tcp端口:     firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=”ipv4″ source address=”172.17.134.13″ port protocol=”tcp” port=”0-65535″ accept”

允许[指定IP]访问本机全部端口:        firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=”ipv4″ source address=”172.17.172.236″  accept”

允许[指定IP段]访问本机全部端口:   firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=”ipv4″ source address=”192.168.1.0/24″ accept”

允许[指定IP段]访问本机8080-8090端口: firewall-cmd –permanent –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.0/24″ port protocol=”tcp” port=”8080-8090″ accept’

### 添加禁止规则:
禁止[指定IP]访问本机8080端口:firewall-cmd –permanent –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.1″ port protocol=”tcp” port=”8080″ reject’
屏蔽[指定IP](reject):      firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=ipv4 source address=43.229.53.61 reject”
屏蔽[指定IP段](drop):       firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=ipv4 source address=’x.x.x.x/24′  drop”

###删除添加的规则:

删除端口:   firewall-cmd –permanent –zone=public –remove-port=8080/tcp 

删除IP+端口:firewall-cmd –permanent –zone=public –remove-rich-rule=”rule family=”ipv4″ source address=”10.0.5.0/24″ port protocol=”tcp” port=”10050″ accept”

***添加或者修改完规则后必须热加载才能生效:firewall-cmd –reload
查看屏蔽结果:firewall-cmd –list-rich-rules
因为在/usr/lib/firewalld/services/中事先定义了ssh.xml的相应的规则

来自 <https://www.cnblogs.com/faithH/p/11811286.html>

1.drop禁止特定ip连接ssh/22服务

  firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=ipv4 source address=’x.x.x.x/24′ service name=’ssh’ drop”

  firewall-cmd –reload ##重新加载防火墙配置,不然firewall-cmd –list-all-zones不会显示刚加上的规则

2.reject禁止特定ip连接ssh/22服务

  firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=’ipv4′ source address=’x.x.x.x/24′ service name=’ssh’ reject”

  firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=’ipv4′ source address=’x.x.x.x/24′ port port=22 protocol=tcp reject”

  firewall-cmd –reload

3.accept运行特定ip连接ssh/22服务

  firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=ipv4 source address=’x.x.x.x/24′ port port=22 procotol=tcp accept”

  firewall-cmd –reload

防火墙内的策略动作有DROP和REJECT两种,区别如下:

1、DROP动作只是简单的直接丢弃数据,并不反馈任何回应。需要Client等待超时,Client容易发现自己被防火墙所阻挡。

2、REJECT动作则会更为礼貌的返回一个拒绝(终止)数据包(TCP FIN或UDP-ICMP-PORT-UNREACHABLE),明确的拒绝对方的连接动作。连接马上断开,Client会认为访问的主机不存在。REJECT在IPTABLES里面有一些返回参数,参数如下:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

    至于使用DROP还是REJECT更合适一直未有定论,因为的确二者都有适用的场合。REJECT是一种更符合规范的处理方式,并且在可控的网络环境中,更易于诊断和调试网络/防火墙所产生的问题;而DROP则提供了更高的防火墙安全性和稍许的效率提高,但是由于DROP不很规范(不很符合TCP连接规范)的处理方式,可能会对你的网络造成一些不可预期或难以诊断的问题。因为DROP虽然单方面的中断了连接,但是并不返回任何拒绝信息,因此连接客户端将被动的等到tcp session超时才能判断连接是否成功,这样早企业内部网络中会有一些问题,例如某些客户端程序或应用需要IDENT协议支持(TCP Port 113, RFC 1413),如果防火墙未经通知的应用了DROP规则的话,所有的同类连接都会失败,并且由于超时时间,将导致难以判断是由于防火墙引起的问题还是网络设备/线路 故障。

    一点个人经验,在部署防火墙时,如果是面向企业内部(或部分可信任网络),那么最好使用更绅士REJECT方法,对于需要经常变更或调试规则的网络也是如此;而对于面向危险的Internet/Extranet的防火墙,则有必要使用更为粗暴但是安全的DROP方法,可以在一定程度上延缓******的进度(和难度,至少,DROP可以使他们进行TCP-Connect方式端口扫描时间更长)。

修改防火墙配置文件之前,需要对之前防火墙【/etc/firewalld/zones/public.xml】做好备份

重启防火墙后,需要确认防火墙状态和防火墙规则是否加载,若重启失败或规则加载失败,则所有请求都会被防火墙。

1.firewall-cmd –state           #查看firewall的状态

  firewall-cmd –list-all        #查看防火墙规则(只显示/etc/firewalld/zones/public.xml中防火墙策略)

  firewall-cmd –list-all-zones  #查看所有的防火墙策略(即显示/etc/firewalld/zones/下的所有策略)

  firewall-cmd –reload          #重新加载配置文件

2、关闭firewall:

  systemctl stop firewalld.service      #停止firewall

  systemctl disable firewalld.service   #禁止firewall开机启动

  firewall-cmd –state                  #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

3、firewalld的基本使用

  启动: systemctl start firewalld

  查看状态: systemctl status firewalld

  停止: systemctl disable firewalld

  禁用: systemctl stop firewalld

4.systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。

  启动一个服务:systemctl start firewalld.service

  关闭一个服务:systemctl stop firewalld.service

  重启一个服务:systemctl restart firewalld.service

  显示一个服务的状态:systemctl status firewalld.service

  在开机时启用一个服务:systemctl enable firewalld.service

  在开机时禁用一个服务:systemctl disable firewalld.service

  查看服务是否开机启动:systemctl is-enabled firewalld.service

  查看已启动的服务列表:systemctl list-unit-files|grep enabled

  查看启动失败的服务列表:systemctl –failed

5.配置firewalld-cmd

  查看版本: firewall-cmd –version

  查看帮助: firewall-cmd –help

  显示状态: firewall-cmd –state

  查看所有打开的端口: firewall-cmd –zone=public –list-ports

  更新防火墙规则: firewall-cmd –reload

  查看区域信息:  firewall-cmd –get-active-zones

  查看指定接口所属区域: firewall-cmd –get-zone-of-interface=eth0

  拒绝所有包:firewall-cmd –panic-on

  取消拒绝状态: firewall-cmd –panic-off

  查看是否拒绝: firewall-cmd –query-panic

CentOS 7 启动Oracle

1. 切换用户 

    su – oracle        — 使用户环境变量生效

2. 检查监听

    lsnrctl  status    — 查看状态

    lsnrctl  start      — 启动监听

3. 登录SqlPlus

    sqlplus /nolog

4. 登录数据库

    sqlplus   / as sysdba

5. 启动数据库

    startup 

6.关闭数据库

    shutdown

curl发送请求

我们在客户端开发过程中总免不了和后端进行api对接,有时候需要对返回的数据格式进行调试,有时候每次运行客户端来发送请求,这个未免效率太低,这里就来介绍一个好用的工具–curl。

curl

curl是一个向服务器传输数据的工具,它支持http、https、ftp、ftps、scp、sftp、tftp、telnet等协议,这里只针对http进行讲解一些常用的用法,具体安装请自行搜索。

打开百度

curl http://www.baidu.com

接着你就会看到百度的页面源代码输出。

如果要把这个网页保存下来,可以这样:

curl http://www.baidu.com > /tmp/baidu.html

你会看到一条进度条,然后源码就被重定向到了/tmp/baidu.html。

或者:

curl -o /tmp/baidu.html http://www.baidu.com

GET请求

默认直接请求一个url就是发出一个get请求,参数的话直接拼接在url里就好了,如

curl http://www.baidu.com/s?wd=curl

上述请求会上百度发起一条查询请求,参数是wd=url

POST请求

curl -d “name=test&page=1” http://www.baidu.com

-d 参数指定表单以POST的形式执行。

只展示Header

curl -I  http://www.baidu.com

可以看到只返回一些header信息

HTTP/1.1 200 OK
Date: Fri, 07 Nov 2014 09:48:58 GMT
Content-Type: text/html; charset=utf-8
Connection: Keep-Alive
Vary: Accept-Encoding
Set-Cookie: BAIDUID=E9DB2F0AC95CB6BFDAD9D5CFDCED0A12:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUPSID=E9DB2F0AC95CB6BFDAD9D5CFDCED0A12; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=9725_9165_1465_7800_9452_9498_6504_9509_6018_9700_9757_9531_9478_7798_9453_9793_9024; path=/; domain=.baidu.com
P3P: CP=” OTI DSP COR IVA OUR IND COM “
Cache-Control: private
Cxy_all: baidu+3057b288b211c770a1463cc8519b62a8
Expires: Fri, 07 Nov 2014 09:48:17 GMT
X-Powered-By: HPHP
Server: BWS/1.1
BDPAGETYPE: 1
BDQID: 0xfa28eff900012706
BDUSERID: 0

显示通信过程

-v参数可以显示一次http通信的整个过程,包括端口连接和http request头信息

curl -v www.baidu.com

* Adding handle: conn: 0x7ffe4b003a00
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* – Conn 0 (0x7ffe4b003a00) send_pipe: 1, recv_pipe: 0
* About to connect() to www.baidu.com port 80 (#0)
*   Trying 61.135.169.125…
* Connected to www.baidu.com (61.135.169.125) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.30.0
> Host: www.baidu.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 07 Nov 2014 09:49:49 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: Keep-Alive
< Vary: Accept-Encoding
< Set-Cookie: BAIDUID=062E02D23FBB651CF8455B699DF02B64:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
< Set-Cookie: BAIDUPSID=062E02D23FBB651CF8455B699DF02B64; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
< Set-Cookie: BDSVRTM=0; path=/
< Set-Cookie: BD_HOME=0; path=/
< Set-Cookie: H_PS_PSSID=7744_1429_7801_9583_9499_6506_6018_9769_9699_9757_9532_9477_7799_9453_9716_9023; path=/; domain=.baidu.com
< P3P: CP=” OTI DSP COR IVA OUR IND COM “
< Cache-Control: private
< Cxy_all: baidu+7dcb6b3c03d32c334d42f311919a14d6
< Expires: Fri, 07 Nov 2014 09:49:20 GMT
< X-Powered-By: HPHP
* Server BWS/1.1 is not blacklisted
< Server: BWS/1.1
< BDPAGETYPE: 1
< BDQID: 0xadb706860000088f
< BDUSERID: 0

如果你觉得上面的信息还不够,那么下面的命令可以查看更详细的通信过程。

curl –trace output.txt www.baidu.com

或者

curl –trace-ascii output.txt www.baidu.com

运行后,请打开output.txt文件查看。

HTTP方法

curl默认的HTTP方法是GET,使用-X参数可以支持其他动词。

curl -X POST www.example.com

curl -X DELETE www.example.com

Referer字段

有时你需要在http request头信息中,提供一个referer字段,表示你是从哪里跳转过来的。

curl –referer http://www.example.com http://www.example.com

User Agent字段

这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同设备,返回不同格式的网页,比如手机版和桌面版。

iPhone4的User Agent是

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7

curl可以这样模拟:

curl –user-agent “[User Agent]” [URL]

增加头信息

有时需要在http request之中,自行增加一个头信息。–header参数就可以起到这个作用。

curl –header “Content-Type:application/json” http://example.com

来自 <http://stormzhang.com/devtools/2014/11/07/use-curl-debug/>

-H, —header LINE Custom header to pass to server (H)

-d, —data DATA HTTP POST data (H)

示例命令

1curl -H “Content-Type: application/json” -d ‘{“object_kind”:”merge_request”,”object_attributes”:{“id”:22,”target_branch”:”master”,”source_branch”:”master”,”source_project_id”:57,”author_id”:9,”assignee_id”:null,”title”:”Master Title”,”created_at”:”2014-07-02T02:31:20.000Z”,”updated_at”:”2014-07-02T02:36:33.008Z”,”milestone_id”:null,”state”:”closed”,”merge_status”:”unchecked”,”target_project_id”:55,”iid”:7,”description”:”description_content”}}’ http://10.0.6.122:9002/merge_request

来自 <https://cloud.tencent.com/developer/article/1328118>

curl -v -H “Content-Type:application/json” \

-H  “Authorization:Basic Y2xpZW50Q3JlZGVudGlhbHNJZDpzZWNyZXQ=” \

-X POST  http://172.16.5.172:3396/crm/oauth/token?grant_type=client_credentials

请求soup

curl -X POST -d @testrequest.xml \

–header “Content-Type:application/json” \

http://localhost:8080/services/xxxxService

testrequest.xml

<soapenv:Envelope xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:ent=”http://entity.xxx.com”>

   <soapenv:Header/>

   <soapenv:Body>

      <ent:getTableData>

         <!–Optional:–>

         <ent:oaUsername>zhangsan</ent:oaUsername>

      </ent:getTableData>

   </soapenv:Body>

</soapenv:Envelope>

ls 排序

首先我们通过man 来看看 ls其中有几项;

  • -S     sort by file size : 按大小降序

–sort=WORD

sort by WORD instead of name: none -U, extension -X, size -S, time -t, version -v

–time=WORD

with -l, show time as WORD instead of modification time: atime -u, access -u, use -u, ctime -c, or status -c; use specified time as sort key if –sort=time

–time-style=STYLE

with -l, show times using style STYLE: full-iso, long-iso, iso, locale, +FORMAT. FORMAT is interpreted like ‘date’; if FORMAT is FORMAT1<newline>FORMAT2, FORMAT1

applies to non-recent files and FORMAT2 to recent files; if STYLE is prefixed with ‘posix-’, STYLE takes effect only outside the POSIX locale

  • -t     sort by modification time 按时间升序
  • -u     with -lt: sort by, and show, access time with -l: show access time and sort by name otherwise: sort by access time  以文件上次被访问的时间排序。
  • -U     do not sort; list entries in directory order 不做排序
  • -v     natural sort of (version) numbers within text 
  • -X     sort alphabetically by entry extension 

ls -lS    按大小降序

ls -l | sort -n -k5     按大小升序

ls -lrt   按时间降序

ls -lnt    按时间升序

ls -l | sort -k9    按文件名升序(这是ls的默认输出方式)

ls -lr 按文件名降序

ls -l | sort -rk9   按文件名降序

附:

ls对当前目录和文件大小排序

du -s * | sort -nr

只对当前目录排序,并用直观的大小显示出来

for i in $(ls -l |grep ‘^d’ |du -s * |sort -nr|awk ‘{print $2}’);do du -sh $i;done

Vi 中文乱码

Vi ~/.vimrc 添加以下内容

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936

set termencoding=utf-8

set encoding=utf-8

命令行中打开文件后执行命令

<< EOF 是执行一命令,命令从<<EOF行开始到EOF出现的地方结束。例如:

ftp -n << EOF

open $host 21

user $user $password

cd $remote_dir

lcd $local_dir

get $file_name

bye

EOF

<< – EOF 与 << EOF 只有细微的差别(在菜单式命令中每行的开头可以不必顶格),下面这段代码使用<<EOF会出错,必须使用<<-EOF

ftp -n <<- EOF

        open $host 21

        user $user $password

        cd $remote_dir

        lcd $local_dir

        get $file_name

        bye

        EOF

EOF并不是唯一的,例如可以这样:

ftp -n <<- !

        open $host 21

        user $user $password

        cd $remote_dir

        lcd $local_dir

        get $file_name

   

   

sed变量 引号

在使用sed对日志或者其它文本进行parse的过程当中,有时候我们需要引用外部变量的值,

或者获取一个shell命令执行的结果,以便达到更加可观的输出结果。这里介绍如何做到。

sed中使用变量替换

1.sed命令使用双引号的情况下,使用$var直接引用

$ echo|sed “s/^/$RANDOM.rmvb_/g” 

29328.rmvb_ 

# 上面例子引用了一个环境变量$RANDOM的值

2.sed命令使用单引号的情况下,使用'”$var”‘引用

类似,我们可以看到

$ echo|sed ‘s/^/'”$RANDOM”‘.rmvb_/g’ 

31338.rmvb_

sed中执行外部命令

1.sed命令使用单引号的情况下使用’`shell command`’或者’$(shell command)’引用命令执行的结果

还是以上面案例分析,例子如下

$ echo|sed ‘s/^/’`echo $RANDOM`’.rmvb_/g’ 

8063.rmvb_ 

# 上面的例子使用了旧式的命令替换,也可以采用新式的命令替换方法,如下

$ echo|sed ‘s/^/’$(echo $RANDOM)’.rmvb_/g’ 

18554.rmvb_ 

# 下面例子取用当前日期作为结果的一部分,如下

$ echo|sed ‘s/^/’$(date +”%Y%m%d”)’.rmvb_/g’ 

20120108.rmvb_ 

2.sed命令使用双引号的情况下直接`shell command`或者$(shell command)引用命令执行的结果 

类似的,双引号的情况,如下

$ echo|sed “s/^/$(date +”%Y%m%d”).rmvb_/g” 

20120108.rmvb_ 

# 使用环境变量$RANDOM以及旧式命令替换的例子

$ echo|sed “s/^/`echo $RANDOM`.rmvb_/g” 

4988.rmvb_

总结

在sed语句里面,变量替换或者执行shell命令,双引号比单引号少绕一些弯子

awk 设置输入输出分隔符

awk  F=”\t” ‘{OFS=”:”;print $1,$2}’

最后如果只写print 相当于print $0,意思是输出这些文本,未使用分隔符,“,”表示使用分隔符,使用OFS定义的分隔符

如何:使用颜色矩阵对单色进行变换

GDI+ 提供用于存储和操作图像的 ImageBitmap 类。 ImageBitmap 对象用一个 32 位数字存储每个像素的颜色:红、绿、蓝和 Alpha 各 8 位。 这四个分量的值都是 0 到 255,其中 0 表示没有亮度,255 表示最大亮度。 alpha 分量指定颜色的透明度:0 表示完全透明,255 表示完全不透明。

颜色矢量采用 4 元组形式(红色、绿色、蓝色、alpha)。 例如,颜色矢量 (0, 255, 0, 255) 表示一种没有红色和蓝色但绿色达到最大亮度的不透明颜色。

表示颜色的另一种惯例是用数字 1 表示亮度达到最大。 通过使用这种约定,上一段中描述的颜色将可以由矢量 (0, 1, 0, 1) 表示。 在执行颜色变换时,GDI+ 遵循使用 1 为最大亮度的惯例。

可通过用 4×4 矩阵乘以这些颜色矢量将线性变换(旋转和缩放等)应用到颜色矢量中。 但是,您不能使用 4×4 矩阵进行平移(非线性)。 如果在每个颜色矢量中再添加一个虚拟的第 5 坐标(例如,数字 1),则可使用 5×5 矩阵应用任何组合形式的线性变换和平移。 由线性变换组成的后跟平移的变换称为仿射变换。

例如,假设您希望从颜色 (0.2, 0.0, 0.4, 1.0) 开始并应用下面的变换:

  1. 将红色分量乘以 2。
  2. 将 0.2 添加到红色、绿色和蓝色分量中。

下面的矩阵乘法将按照列出的顺序进行这对变换。

颜色矩阵的元素按照先行后列(从 0 开始)的顺序进行索引。 例如,矩阵 M 的第五行第三列由 M[4][2] 表示。

5×5 单位矩阵(在下面的插图中显示)在对角线上为 1,在其他任何地方为 0。 如果用单位矩阵乘以颜色矢量,则颜色矢量不会发生改变。 形成颜色变换矩阵的一种简便方法是从单位矩阵开始,然后进行较小的改动以产生所需的变换。

有关矩阵和变换的更详细的讨论,请参见坐标系统和变形

示例

下面的示例采用一个使用一种颜色 (0.2, 0.0, 0.4, 1.0) 的图像,并应用上一段中描述的变换。

下面的插图在左侧显示原来的图像,在右侧显示变换后的图像。

下面示例中的代码使用以下步骤进行重新着色:

  1. 初始化 ColorMatrix 对象。
  2. 创建一个 ImageAttributes 对象,并将 ColorMatrix 对象传递给 ImageAttributes 对象的 SetColorMatrix 方法。
  3. ImageAttributes 对象传递给 Graphics 对象的 DrawImage 方法。

C#

VB

Image image = new Bitmap(“InputColor.bmp”);
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = {
   new float[] {2,  0,  0,  0, 0},        // red scaling factor of 2
   new float[] {0,  1,  0,  0, 0},        // green scaling factor of 1
   new float[] {0,  0,  1,  0, 0},        // blue scaling factor of 1
   new float[] {0,  0,  0,  1, 0},        // alpha scaling factor of 1
   new float[] {.2f, .2f, .2f, 0, 1}};    // three translations of 0.2

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

e.Graphics.DrawImage(image, 10, 10);

e.Graphics.DrawImage(
   image,
   new Rectangle(120, 10, width, height),  // destination rectangle
   0, 0,        // upper-left corner of source rectangle
   width,       // width of source rectangle
   height,      // height of source rectangle
   GraphicsUnit.Pixel,
   imageAttributes);

编译代码

前面的示例是为使用 Windows 窗体而设计的,它需要 Paint 事件处理程序的参数 PaintEventArgse

矩阵如何:修剪颜色

剪切是指按照与另一种颜色分量成比例的量来增加或减少颜色分量。 例如,考虑这样一种变换,将红色分量增加蓝色分量值的一半。 在这样的变换下,(0.2, 0.5, 1) 颜色将变成 (0.7, 0.5, 1)。 新的颜色分量是 0.2 + (1/2)(1) = 0.7。

示例

下面的示例从文件 ColorBars4.bmp 构造一个 Image 对象。 然后,该代码将上一段中描述的剪切变换应用到图像中的每个像素。

下面的插图在左侧显示原来的图像,在右侧显示剪切后的图像。

下表列出在剪切变换前后,四栏的颜色矢量。

Original剪切后
(0, 0, 1, 1)(0.5, 0, 1, 1)
(0.5, 1, 0.5, 1)(0.75, 1, 0.5, 1)
(1, 1, 0, 1)(1, 1, 0, 1)
(0.4, 0.4, 0.4, 1)(0.6, 0.4, 0.4, 1)

VB

Image image = new Bitmap(“ColorBars.bmp”);
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = {
        new float[] {1,  0,  0,  0, 0},
        new float[] {0,  1,  0,  0, 0},
        new float[] {0.5f,  0,  1,  0, 0},
        new float[] {0,  0,  0,  1, 0},
        new float[] {0, 0, 0, 0, 1}};

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

e.Graphics.DrawImage(image, 10, 10, width, height);

e.Graphics.DrawImage(
   image,
   new Rectangle(150, 10, width, height),  // destination rectangle
    0, 0,        // upper-left corner of source rectangle
    width,       // width of source rectangle
    height,      // height of source rectangle
    GraphicsUnit.Pixel,
   imageAttributes);

编译代码

前面的示例是为使用 Windows 窗体而设计的,它需要 Paint 事件处理程序的参数 PaintEventArgse。 用系统上有效的图像名称和路径替换 ColorBars.bmp

腾讯云图