Bitmap的读写和几个小儿科的滤镜效果~

   闲来玩玩图像处理,拿破仑说过:“不想自己实现滤镜的美工不是好程序员~~#@!*^...#&!@......”  因为在学校做过很多美工的工作,而且从小就喜欢画画所以对图像相关的东西都还比较感兴趣,而且PS提供了强大的功能,那就是自己写的滤镜程序可以以适当的形式嵌入作为滤镜库里的一种效果而存在,要是能自己能写常用的滤镜效果以后用起来就方便多了。从最简单的bitmap开始,bitmap是Windows系统下的标准图像格式。由于位图不采用任何压缩方法,所以大小一般都比较大。图像的结构可以表示如下:

1.首先是位图文件头

  两字节的位图文件类型用于指示位图,其值必须为0x4d42,即"BM",接着是4个字节存储的位图大小,之后的4个字节保用不用,最后是记录位图数据距离位图文件头的偏移量。

2.位图信息头

  内容太多就不一一介绍了。

  如果是24位位图,是指一个像素的颜色由24bit来决定,24bit中R、G、B三原色各占8bit,当然也有32bit位图,就是多了一个α分量,这个分量对于调节颜色的透明度很重要。24位的位图在位图信息头后面紧接着的就是位图数据,而对于8位、16位的位图,位图信息头后还有一个颜色块,用于说明各个颜色分量的亮度。固然我们可以使用MFC或者其他一些类库提供的编程接口来完成位图解析与处理的工作,但不从头实现一遍总会觉得失去了什么,而且别人的实现方式你怎么知道?现以C语言方式实现位图的读写与几个小滤镜效果。

  首先在bitmap.h中定义需要的数据结构:

 bitmap.h

  在位图处理的时候需要注意一些问题,比如说每行的字节数必须是整数,所以下面用到的lineByte的计算方式应该是这样:

 lineByte

  

  下面来看第一个滤镜:灰度效果。所谓灰度,无非是所有像素颜色介于黑白之间。因为纯黑色的表示是RGB(0,0,0),而纯白色则是RGB(255,255,255),所以要保证颜色从黑到白变化(0-255)就只能让RGB三个分量一致,所以灰度滤镜的公式为X=(R+G+B)/3,然后只需要将原图像的24位颜色数据全部赋值成X就行了。代码如下,pBmpBuf是用于存放位图数据的缓冲区。

 灰度滤镜

  貌似博客园不能上传bmp格式的图片,所以我把图片转成png格式的了,来看一下效果:

  

  

  第二个滤镜:黑白效果。顾名思义也就是图像只能有黑白两种颜色,而这个滤镜有点特殊,那就是根据什么来判断一个像素点到底应该是黑还是白,感性的认识是原来较深的地方应该用黑色,较浅的地方应该用白色。那么深和浅又怎么区分呢?这个就要按照你需要达到的效果来定义了,也就是说这个阈值是自定义的,甚至都可以做成一个滑动条来改变。我在这里是将原像素颜色计算得到的灰度值与100进行比较,如果大于等于100则为白色,反之则为黑色,代码如下:

 黑白滤镜

  效果如下:

   

  

  边缘查找其实是一个很复杂的效果,往深里做可以涉及到滤波器设计等,在这里从简,就按照最简单的想法,用像素的原始颜色数据减去柔化处理后的数据,得到的就是边缘,柔化的方法见底部。

 边缘查找

  效果如下,由于只是很简单的边缘查找算法,所以效果不是太好,但人物轮廓还是很明显的:

  

  

  反相效果就是底片效果,没什么好说的,对于像素的各个颜色分量对255求补,即R = 255-R,G = 255-G,B = 255-B。

 反相

  效果如下:

  

  

  柔化效果,这里采用取自身和周围8个像素点的颜色平均值来取代原像素的值,这样能够比较粗略的消除一些噪点,使得图像能够更加平滑,对于噪点比较多的图像效果就是图像更柔和了,而对于已经比较清晰的图像,相应给人的感觉就是清晰度变低了。

 柔化

  效果如下,注意左边是原图、右边是结果,仔细看还是能看出有差别的,右边模糊一些:

  

  完整实例程序猛击这里

  (注:程序仅处理24位的位图,所以没有颜色块,需要指明需要处理图片的完整路径,或者将所需处理图片放在工程中。结果另存为了copy-yourbitmap.bmp)

 
 
 
标签: 杂记

Bitmap的读写的更多相关文章

  1. Bitmap的读写和几个小儿科的滤镜效果~

    闲来玩玩图像处理,拿破仑说过:“不想自己实现滤镜的美工不是好程序员~~#@!*^...#&!@......”  因为在学校做过很多美工的工作,而且从小就喜欢画画所以对图像相关的东西都还比较感兴 ...

  2. android 内部缓存器(手机自带的存储空间中的当前包文件的路径)

    关于Context中: 1. getCacheDir()方法用于获取/data/data/<application package>/cache目录 2. getFilesDir()方法用 ...

  3. ACache【轻量级的开源缓存框架】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 官方介绍 ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架.轻量到只有一个java文件(由十几个类精简 ...

  4. 缓存之 ACache

    1.android缓存的介绍 Android开发本质上就是手机和互联网中的webserver之间进行通信,就必定须要从服务端获取数据.而重复通过网络获取数据是比較耗时的.特别是訪问比較多的时候.会极大 ...

  5. Android轻量级的开源缓存框架ASimpleCache

    点击查看原文 先上方法调用,写最经常使用的.其它不一一写 保存数据: ACache mACache=ACache.get(this); mACache.put("数据名称", js ...

  6. C#读写BitMap及颜色相乘

    C#读写BitMap及颜色相乘 private Bitmap ReadBitMapAndMultipy(Bitmap bitmap0) { int x1width = bitmap0.Width; i ...

  7. VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写

    本文转自 http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写 200 ...

  8. Bitmap 图片格式并用 C++ 读写 Bitmap

    转自 Bitmap 图片格式并用 C++ 读写 Bitmap 1.Bitmap 图片格式 每部分的具体内容就不展开了.要说的有两点: (1)调色板不是必须的,可有可无,有没有调色板可以通过位图文件头的 ...

  9. PPM图片格式及其C读写代码

    PPM图像格式介绍 PPM图像格式是由Jef Poskanzer 大叔,在我出生那一年,也就是1991年所创造的,碰巧的是PPM也是天蝎座. PPM(Portable Pixmap Format)还有 ...

随机推荐

  1. 10个实用的PHP正则表达式汇总

    原文 10个实用的PHP正则表达式汇总 正则表达式是程序开发中一个重要的元素,它提供用来描述或匹配文本的字符串,如特定的字符.词或算式等.但在某些情况下,用正则表达式去验证一个字符串比较复杂和费时.本 ...

  2. HDU 4324 Triangle LOVE 拓扑排序

    Problem Description Recently, scientists find that there is love between any of two people. For exam ...

  3. Android SDK 2.2 离线安装

    android的普通安装方法非常easy,不必多说. 因为普通安装方法速度非常慢,对一般的用户要数小时的时间等待. 为更高速安装,能够採取离线安装方法.即,先分别下载所需包,再安装. 一,首先下载SD ...

  4. 且看三星刚发布的Smart TV如何窃听你的枕边细语

    三星最新的SmartTV有一个很酷的新的声控功能,网络连接设备可以通过它来录下你说过的所有内容并把它上传到一个第三方的地方进行存储. 该公司的语音识别软件允许用户跟他们的电视通过声音来进行沟通.一旦电 ...

  5. SQLite数据库查看工具(免费)

    1. SQLite Administrator http://sqliteadmin.orbmu2k.de/ iteSpy 2.  SQLiteSpy   http://www.yunqa.de/de ...

  6. LINUX SCP 远程 文件 复制

    首先,以确保直接两个机器IP可以在每个ping通过 然后使用SCP命令从第一台主机向第二台主机复制文件 scp src chiwei@192.168.8.144:/home/chiwei/mydisk ...

  7. 使用CountDownLatch和CyclicBarrier处理并发线程

    闲话不说,首先看一段代码: { IValueCallback remoteCallback = new IValueCallback.Stub() { <strong><span s ...

  8. OWIN产生的背景以及简单介绍

    OWIN产生的背景以及简单介绍 随着VS2013的发布,微软在Asp.Net中引入了很多新的特性,比如使用新的权限验证模块Identity, 使用Async来提高Web服务器的吞吐量和效率等.其中一个 ...

  9. word-wrap同word-break的区别

    兼容 IE 和 FF 的换行 CSS 推荐样式 最好的方式是 以下是引用片段: word-wrap:break-word; overflow:hidden; 而不是 以下是引用片段: word-wra ...

  10. Mysql高级之事务

    原文:Mysql高级之事务 通俗的说事务: 指一组操作,要么都成功执行,要么都不执行.---->原子性 在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程-->隔离性 事务发生 ...