bitmap应用及C语言实现

本文源于三篇文章:

http://blog.chinaunix.net/uid-22663647-id-1771837.html

http://www.wikieno.com/2012/03/data-structure-bitmap/

http://blog.csdn.net/zhoubl668/article/details/6781587

在此,感谢三位作者的分享。

这三篇文章,我费了一段时间才理解,其中隐去了部分过程细节,所以,对于初学者不太容易理解。在此,我简介下我的理解过程,希望对于初学bitmap的道友有所帮助,文中可能存在部分错误,欢迎留言指出。

1 对数组array[4,7,2,5,3]排序

bitmap采用的是以空间换时间的思想,数组中最大元素值为7,所以在内存中开辟8位的存储空间,存储空间大小的确定方法是(元素最大值/8+1),之所以除以8,是因为开辟空间的时候以byte为单位,1byte=8bit。

开辟8位的空间后,每位初始化为0,如下表:

0号位1号位2号位3号位4号位5号位6号位7号位
00000000

开始遍历array数组,array[0]=4时,则将4号位’置1,变为下表:

0号位1号位2号位3号位4号位5号位6号位7号位
00001000

array[1]=7时,则将7号位置1,变为下表:

0号位1号位2号位3号位4号位5号位6号位7号位
00001001

直至遍历完array数组,空间各位如下表:

0号位1号位2号位3号位4号位5号位6号位7号位
00111101

从头开始遍历空间中各位,不为0的输出其为号,得:2,3,4,5,7,其效率为O(n)=8

 

2 8位电话号码问题

初始化空间如下表:

0号位1号位......9999 9999号位
00000

读到一个号码时,将该号码对应的号位置1,最后遍历存储空间的各位,其消耗的空间为(10^8b)/(8*10^6)=12.5MByte,除以8是把位转换为字节,除以10^6是转换为M,(篇头三篇文章的结果为1.25MByte,不知道怎么计算的,知道的朋友请留意,先谢了),效率为O(n)=10^8

 

3 开辟空间及数据存储的方式

以array[1,2,5,8,10]为例:

初始化空间如下表:

0号位1号位2号位    7号位8号位     15号位15号位
0000000000000000

申请时以字节申请空间:g_bitmap = (char *)malloc((size/8+1)*sizeof(char));
此时将上表从7号位处分开(即2个字节的空间,定义字节数组byte[]):

byte[0]
0号位1号位...7号位
00...0

byte[1]
0号位1号位...7号位
00...0

读取array[0]=1时,

array[0]/8=0——>byte[0]

array[0]%8=1——>1号位,即将byte[0]中的1号位置1,

读取array[4]=10时,

array[0]/8=1——>byte[1]

array[0]%8=2——>2号位,即将byte[1]中的2号位置1,

最后,空间变为:

byte[0]
0号位1号位2号位3号位4号位5号位6号位7号位
01100100

byte[1]
0号位1号位2号位3号位4号位5号位6号位7号位
10100000

遍历每个byte[]下的每位,为1的输出(逆运算得到该位在array[]中的值),

上面的两个例子在编程时,也经过这样的处理,详细可参考篇头biti-leaf的程序,

将他的代码全都放在同一.cpp文件中,稍作修改即可在VC6.0中运行。

这是一个用于C++ MFC开发的Bitmap图片操作类,在文件中叫CBitmapEx,可用于放大,缩小,翻转,过渡和其他有用的功能,有兴趣的朋友可以下载看看。 部分public method: // // void Create(long width, long height); // void Create(CBitmapEx& bitmapEx); // void Load(LPTSTR lpszBitmapFile); // void Save(LPTSTR lpszBitmapFile); // void Scale(long horizontalPercent=100, long verticalPercent=100); // void Rotate(long degrees=0, _PIXEL bgColor=_RGB(0,0,0)); // void FlipHorizontal(); // void FlipVertical(); // void MirrorLeft(); // void MirrorRight(); // void MirrorTop(); // void MirrorBottom(); // void Clear(_PIXEL clearColor=_RGB(0,0,0)); // void Negative(); // void Grayscale(); // void Sepia(long depth=34); // void Emboss(); // void Engrave(); // void Pixelize(long size=4); // void Draw(HDC hDC); // void Draw(long dstX, long dstY, long width, long height, // CBitmapEx& bitmapEx, long srcX, long srcY); // void Draw(long dstX, long dstY, long width, long height, // CBitmapEx& bitmapEx, long srcX, long srcY, long alpha); // void Draw(long dstX, long dstY, long dstWidth, long dstHeight, // CBitmapEx& bitmapEx, long srcX, long srcY, long srcWidth, long srcHeight); // void Draw(long dstX, long dstY, long dstWidth, long dstHeight, CBitmapEx& bitmapEx, // long srcX, long srcY, long srcWidth, long srcHeight, long alpha); // void DrawTransparent(long dstX, long dstY, long width, long height, // CBitmapEx& bitmapEx, long srcX, long srcY, _PIXEL transparentColor=_RGB(0,0,0)); // void DrawTransparent(long dstX, long dstY, long width, long height, // CBitmapEx& bitmapEx, long srcX, long srcY, long alpha, // _PIXEL transparentColor=_RGB(0,0,0)); // void DrawTransparent(long dstX, long dstY, long dstWidth, long dstHeight, // CBitmapEx& bitmapEx, long srcX, long srcY, long srcWidth, long srcHeight, // _PIXEL transparentColor=_RGB(0,0,0)); // void DrawTransparent(long dstX, long dstY, long dstWidth, long dstHeight, // CBitmapEx& bitmapEx, long srcX, long srcY, long srcWidth, long srcHeight, // long alpha, _PIXEL transparentColor=_RGB(0,0,0)); // LPBI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值