BMCP位图图片压缩算法
什么是位图?
位图也称像素图像或点阵图像,是由多个点组成的,这些点被称为像素。位图可以模仿照片的真实效果,具有表现力强、细腻、层次多和细节多等优点。
图片的压缩格式:
在Windows系统中,我们常见的bmp图片文件(bitmap file)就是位图图片。位图图片的文件大小一般都是最大的(这个可以从上上面的定义可知),不便于存储和传输,所以后来才出现了一些"压缩"格式图片,比如:gif,tiff,jpeg,png等等图片文件。
图片"压缩"又分为"有损压缩"和"无损压缩":
有损压缩 : 顾名思意就是还原出来的图片有失真现象,或者简单的说就是此还原图片不再是原来的图片。(如jpeg图片)
无损压缩 : 也即是不会有失真现象,还原出来的图片和原有图片是一模一样的。(如tiff图片)
根据不同的压缩格式与算法,最终的压缩图片文件大小也不尽相同,但一般都比位图文件小!!(如果不小还有意义吗?
)
PS: jpeg也可以是无损压缩
好了,上面简单的说了几个概念,现在回归正传,说一下下面的图片压缩算法,为了方便,我在这里简称为“BMCP”压缩格式。
BMCP 是采用无损压缩方法对图片进行压缩的,其处理流程大概如下:
对一幅位图的所有象素点进行扫描,取出所有象素点的颜色构造颜色表,并且记录这些象素点的颜色在颜色表中的索引位置,然后再对这些索引位置记录进行压缩后再存储数据,也就是存储的时候象素点位置只存储索引而不存储颜色!!(看到这里大家想到哪种格式图片没有?)
我们都知道一张图按行/列扫描时某个点的颜色在它后面连续同时出现的机率是很大的,所以我们的压缩就在这里了。简单的压缩原理用伪代码表示如下:
color = 图片的第一点象素点颜色;
while(图片的象素点没有扫描完)
newColor = 获取当前象素点的颜色;
if(newColor == color)
{
color的出现次数+1;
}else{
存储color;
color = newColor;
}
}
这样压缩后,我们就可以将一些连续出现的颜色点压缩为一个颜色点了。例如有下面的字符数据:
abceefaccccch
经我们压缩后就可以变为如下数据了:
a1b1c1e2f1a1c5h1
(注:字符后面的数字表示其连续出现的次数)
嗯?也许你会说这个看起来怎么字符反而多了?别急,在图片世界里,这样压缩还是有不错效果的,除非那个图片是很变态的,不会有两个以上相同颜色点出现!!!
BMCP的颜色索引值的存储:
我们大家都知道在bmcp里是存储颜色索引值的,而大家也知道在C#里的int/uint是占用4个字节空间的,所以我们存储象素颜色索引时肯定尽量避免存储为int/uint值!
在bmcp里颜色索引值的存储大小是根据颜色表的数量来决定的。当颜色表的颜色数量小于255个时索引占用的空间就只占用1个字节;而颜色表的数量小于ushort值范围时索引占用的空间就是2个字节;而如果颜色表数量小于ushort.MaxValue*255时就索引就占用3个字节(前2个字节存储的是“值/255”的整数部分,而后1个字节则存储的是“值%255”);否则就只能使用4个字节存储索引。
在上面的压缩计解中,我们还要存储一个“颜色连接出现的次数”值,这个值的大小在bmcp里是占用1个字节的,也就是说计算某颜色重复出现的次数时只最多只能记录到255次,如果还继续出现同一个颜色,则重新记录颜色!为什么要这样做呢?这是为了减少占用空间所做的,在很多图片中,不连续出现相同颜色的位置所占的比率也是很大的,而连续出现同一种颜色超出255次的地方则是少之又少。
BMCP的文件格式:
讲解完上面后,我们就可以整理出BMCP的文件存储格式了,如下表:
|
地址 |
大小 |
说明 |
|
0x000000 |
4个字节 |
bmcp标识字符 |
|
0x000004 |
1个字节 |
扩展位,暂时不使用,本来打算是用来存储扫描方式的,也就是区别行扫描还是列扫描(在图片高大于宽时列扫描有可能压缩率更高) |
|
0x000005 |
4字节 |
图片的宽度 |
|
0x000009 |
4字节 |
图片的高度 |
|
0x00000d |
4字节 |
颜色表的颜色总数 |
|
0x0000011 |
n*4字节 |
颜色表数据,n代表颜色表的总数,每个颜色占用4个字节 |
|
0x000???? |
n*m字节 |
图片各象素点的颜色索引。 |
好了,到此讲解完成,大概也知道BMCP是如何做到压缩位图文件的吧?
1。只存储每个象素点颜色索引值
2。将连续出现相同颜色的多个象素点压缩为一个“象素点”
经测试用BMCP压缩的位图文件大小基本和TIFF压缩的大小相差不多,但在颜色表数量较少时压缩出来的图片文件大小则小于TIFF格式图片。
此压缩算法免费,你可以自由使用而不用通知作者本人。![]()
源码下载:http://files.cnblogs.com/kingthy/Bmcp.rar
使用示例:
//压缩
Kingthy.Library.Image.Bmcp.Compress(@"g:\g.bmp", @"g:\g.bmcp");
//还原图片
using (Bitmap image = Kingthy.Library.Image.Bmcp.Decompress(@"g:\g.bmcp"))
{
image.Save(@"g:\g.dc.bmp",ImageFormat.Bmp);
}BMCP位图图片压缩算法的更多相关文章
- windows程序设计 加载位图图片
现在网上随便下个jpg图片,用windows自带的画图工具打开,点击画图工具左上角,文件->另存为->选择bmp,点击保存,保存好后,就得到一张位图了. 得到的位图,位图的内存比原图片jp ...
- C# 大图片压缩算法,减少图片体积
声明: 图片压缩算法,不建议对小图片进行压缩,一般文件小于1m的,真心没必要压缩, 图片很小的,例如:几百KB的图片,有可能不会减少图片体积,反而压缩后更大,也很正常, 请大家合理使用,并不是,所有图 ...
- Win10系列:VC++绘制位图图片
在使用Direct2D绘制图片的过程中,通过IWICImagingFactory工厂接口来得到绘制图片所需要的资源.本小节将介绍如何通过IWICImagingFactory工厂接口得到这些资源,并使用 ...
- BITMAP图片压缩算法三则--bilinear、nearest、cubic
原文:http://blog.chinaunix.net/uid-253932-id-3037805.html 工作需要,要弄截图且缩小.截图倒是好说,WIN API可以搞定,但是缩小且尽量不失真,这 ...
- 谷歌开源图片压缩算法Guetzli实测体验报告
谷歌大神又出开源新技术啦,这次是对JPEG格式的图片采用全新算法重新编码,输出的图片还是JPEG但是图片大小明显缩小,而质量不但没有损失,甚至还更加优化,速速来体验一把. 一.环境安装 下载谷歌开源软 ...
- 亲测Google开源JPEG图片压缩算法,可将JPEG文件缩小%35
具体方法如下(windows 平台) GitHub上下载guetzli源码,地址https://github.com/google/guetzli GitHub上下载 vcpkg源码,地址https: ...
- 浓缩的才是精华:浅析GIF格式图片的存储和压缩
成文迪, 在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦. GIF格式的历史 GIF(Graphics Interchange Format)原义是"图像互换 ...
- MFC编程入门之二十七(常用控件:图片控件PictureControl)
上一节讲的是滚动条控件,本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到的静态文本框都是 ...
- ueditor使用canvas在图片上传前进行压缩
之前就看到H5使用canvas就可以在前端使用JS压缩图片,这次接到任务要把这个功能嵌入到ueditor里面去,以节省流量,减轻服务器压力. H5使用canvas进行压缩的代码有很多,核心原理就是创建 ...
随机推荐
- ARTS打卡第三周
Algorithm 题目描述 Given an array of integers, find if the array contains any duplicates. Your function ...
- Vue (一) --- vue.js的快速入门使用
=-----------------------------------把现在的工作做好,才能幻想将来的事情,专注于眼前的事情,对于尚未发生的事情而陷入无休止的忧虑之中,对事情毫无帮助,反而为自己凭添 ...
- nginx 的各种配置
负载均衡 以上是ip的负载均衡,主要是保证 固定ip地址访问到固定服务,如果不做ip的匹配,那么每次请求的机器都不相同,就会出现问题,sessionid 之类的问题 //修改 路由负载均衡不能写has ...
- jeecg入门操作—菜单管理
一.菜单配置入口 登录jeecg平台,点击系统管理->菜单管理,弹出菜单管理界面 二.配置一级菜单 点击菜单录入 三.配置二级菜单 选中生成的一级菜单,点击菜单录入 四.菜单授权 五.注销系 ...
- Element ui 日期限制范围
时间限定范围: <el-date-picker type="date" placeholder="选择日期" v-model="addForm. ...
- maven依赖scope配置项讲解(转)
原文:https://blog.csdn.net/lisongjia123/article/details/56299006 <scope>的分类一.complie编译域,这个是Maven ...
- Binding介绍
一.Binding的源与路径 在大多数情况下Binding的源是逻辑层的对象,但有时候为了让UI元素产生一些联动效果也会使用Binding在控件间建立关联, 下面的代码是把一个TextBox的Text ...
- MongoDB系列:四、spring整合mongodb,带用户验证
在前面的两篇博客 MongoDB常用操作练习.springboot整合mongoDB的简单demo中,我们基本上熟悉了mongodb,也把它与spring boot进行了整合并且简单使用.在本篇博客中 ...
- PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套)
PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套) 需要的联系我:QQ: 1844912514 PHP九大接口视频教程( 支付宝,QQ,短信接口 ...
- android AVD 启动时报错
AVD启动报错 1.提示:ANDROID_SDK_ROOT is undefined / ERROR: This AVD’s configuration is missing a kernel fil ...