百度
360搜索
搜狗搜索

bitmap,什么是bitmap文件详细介绍

本文目录一览: 什么是Bitmap

a) Bitmap如何做到多维交叉计算的?

Bit即比特,是目前计算机系统里边数据的最小单位,8个bit即为一个Byte。一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。
Bitmap可以理解为通过一个bit数组来存储特定数据的一种数据结构;由于bit是数据的最小单位,所以这种数据结构往往是非常节省存储空间。比如一个公司有8个员工,现在需要记录公司的考勤记录,传统的方案是记录下每天正常考勤的员工的ID列表,比如2012-01-01:[1,2,3,4,5,6,7,8]。假如员工ID采用byte数据类型,则保存每天的考勤记录需要N个byte,其中N是当天考勤的总人数。另一种方案则是构造一个8bit(01110011)的数组,将这8个员工跟员工号分别映射到这8个位置,如果当天正常考勤了,则将对应的这个位置置为1,否则置为0;这样可以每天采用恒定的1个byte即可保存当天的考勤记录。
综上所述,Bitmap节省大量的存储空间,因此可以被一次性加载到内存中。再看其结构的另一个更重要的特点,它也显现出巨大威力:就是很方便通过位的运算(AND/OR/XOR/NOT),高效的对多个Bitmap数据进行处理,这点很重要,它直接的支持了多维交叉计算能力。比如上边的考勤的例子里,如果想知道哪个员工最近两天都没来,只要将昨天的Bitmap和今天的Bitmap做一个按位的“OR”计算,然后检查那些位置是0,就可以得到最近两天都没来的员工的数据了,比如:

数据结构与算法 - Bit-Map , RoaringBitmap

BitMap(位图)就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间。BitMap解决 海量数据寻找重复、判断个别元素是否在海量数据当中 等问题
假设我们要对0-7内的5个元素(4,7,2,5,3)进行排序(这里假设元素没有重复)。我们可以使用BitMap算法达到排序目的。要表示8个数,我们需要8个byte。
1. 首先我们开辟一个字节(8bit)的空间,将这些空间的所有的bit位都设置为0
2. 然后遍历这5个元素,第一个元素是4,因为下边从0开始,因此我们把第五个字节的值设置为1
3. 然后再处理剩下的四个元素,最终一个字节的状态如下图
4. 现在我们遍历一次byte区域,把值为1的bit的位置输出(2,3,4,5,7),这样便达到了排序的目的
从上面的例子我们可以看出,BitMap算法的思想还是比较简单的,关键的问题是如何确定10进制的数到2进制的映射图
假设需要排序或则查找的数的总数N=100000000,BitMap中1bit代表一个数字,1个int = 4Bytes = 4*8bit = 32 bit,那么N个数需要N/32 int空间。所以我们需要申请内存空间的大小为int a[1 + N/32],其中:a[0]在内存中占32为可以对应十进制数0-31,依次类推:
a[0]-----------------------------> 0-31
a[1]------------------------------> 32-63
a[2]-------------------------------> 64-95
a[3]--------------------------------> 96-127
a[n]--------------------------------> n 32 - n 32+31
那么十进制数如何转换为对应的bit位,下面介绍用位移将十进制数转换为对应的bit位:
1. 求十进制数在对应数组a中的下标
十进制数0-31,对应在数组a[0]中,32-63对应在数组a[1]中,64-95对应在数组a[2]中………,使用数学归纳分析得出结论:对于一个十进制数n,其在数组a中的下标为:a[n/32]
2. 求出十进制数在对应数a[i]中的下标
例如十进制数1在a[0]的下标为1,十进制数31在a[0]中下标为31,十进制数32在a[1]中下标为0。 在十进制0-31就对应0-31,而32-63则对应也是0-31,即给定一个数n可以通过模32求得在对应数组a[i]中的下标。
3. 位移
对于一个十进制数n,对应在数组a[n/32][n%32]中,但数组a毕竟不是一个二维数组,我们通过移位操作实现置1 a[n/32] |= 1 << n % 32 移位操作:a[n>>5] |= 1 << (n & 0x1F)
n & 0x1F 保留n的后五位 相当于 n % 32 求十进制数在数组a[i]中的下标
bitmap 适用于数据较为密集的时候,但是对于稀疏数据的话, bitmap 存在存储空间的浪费, 举个例子:若只存放0~40亿中的第40亿的数据,此时前面的存储空间白白浪费了 为了解决位图在稀疏数据下的问题,目前有多种压缩方案以减少内存提高效率:WAH、EWAH、CONCISE、RoaringBitmap等。前三种采用行程长度编码(Run-length-encoding)进行压缩,RoaringBitmap则是在压缩上更进一步,并且兼顾了性能
roaringbitmap 简称RBM,属于是bitmap的一个进化,即压缩位图,不过在roaringbitmap中不只包含bitmap这一种数据结构,而是包涵了多种存储的方式,以此来达到压缩位图的目的
在roaringbitmap中共有4种Container: arraycontainer(数组容器),bitmapcontainer(位图容器),runcontainer(行程步长容器),sharedcontainer(共享容器)
参考:

bmp是什么意思

BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱来的缺点- 占用磁盘空间过大。所以,BMP在单机上比较流行。
BMP的文件结构
位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节(位图数据,即图像数据,Data Bits或Data Body)阵列,BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
bmp是什么意思BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱来的缺点--占用磁盘空间过大。所以,BMP在单机上比较流行。

$bitmap是什么文件

位图文件(Bitmap),扩展名是.bmp或者.dib。位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,非压缩格式的,占存储空间,不在网络上传送。jpg格式弥补位图文件这个缺点
位图文件($Bitmap)。NTFS卷的分配状态都存放在位图文件中,其中每一位(bit)代表卷中的一簇,标识该簇是空闲的还是已被分配了的,由于该文件可以很容易的被扩大,所以NTFS的卷可以很方便的动态的扩大,而FAT格式的文件系统由于涉及到FAT表的变化,所以不能随意的对分区大小进行调整。
引用 网页链接

什么是bitmap文件

位图文件(bitmap),扩展名是.bmp或者.dib。位图是windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,非压缩格式的,占存储空间,不在网络上传送。jpg格式弥补位图文件这个缺点

bitmap的简易使用

一、创建bitmap对象
Bitmap是一个final类,因此不能被继承。Bitmap只有一个构造方法,且该构造方法是没有任何访问权限修饰符修饰,官方解释为private的
所以Bitmap不能直接new。但是我们可以利用Bitmap的静态方法createBitmap()和BitmapFactory的decode系列静态方法创建Bitmap对象。
ps:Bitmap.createBitmap()与其说是创建Bitmap对象,个人感觉不如说是对bitmap对象进行操作然后得到的新的Bitmap对象

1)createBitmap(Bitmap source, int x, int y, int width, int height):从原位图中指定坐标点(x,y)开始,从中挖取宽width、高height的一块出来,创建新的Bitmap对象。
2)createScaledBitmap(Bitmap source, int dstWidth, int dstHeight, boolean filter):对源位图进行缩放,缩放成指定width、height大小的新位图对象。
3)createBitmap(int width, int height, Bitmap.Config config):创建一个宽width、高height的新位图。
4)createBitmap(Bitmap source, int x, int y, int width, int height, Matrix matrix, boolean filter):从原位图中指定坐标点(x,y)开始,
从中挖取宽width、高height的一块出来,创建新的Bitmap对象。并按Matrix指定的规则进行变换。

BitmapFactory是一个工具类,它提供了大量的方法来用于从不同的数据源来解析、创建Bitmap对象

1)decodeFile(String pathName):从pathName指定的文件中解析、创建Bitmap对象。
2)decodeFileDescriptor(FileDescriptor fd):从FileDescriptor对应的文件中解析、创建Bitmap对象。
3)decodeResource(Resources res, int id):根据给定的资源ID从指定资源中解析、创建Bitmap对象。
4)decodeStream(InputStream is):从指定的输入流中解析、创建Bitmap对象
5)decodeByteArray(byte[] data, int offset, int length):从指定的字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象。

二、简易优化
谷歌推荐压缩方式

Android Bitmap理解

参考: Android Bitmap 详解:关于 Bitamp 你所要知道的一切
Android Bitmap(位图)详解
图片是由大量且有限个数的像素点组成。把一张图片通过bitmap的方式创建到内存中,实际上就是在内存中创建了一个叫做Bitmap的对象,然后把 图片所有像素 解码后的数据存放在Bitmap对象里面,Bitmap就拥有了图片的宽高,透明度,颜色值等数据。所以Bitmap的创建是通过BitmapFactory.decodeXxx()。
Config是Bitmap类中的枚举类。像素由ARGB四个颜色通道组成。Config描述位图中像素的存储方式。 这里的存储方式,无非就是对颜色通道和用多大的容器(bit)来存储的排列组合。所以config会影响图片透明度,占用内存大小,保存成文件的大小,图片质量。 Config的字母表示该配置存储的像素的颜色通道,数字表示对应通道的数据用多少位来存储。
ALPHA_8:表示只存储alpha通道,使用8bit(1字节)的内存(容器)来存储一个像素。 RGB_565:表示存储RGB三个通道,分别使用5bit,6bit,5bit的内存(容器)来存储一个像素。 ARGB_4444:表示存储ARGB四个通道,每个通道都是以4bit的内存(容器)来存储一个像素。 ARGB_8888:表示存储ARGB四个通道,每个通道都是以8bit的内存(容器)来存储一个像素。
所以,ARGB_8888配置占用内存最大,图片质量最高。 图片压缩的一个思路就是降低图片的配置。
总内存 = 宽的像素数 × 高的像素数 × 每个像素点占用的大小 注: 1 byte = 8 bit 1 KB = 1024 byte

BitMap和BitSet

Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,可以很大力度的节省空间,常用于对大量整数做去重和查询操作。
1byte=8bit 1kb=1024byte 1mb=1024kb 1gb=1024mb java中 int类型占用4个字节=4*8=32bit
从上述结果来看,按位存储比按字节存储数字节约了(7.45/0.233-1约等于31倍空间),而且按字节存储根据内存4G的要求无法一次性在内存中进行处理。
众所周知,每一位的取值无非就是0和1,给每一位编号,那么用0表示数字存在,1表示数字不存在。 假如现在有一个字节也就是8位的空间,那么按照BitMap,可以表示8个数字,
按照上图所示,该字节的8位表示了整数数组[6,5,2,0]。那么java中int类型占用了4个字节,也就是32位,那么就可以最多表示32个数字。超过32位数字呢?那就使用两个以上int去表示。
假设我们要存储的数字最大值位N,则申请int temp[1+N/32]的数组空间,其中: temp[0]可表示 0~31 temp[1]可表示 32-63 .....以此类推 给定任一整数M,M数字所在数组中的下标位置就应该是M/32,M数字所在的位就是M%32
总共两步 1.找到整数所在数组temp的下标 int index = M/32 2.将temp[index] 的第M%32位置1
temp[index]=temp[index] | (1<<(M%32))
根据bitMap的原理可知,想要清除掉一个数字,那就是将对应的位置0 总共两步 1.找到整数所在数组temp的下标 int index = M/32 2.将temp[index] 的第M%32位置0 temp[index]=temp[index] &(~ (1<<(M%32)))
根据每一位代表一个数字,1表示存在,0表示不存在,那么只需要判断整数对应位是否位1即可 总共两步 1.找到整数所在数组temp的下标 int index = M/32 2.将temp[index] 的第M%32位置0 temp[index] &(1<<(M%32) != 0?"存在":"不存在"
运行结果
BitSet就是实现了Bit-Map算法。BitSet位于java.util包下,从JDK1.0开始就已经有了。该类实现了一个按需增长的位向量。位集的每一个组件都有一个boolean类型的值。BitSet的每一位代表着一个非负整数。可以检查、设置、清除单个位。一个BitSet可以通过逻辑与、逻辑或、逻辑异或去修改另一个BitSet。默认情况下,所有位的标识都是false。
设值
清除
检查
BitSet有三种构造方法,我们直接来看无参构造器
可以看到BitSet是使用long数组存储。那么long类型占用8个字节,即64位,一个long类型可表示64个数字。默认设置BitSet可表示最大的位数为64位。与上述自己实现的基本类似。
再来看set方法
get方法
clear方法
可以看到JDK中的BitSet实现原理与第三节中一样,采用Bit-Map思想,BitSet封装较多的API,可供开发者们随意使用。

阅读更多 >>>  java数据类型有哪几种,java中的基本数据类型有几种

Redis中BitMap技术简介及应用

BitMap是一串连续的二进制数字(0和1),类似于位数组,每一位所在的位置为偏移量(offset),类似于数组索引,BitMap就是通过最小的单位bit来进行0|1的设置,时间复杂度位O(1),表示某个元素的值或者状态。由于bit是计算机中最小的单位,使用它进行储存将非常节省空间。特别适合一些数据量大的场景。例如,统计每日活跃用户、统计每月打卡数等统计场景。1天记录1000W用户的活跃统计数据,只需要10000000/8/1024/1024 ≈1.2M。

Redis从2.2.0版本开始新增了setbit,getbit,bitcount,bitop等几个BitMap相关命令,虽然是新命令,但是并没有增加新的数据类型,它还是属于String类型。Redis中的BitMap最大占用内存大小限制在512M之内,即2^32。

设置某个key的指定偏移量的value值为0或者1,key不存在时自动生成一个新的字符串值,字符串会进行伸展,该偏移量前面的位值默认为0,偏移量offset参数必须大于等于0,小于2^32。

时间复杂度:O(1)

返回值:指定偏移量存储的值

示例:

获取key指定偏移量上的值,当key不存在时,返回0。

时间复杂度:O(1)

返回值:指定偏移量上存储的值

示例:

统计给定key中,被设置为1的比特位的数量,可以通过start和end参数设置范围。

时间复杂度:O(n)

返回值:key中被设置为1的数量

示例:

对一个或多个key进行位操作,并将结果保存到destkey上。操作方式可以是AND、OR、NOT、XOR这四种,除了NOT操作之外,其他操作可接收多个key。

时间复杂度:O(n)

返回值:保存到destkey的字符串的长度

示例:

签到需求:

之前的应用都是统计总数,但如果业务需要,有时也可能需要获取用户ID,来做下一步操作。

Bitmap使用详解

用到的图片不仅仅包括.png、.gif、.9.png、.jpg和各种Drawable系对象,还包括位图Bitmap

图片的处理也经常是影响着一个程序的高效性和健壮性。

为什么不直接用Bitmap传输?
位图文件虽好,但是非压缩格式,占用较大存储空间。

Bitmap主要方法有:获取图像宽高、释放,判断是否已释放和是否可修改,压缩、创建制定位图等功能

用于从不同的数据源(如文件、输入流、资源文件、字节数组、文件描述符等)解析、创建Bitmap对象

允许我们定义图片以何种方式如何读到内存。

推荐阅读: Android - Bitmap-内存分析

注意事项:

decodeFileDescriptor比decodeFile高效

查看源码可以知道

替换成

建议采用decodeStream代替decodeResource。

因为BitmapFactory.decodeResource 加载的图片可能会经过缩放,该缩放目前是放在 java 层做的,效率比较低,而且需要消耗 java 层的内存。因此,如果大量使用该接口加载图片,容易导致OOM错误,BitmapFactory.decodeStream 不会对所加载的图片进行缩放,相比之下占用内存少,效率更高。

这两个接口各有用处,如果对性能要求较高,则应该使用 decodeStream;如果对性能要求不高,且需要 Android 自带的图片自适应缩放功能,则可以使用 decodeResource。

推荐阅读:[ BitmapFactory.decodeResource加载图片缩小的原因及解决方法

canvas和Matrix可对Bitmap进行旋转、放缩、平移、切错等操作

可以用Bitmap.onCreateBitmap、Canvas的clipRect和clipPath等等方式

推荐阅读: android自定义View学习4--图像剪切与变换

对初始化Bitmap对象过程中可能发生的OutOfMemory异常进行了捕获。如果发生了OutOfMemory异常,应用不会崩溃,而是得到了一个默认的Bitmap图。

如果不进行缓存,尽管看到的是同一张图片文件,但是使用BitmapFactory类的方法来实例化出来的Bitmap,是不同的Bitmap对象。缓存可以避免新建多个Bitmap对象,避免内存的浪费。

如果图片像素过大,使用BitmapFactory类的方法实例化Bitmap的过程中,需要大于8M的内存空间,就必定会发生OutOfMemory异常。
可以将图片缩小,以减少载入图片过程中的内存的使用,避免异常发生。

推荐阅读:
Bitmap详解与Bitmap的内存优化

网站数据信息

"bitmap,什么是bitmap文件"浏览人数已经达到17次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:bitmap,什么是bitmap文件的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!