Bitmap详细讲解

Bitmap详解 RGB色彩模式是工业界的一种颜色标准,是通过对红、绿、蓝三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。 阅读详情
  • Bitmap描述:

每一张图片都是有无数点组成,我们取其中足够数量的点(可以形成视觉连贯性,以便形成近似真正图片的视觉效果),这些点就是像素点。比如某张图片大小为:1080*1920 ,它的像素数就为1080*1920个。这些像素点的信息就是这张图片的表述。

每个像素的信息,就是ARGB四个通道的值。其中,A代表透明度,RGB代表红绿蓝三种颜色通道值。每个通道的值范围在0~255之间,即有256个值,刚好可以通过一个字节(8bit)进行表示。所以,每个通道值由一个字节表示,四个字节表示一个像素信息。

  • 在这里需要注意两点:

1)在实际需求中,有的时候,我们并不需要这么丰富的颜色数量,所以可以适当减少表示每个颜色通道的bit位数。这么做的好处是节省空间。也就是说,每个颜色通道都采用8bit来表示是代表全部颜色值的集合;而我们可以采用少于8bit的表示方式,尽管这会缺失一部分颜色值,但是只要颜色够用即可,并且这还可以节省内存空间。

2)如果我们需要某个图片作为背景或者图标,这个图片透明度A通道值是必要的。但是如果我们只是普通的图片展示,比如拍摄的照片,透明度值毫无意义。因此,透明度这个通道值是否有必要表示也是根据需求自由变化的。

  • Bitmap.config:

Config是Bitmap的一个枚举内部类,它表示的就是每个像素点对ARGB通道值的存储方案。取值有以下四种:

ARGB_8888:这种方案就是上面所说的每个通道值采8bit来表示,每个像素点需要4字节的内存空间来存储数据。该方案图片质量是最高的,但是占用的内存也是最大的

ARGB_4444:这种方案每个通道都是4位,每个像素占用2个字节,图片的失真比较严重。一般不用这种方案。

RGB_565:这种方案RGB通道值分别占5、6、5位,但是没有存储A通道值,所以不支持透明度。每个像素点占用2字节,是ARGB_8888方案的一半。

ALPHA_8:这种方案不支持颜色值,只存储透明度A通道值,使用场景特殊,比如设置遮盖效果等。

比较分析:一般我们在ARGB_8888方式和RGB_565方式中进行选取:不需要设置透明度时,比如拍摄的照片等,RGB_565是个节省内存空间的不错的选择;既要设置透明度,对图片质量要求又高,就用ARGB_8888。

  • Bitmap的压缩存储

 Bitmap是图片内容在内存中的表示形式,那么如果想要将Bitmap对象进行持久化存储为一张本地图片,需要对Bitmap对象表示的内容进行压缩存储。根据不同的压缩算法可以得到不同的图片压缩格式(简称为图片格式),比如GIF、JPEG、BMP、PNG和WebP等。而从存储中读取Bitmap对象,则是解压缩过程。

 这样的目的是:当图片持久化保存在磁盘上时,我们应该尽可能以最小的体积来保存同一张图片的内容,这样有利于节省磁盘空间;而当图片加载到内存中以显示的时候,应该将磁盘上压缩存储的图片内容完整地展开。前者即为压缩过程,目的是节省磁盘空间;后者即为解压缩过程,目的是在内存中展示图片的完整内容。

一般压缩可分为:有损压缩和无损压缩: 

1)无损压缩基本原理是:相同的颜色信息只需保存一次。具体过程是:首先会确定图像中哪些区域是相同的,哪些是不同的。包括了重复数据的区域就可以被压缩,只需要记录该区域的起始点即可。
从本质上看,无损压缩的方法通过删除一些重复数据,也能在位图持久化存储的过程中减少要在磁盘上保存的图片大小。但是,如果将该图片重新读取到内存中,重复数据会被还原。因此,无损压缩的方法并不能减少图片的内存占用量,如果要减少图片占用内存的容量,就必须使用有损压缩方法

2)有损压缩的原理是:保持颜色的逐渐变化,删除图像中颜色的突然变化。生物学中的大量实验证明,人类大脑会自发地利用与附近最接近的颜色来填补所丢失的颜色。有损压缩的具体实现方法就是删除图像中景物边缘的某些颜色部分,利用有损压缩技术可以在位图持久化存储的过程中大大地压缩图片的存储大小,但是会影响图像质量,这一点在压缩率很高时尤其明显。所以需要选择恰当的压缩率。

对比分析:有损压缩压缩率高而且可以灵能保活设置压缩率,并且删除的数据不可还原,因此可以减少图片的内存占用,但是对图片质量会有一定程度的影响;无损压缩可以很好地保存图片质量,也证一定的压缩率虽然没有有损压缩那么高,并且无损压缩删除的数据在重新加载至内存时会被还原,因此不可以减少图片的内存占用。

几种压缩格式:

1)JPG/JPEG:JPEG/JPG是一种有损压缩格式,JPEG图片以24位颜色压缩存储单个位图。也就是说,JPEG不支持透明通道。JPEG也不支持多帧动画,但JPEG2000作为JPEG的升级版,其压缩率比JPEG高约30%左右,同时支持有损和无损压缩。

2)PNG:

            PNG格式也属于无损压缩,其位深为32位,也就是说它支持所有的颜色类型。同样是无损压缩,PNG的压缩率高于Gif格式,而且PNG支持的颜色数量也远高于Gif,因此:如果是对静态图片进行无损压缩,优先使用PNG取代Gif,因为PNG压缩率高、色彩好;但是PNG不支持动画效果。所以Gif仍然有用武之地。PNG缺点是:由于是无损压缩,因此PNG文件的体积往往比较大,APP瘦身时需要对PNG文件进行优化。

         3)WBEP:

             WebP 是 Google 在 2010 年发布的图片格式,希望以更高的压缩率替代 JPEG。它用 VP8 视频帧内编码作为其算法基础,取得了不错的压缩效果。WebP支持有损和无损压缩、支持完整的透明通道、也支持多帧动画,并且没有版权问题,是一种非常理想的图片格式。WebP支持动图,基本取代gif。WebP不仅集成了PNG、JPEG和Gif的所有功能,而且相同质量的无损压缩WebP图片体积比PNG小大约26%;如果是有损压缩,相同质量的WebP图片体积比JPEG小25%-34%,

             它的缺点为:编解码时间长,约为JPEG的8倍左右。

  • Bitmap的简单使用

1、Bitmap的加载方法

Bitmap的工厂类BitmapFactory提供了四类静态方法用于加载Bitmap对象:decodeFile、decodeResource、decodeStream、decodeByteArray。

分别代表从本地图片文件、项目资源文件、流对象(可以是网络输入流对象或本地文件输入流对象)、字节序列中加载一个Bitmap对象。

之前讲的图片的三个来源,都可以找到对应的decodeXXXX方法来获取该图片对应的Bitmap对象。

举个例子,假设需要通过网络请求一张图片资源并展示:先处理该网络请求并得到返回结果的输入流对象;依据该流对象调用decodeStream方法得到一个Bitmap对象,该对象即表示这张图片的内容;最后通过ImageView的setImageBitmap()方法显示该图片即可。

2、Bitmap的压缩存储方法

Bitmap的压缩存储与Bitmap的加载是相反的过程,通过compress()方法来实现,该方法原型为:

compress(Bitmap.CompressFormat format, int quality, OutputStream stream)

format参数表示压缩存储的格式,可选为PNG、JPEG和WEBP;quality表示压缩率,取值在0~100之间,100表示未压缩,30表示压缩为原大小的30%,但是该参数在format值为PNG时无效,因为PNG属于无损压缩无法设置压缩率;stream就是希望输出到某个位置的输出流对象,比如某个文件的输出流对象。通过compress()方法可以将Bitmap按照指定的格式和压缩率(非PNG格式时)压缩存储到指定的位置。

       3、BitmapFactory.Options类

        BitmapFactory是Bitmap的工厂类,通过BitmapFactory的静态方法来创建Bitmap对象;BitmapFactory.Options类代表对Bitmap对象的属性设置(配置)

 

属性作用
boolean inJustDecodeBounds是否只获取信息,不加载Bitmap
int inSample采样率 默认1
Bitmap.config inPreferredConfig色彩模式
int outwidthBitmap宽
int outheightBitmao高
boolean inDither防抖动 默认false
int inDensity像素密度
boolean isScaled是否可以缩放 默认true
boolean isMutabledecode方法返回的结果是否可变

    inJustDecodeBounds:这个属性表示是否只扫描,默认false,值为true时,不会返回Bitmap对象,返回NULL,但会获取宽高等信息。

    inSample:默认为1,比如说有一张图片是2048像素X1024像素,那么默认情况下该图片加载到内存中的Bitmap对象尺寸也是2048像素X1024像素。如果采用的是ARGB_8888方式,那么该Bitmap对象加载所消耗的内存为2048X1024X4/1024/1024=8M,如果值为2,则加载结果Bitmap宽高都为1/2,消耗内存为1024X512X4/1024/1024*=2M,如果为4,消耗内存为512X256X4/1024/1024*=0.5M,这极大的节省了内存资源从而避免了OOM错误。

切记:官方对于inSample值的要求是,必须为2的幂,比如2、4、8...等整数值。

   inPreferredConfig:该属性指定Bitmap的色深值,该属性类型为Bitmap.Config值。例如你可以指定某图片加载为Bitmap对象的色深模式为ARGB_8888,即:options.inPreferredConfig=Bitmap.Config.ARGB_8888。

   isMutable:该属性表示通过decodeXXXX方法创建的Bitmap对象其代表的图片内容是否允许被外部修改,比如利用Canvas重新绘制其内容等

  • Bitmap的进阶使用  

1)官方推荐计算合理采样率:

基本步骤就是:①获取位图原尺寸 ②获取ImageView即最终图片显示的尺寸  ③依据两种尺寸计算采样率

public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // 位图的原宽高通过options对象获取
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;
     //当要显示的目标大小和图像的实际大小比较接近时,会产生没必要的采样,先除以2再判断以防止过度采样
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

 

你知道什么是 BitMap 吗? BitMap(位图)是一种数据结构,用于表示一个特定范围内的二进制位(0或1)序列。在计算机科学中,BitMap通常用于高效地表示大量的布尔值,每个位代表一个布尔值,可以表示存在或不存在、true或false等状态。 阅读详情

相关推荐

Redis 基础 -- 位图(bitmap)数据结构和 bitmap的常用命令(SETBIT、GETBIT、BITCOUNT、BITPOS、BITOP、BITFIELD)

Redis的位图(bitmap)是由多个二进制位组成的数组,数组中的每个二进制位都有与之对应的偏移量(也称索引),用户通过这些偏移量可以对位图中指定的一个或多个二进制位进行操作。

天行健 君子以自强不息,地势坤 君子以厚德载物。 6684

Bitmap类用法 详细说明

1.    BitMap类

ymangu的专栏 3万+

Android图片使用之Bitmap详解

转载请注明出处:http://blog.youkuaiyun.com/hlm2016 Android动画之Bitmap 在Android开发中,当你需要在见面中呈现图片时,经常需要用到ImageView来作为载体。虽然我们是要做一个动画,但还是可以用ImageView来承载。因为按照动画的播放,我们只要能让ImageView的占位图片不断发生变化或替换,就能实现形如GIF一...

hlm2016的博客 3246

【数据结构】BitMap

BitMap,即位图,使用每个位表示某种状态,适合处理整型的海量数据。本质上是哈希表的一种应用实现,原理也很简单,给定一个int整型数据,将该int整数映射到对应的位上,并将该位由0改为1。

dilireba666的博客 4543

Bitmap实现亿万级数据计算讲解(通俗易懂)

Bitmap是一种常用的数据结构,在处理亿万级数据计算时具有较高的效率和性能。本论文通过对Bitmap的原理、应用和优化进行详细讨论,结合实例代码进行解析,以帮助读者更好地理解Bitmap的使用方法和优化技巧。通过本论文的研究,我们深入探讨了Bitmap在亿万级数据计算中的应用与优化。实例代码的解析帮助读者更好地理解了Bitmap的使用方法和优化技巧,为实际应用提供了重要参考。题目:Bitmap实现亿万级数据计算的应用与优化。Bitmap在亿万级数据计算中的应用。Bitmap的优化技巧。

weixin_44361445的博客 448

基于ST32 DAC7311数模转换器驱动代码及电路设计完整版

基于ST32的DAC7311模数转换器的电路设计及驱动代码完整版

qq_39626643的博客 3720

Android bitmap讲解与实践

一、概述 bit 二、Bitmap 的创建 三、BitmapFactory 创建 Bitmap 四、使用中的注意 总结:

授人以鱼不如授人以渔 463

VMware ESXi 7.0下Intel网卡SR-IOV配置实战:解决虚拟化网络延迟问题

本文详细介绍了在VMware ESXi 7.0环境下为Intel网卡配置SR-IOV(单根I/O虚拟化)的完整实战流程。通过硬件辅助直通技术,虚拟机可直接访问物理网卡资源,有效绕过虚拟化层瓶颈,从而显著降低网络延迟和CPU开销,适用于金融交易、实时计算等对性能敏感的场景。

embedding5hiker的博客 553

Bitmap 和Drawable讲解

Android 应用中显示的图片不仅包括*.png、*.jpg、*.gif格式的位图,还包括使用xml资源文件定义的各种Drawable对象。 对于Drawable对象只要我们添加了图片资源,Android SDK会自动为其在R清单文件中添加一个Id,用户可以通过该id拿到对应的Drawable对象。Drawable对象的形成还可以是我们自定义的xml文件(例如 shape selector等

qq_2790289459的博客 514

RapidScada在windows下的安装(详细)

1.下载地址:RapidScada官网 2.版本说明 有Linux版本和Windows版本,看自己的需求下载,推荐下载最新稳定版本。 3.系统要求 4.安装前的准备(windows10) 首先打开Windows功能: 先关闭 Microsoft .NET Framework3.5的 Windows Communication Foundation 子组件。如下图: Microsoft .NET Framework配置按下图勾选: iis安装的功能: 5.安装 解压..

m0_51275803的博客 4263

FPGA矩阵键盘计算器Verilog实现与Quartus仿真全流程解析

本文详细解析了基于FPGA和Verilog的矩阵键盘计算器实现全流程,包括矩阵键盘扫描、状态机设计、算术运算逻辑及数码管显示驱动。通过Quartus仿真与Testbench测试,确保设计稳定性与准确性,适合数字逻辑设计初学者学习FPGA开发与硬件描述语言应用。

chair的专栏 742

android Bitmap 知识讲解

Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。 一、Bitmap的生成 1.1 BitmapFactory decode出Bitmap Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,

290

Kerberos基础及KDC服务(理论知识)

kerberos基础理论讲解+KDC服务

Siobhan_Mxin的博客 9713

详细讲解把一张bitmap图片写到sd卡!

我们的安卓现在有很多网络框架,可以手动配置缓存到sd卡和路径,不过我们要是手动的写入sd卡应该怎么做?自己无聊做了一个小demo,从网络读取图片,再把图片保存到sd卡。 思路:首先添加权限:网络权限和sd卡写的权限: android:name="android.permission.INTERNET"/> android:name="android.permission.WRITE_EXT

YouAreTheOnlyOneCJ的博客 601

新手友好!C#上位机调用YOLO实现设备异常检测(详细步骤,附踩坑指南)

C#上位机调用YOLO实现设备异常检测,核心是把“工控交互”和“AI检测”的优势结合起来,新手不用追求一步到位,先跑通基础流程,再逐步优化性能和功能。我当初也是从踩坑中过来的,只要把核心链路和细节摸透,其实门槛并没有想象中高。如果你们在实操中遇到了具体问题(比如相机取流卡顿、模型推理报错),可以在评论区留言,后续我也可以针对性拆解具体模块的完整代码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 668

ChatGPT辅助课题申报书研究背景部分的写作全过程指南

ChatGPT辅助课题申报书研究背景部分的写作全过程指南

智能AI让学术科研更容易 2554

bitmap与bloomfilter(比较清晰的讲解)

转载地址:http://blog.youkuaiyun.com/gugemichael/article/details/8013150 今天,有个同学向我咨询大数据的一些面试题,其中一类比较有代表性比如判断是否在集合内,比如10个url,判断一个url是否在集合内,还比如有个1~100万个连续无序数字,随机取出里面的N个,求这N个数字等等。这类问题都需要一个大的数据集合,而且每个数据单元都很小,比如一个

ivysister的专栏 4340

R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

data+scenario+science+insight 3926

Bitmap的有关讲解与优化

Bitmap的有关讲解与优化: ###1、有效处理较大的位图 图像有各种不同的形状和大小,在许多情况下,他们往往比一个典型的应用程序的用户界面UI所需要的资源更大 读取一个位图的尺寸和类型: 为了从多种资源来创建一个位图,BitmapFactory类提供了几个解码的方法(decodeByteArray()),decodeFile() ,decodeResource()等等 根据你的图像数据资源...

weixin_33863087的博客 89

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android资源目录bitmap,android之bitmap的使用

Bitmap在Android中是用来处理图片重要的类之一。它可以获取到图片的信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件,以下详细讲解Bitmap的使用情况一、Bitmap的生成1.1 BitmapFactory decode出BitmapBitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必...

weixin_35726635的博客 455

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android 图片 bitmap,Android Bitmap史上最详细全解|原力计划

作者 | IF责编 | 王晓曼出品 | 优快云博客Bitmap的相关使用关于 Bitmap ,之前以为它和 Drawable 差不多,就是一种图片,直到泪水打湿了我胸前的红领巾,我决定整理一波关于 Bitmap 的姿势!Bitmap相关的使用主要有两种:1.给 ImageView 设置背景;2.当做画布来使用 。分别对应下面两个方法:imageView.setImageBitmap(Bitma...

weixin_34466348的博客 973

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

超级详细的Bitmap位图详解总结自留

Bitmap(位图)的一些使用,而在开始本节的内容之前我们 先来区分几个名词的概念: Drawable:通用的图形对象,用于装载常用格式的图像,既可以是PNG,JPG这样的图像, 13种Drawable类型的可视化对象!我们可以理解成一个用来放画的——画框 Bitmap(位图):我们可以把他看作一个画架,我们先把画放到上面,然后我们可以 进行一些处理,比如获取图像文件信息,做旋转切割,放大缩小...

Rose_gz的博客 2095

android bitmap对象,android 创建bitmap的多种方式

–Bitmap代表这一张位图,BitmapDrawable里封装的图片就是一个Bitmap对象。如果要将Bitmap对象封装成BitmapDrawable对象只需要用构造方法即可。//讲bitmap对象包装成BitmapDrawable对象BitmapDrawable drawable = new BitmapDrawable(bitmap);//将BitmapDrawable对象转换为bitma...

weixin_42392438的博客 3159

Android JNI 之 Bitmap 操作

公众号回复:OpenGL,领取学习资源大礼包在 Android 中通过 JNI 去操作 Bitmap。在 Android 通过 JNI 去调用 Bitmap,通过 CMake 去编 so...

音视频开发进阶 986

Android中图片处理之Bitmap

Bitmap代表一个位图 ,从资源文件里读取的图片转换为bitmap 会根据targetDensity 和 density的值进行缩放 图片的占用内存 = 缩放后图片的长度(像素单位) * 缩放后图片的宽度(像素单位) * 单位像素所占字节数(例如ARGB_8888,这个模式下,一个像素点占用4Byte) bitmap进行质量压缩不改变 bitmap占用内存的大小 1...

liu835704070的博客 1210

android bitmap new,Android Bitmap史上最详细全解

作者 | ༺ IF ༻责编 | 王晓曼出品 | 优快云博客Bitmap的相关使用关于 Bitmap ,之前以为它和 Drawable 差不多,就是一种图片,直到泪水打湿了我胸前的红领巾,我决定整理一波关于 Bitmap 的姿势!Bitmap相关的使用主要有两种:1.给 ImageView 设置背景;2.当做画布来使用 。分别对应下面两个方法:imageView.setImageBitmap(Bi...

weixin_29212867的博客 582
上一篇: Glide笔记(一)AppGlideModule
下一篇: Android中的Webview一些知识点
java_for
博客等级 码龄12年 6粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值