Android中使用Bitmap实现图像操作的原理

合集下载

AndroidBitmap(位图)详解

AndroidBitmap(位图)详解

AndroidBitmap(位图)详解⼀、背景在Android开发中,任何⼀个APP都离不开图⽚的加载和显⽰问题。

这⾥的图⽚来源分为三种:项⽬图⽚资源⽂件(⼀般为res/drawable⽬录下的图⽚⽂件)、⼿机本地图⽚⽂件、⽹络图⽚资源等。

图⽚的显⽰我们⼀般采⽤ImageView作为载体,通过ImageView的相应API即可设置其显⽰的图⽚内容。

我们知道:如果是需要展⽰项⽬中的图⽚资源⽂件,我们只需要调⽤ImageView的setImageResource(int id)⽅法并传⼊该图⽚资源的id(⼀般为R.drawable.xxx)即可。

但是如果是需要展⽰⼿机本地的某张图⽚或者⽹络上的某个图⽚资源,⼜该怎么办呢?——问题A为了回答问题A,我们先思考⼀个更深的问题B:Android中是如何将某⼀张图⽚的内容加载到内存中继⽽由ImageView显⽰的呢?我们知道:如果我们想通过TextView展⽰⼀个本地txt⽂件的内容,我们只需要由该⽂件创建并包装⼀个输⼊流对象。

通过该输⼊流对象即可得到⼀个代表该⽂件内容的字符串对象,再将该字符串对象交由TextView展⽰即可。

换句话说,这个txt⽂件的内容在内存中的表达形式就是这个字符串对象。

类推⼀下,虽然图⽚⽂件也是⽂件,但是我们显然不可能对图⽚⽂件也采⽤这种⽅式:即通过该图⽚建⽴并包装⼀个输⼊流对象再获取⼀个字符串对象。

毕竟⽆论如何我们都⽆法将某个图⽚的内容表⽰为⼀个字符串对象(细想⼀下就知道了,你能通过⼀段话100%准确地描述⼀张图⽚吗?显然不现实)。

那么,这就引⼊了问题C:既然字符串对象不⾏,那么我们该以哪种对象来在内存中表⽰某个图⽚的内容呢?答案就是:Bitmap对象!⼆、基本概述Bitmap,即位图。

它本质上就是⼀张图⽚的内容在内存中的表达形式。

那么,Bitmap是通过什么⽅式表⽰⼀张图⽚的内容呢?Bitmap原理:从纯数学的⾓度,任何⼀个⾯都由⽆数个点组成。

Android图片编码机制深度解析(Bitmap,Skia,libJpeg)

Android图片编码机制深度解析(Bitmap,Skia,libJpeg)

Android图⽚编码机制深度解析(Bitmap,Skia,libJpeg)问题⼯作中遇到了Android中有关图⽚压缩保存的问题,发现这个问题还挺深,⽽且⽹上资料⽐较有限,因此⾃⼰深⼊研究了⼀下,算是把这个问题⾃顶⾄下全部搞懂了,在此记录。

相关的⼏个问题如下:1.Android系统是如何编码压缩保存图⽚的?2.Skia库起到的作⽤?3.libJpeg库起到的作⽤?4.能不能⾃⼰调⽤Skia或libJpeg?解答⼀谈到Android上的图⽚压缩保存,基本都会想到android.graphics.Bitmap这个类,它提供了⼀个⾮常⽅便(事实上也只有这⼀个)的⽅法:public boolean compress ( format, int quality, stream)这个⽅法可以把当前的bitmap,根据参数提供的压缩格式(JPEG、PNG、WEBP)和压缩质量,将压缩好的数据输出到指定的输出流中。

再跟进到这个函数中,发现如下代码,ok,⼜进⼊了神秘的native层,只能查看android的源码了public boolean compress(CompressFormat format, int quality, OutputStream stream) {checkRecycled("Can't compress a recycled bitmap");// do explicit check before calling the native methodif (stream == null) {throw new NullPointerException();}if (quality < 0 || quality > 100) {throw new IllegalArgumentException("quality must be 0..100");}return nativeCompress(mNativeBitmap, format.nativeInt, quality,stream, new byte[WORKING_COMPRESS_STORAGE]);}在源码中的\frameworks\base\core\jni\android\graphics\Bitmap.cpp我发现了nativeCompress这个⽅法实际对应的C++函数,static bool Bitmap_compress(JNIEnv* env, jobject clazz, SkBitmap* bitmap,int format, int quality,object jstream, jbyteArray jstorage)ok,这时⼤致可以回答第⼆个问题了——Skia库起到的作⽤。

java bitmap原理

java bitmap原理

java bitmap原理Java中的Bitmap是一种用于表示图像的数据结构。

它可以用来存储和操作图像数据,如像素的颜色信息。

Bitmap在Android开发中被广泛使用,它提供了丰富的方法和工具,方便开发人员对图像进行处理和展示。

Bitmap的原理主要是基于像素的存储和操作。

在计算机中,图像是由像素点组成的,每个像素点都有自己的颜色值。

Bitmap通过一个二维数组来表示图像,数组中的每个元素都代表一个像素点,存储了该像素点的颜色信息。

在Java中,Bitmap类提供了一系列方法来操作图像数据。

例如,我们可以使用setPixel()方法来设置某个像素点的颜色值,使用getPixel()方法来获取某个像素点的颜色值。

还可以使用getWidth()和getHeight()方法来获取图像的宽度和高度等信息。

这些方法使得开发人员可以方便地对图像进行处理和操作。

除了基本的操作方法,Bitmap还提供了一些高级功能。

例如,可以使用createBitmap()方法来创建一个新的Bitmap对象,可以使用compress()方法将Bitmap对象保存为图片文件,还可以使用getPixels()方法将整个图像数据读取到一个数组中等等。

这些功能大大扩展了Bitmap的应用范围,使得开发人员能够更加灵活地处理图像数据。

在实际的开发中,Bitmap常常用于图像的显示和处理。

我们可以将Bitmap对象设置到ImageView控件中,从而在界面上显示图像。

同时,我们还可以对Bitmap对象进行各种处理,如缩放、旋转、裁剪等操作,以满足不同的需求。

这些功能使得开发人员可以轻松地实现各种图像效果,提升用户体验。

然而,由于Bitmap对象存储图像数据的特性,它在处理大图像时可能会占用较多的内存空间。

为了避免内存溢出等问题,开发人员需要合理地管理Bitmap对象的生命周期。

通常情况下,我们应该尽量避免创建过多的Bitmap对象,并及时释放不再使用的对象,以减少内存的占用。

android bitmap修改饱和度原理

android bitmap修改饱和度原理

android bitmap修改饱和度原理在Android中修改位图(Bitmap)的饱和度,实际上是通过对位图的每个像素进行处理来改变图像的颜色饱和度。

要理解具体的操作原理,我们需要了解以下几个概念和算法:色彩模型、色彩空间转换,以及调整饱和度的算法。

一、色彩模型和色彩空间转换:1. 色彩模型:色彩模型是指用于描述和表示色彩的方式,常见的有RGB(红绿蓝)、CMYK(青、品红、黄、黑)和HSV(色调、饱和度、明度)等。

在Android中,位图以RGB色彩模型来存储图像的像素信息。

2. 色彩空间转换:色彩空间转换是指将一个色彩模型转换为另一个色彩模型的过程。

在修改位图的饱和度之前,我们需要将RGB色彩模型转换为HSV色彩模型。

HSV色彩模型中的H分量表示色调(0-360度),S分量表示饱和度(0-1),V分量表示明度(0-1)。

二、调整饱和度的算法:1. RGB转HSV算法:RGB转HSV的算法如下:```float r, g, b;float h, s, v;float max = max(r, max(g, b)); float min = min(r, min(g, b));v = max; // 明度float delta = max - min;if (max != 0) {s = delta / max; // 饱和度} else {s = 0;h = -1;return;}if (delta == 0) {h = 0;} else {if (r == max) {h = (g - b) / delta; // 色调} else if (g == max) {h = 2 + (b - r) / delta;} else {h = 4 + (r - g) / delta;}h *= 60;if (h < 0) {h += 360;}}```2. 修改饱和度算法:修改饱和度的算法如下:```float h, s, v; // HSV分量float saturation; // 饱和度增量s += saturation; // 调整饱和度if (s > 1) {s = 1;} else if (s < 0) {s = 0;}```三、位图修改饱和度的原理:根据上述算法,我们可以通过对位图的每个像素进行遍历和修改来改变位图的饱和度。

浅谈Android中Bitmap的使用

浅谈Android中Bitmap的使用

浅谈Android中Bitmap的使用(仅供内部使用)修订记录目录1案例描述 (2)2案例分析 (2)3解决过程 (2)3.1 高效的载入大图片 (2)3.1.1获取图片尺寸和类型 (3)3.1.2载入缩小版本的图片至内存 (3)3.2在UI线程外操作Bitmap (5)3.2.1使用AsyncTask后台获取数据 (6)3.3 使用缓存 (7)3.3.1使用内存缓存 (8)3.3.2 使用磁盘缓存 (11)3.3.3 处理参数改变 (15)3.4 在UI中显示Bitmap (16)3.4.1 向ViewPager中显示图片 (17)4总结 (22)5附录 (23)关键词:Android,Bitmap,缓存, 内存不足,并行摘要:本案例首先介绍了在Android中使用Bitmap经常会碰到的问题。

接着引出了在Android中高效的使用Bitmap的几种方法:抽样图片,并行获取图片和使用缓存。

通过学习本案例,可以使读者对Android中Bitmap的使用有一个更深的认知。

1案例描述在android中使用bitmap,一个不小心,你有可能就会让bitmap消耗掉你应用中的所有可用内存从而导致那个让人纠结的异常:ng.outOfMemory: bitmap size exceeds the VM budget.本案例讲解了在android中使用Bitmap时用到的几种技术。

通过学习案例中介绍的几种方法,不但可以使你尽量的避免上述异常,同时,使你的UI流畅性,用户体验得到很大的提高。

2案例分析在你的应用中,要小心翼翼的使用Bitmap的原因有很多:1.移动设备自身硬件的限制。

在android稳定性文档中(Android Compatibility DefinitelyDocenment)的3.7节中有定义不同屏幕大小和密度下android应用可分配的最少内存。

最少时,一个android应用只能分配到16M的内存。

第三讲 android位图操作

第三讲 android位图操作

第三讲Android位图操作Bitmap是Android系统中的图像处理的最重要类之一。

用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。

对Android用户界面的设计,和对于Android UI开发自绘控件和游戏制作而言掌握好位图基础是必不可少的。

本次主要涉及以下的相关内容。

本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。

一、位图主要操作步骤(一)获取图片(1).通过BitmapDrawable 方式得到BitmapInputStream is = res.openRawResource(R.drawable.picture);BitmapDrawable bmpDraw = new BitmapDrawable(is);Bitmap bmp = bmpDraw.getBitmap();或BitmapDrawable bmpDraw = (BitmapDrawable)res.getDrawable(R.drawable.picture);/* 从资源文件中装载图片 *///getResources()->得到Resources//getDrawable()->得到资源中的Drawable对象,参数为资源索引ID//getBitmap()->得到BitmapmBitQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap();Bitmap bmp = bmpDraw.getBitmap();(2).通过BitmapFactory 得到BitmapBitmap bmp = BitmapFactory.decodeResource(res, R.drawable.picture);BitmapFactory 可以通过资源ID、路径、文件、数据流等方式来获取位图。

android bitmap修改饱和度原理

android bitmap修改饱和度原理

android bitmap修改饱和度原理"Android Bitmap 修改饱和度原理"饱和度是指色彩的纯度或者浓度,它反映了颜色的鲜艳程度。

在Android 开发中,我们经常需要对图像进行处理来改变其饱和度。

本文将详细介绍Android Bitmap如何修改饱和度的原理,并给出一步一步的解释。

在Android平台上,Bitmap 是一种常用的处理图像的对象。

饱和度的修改是通过改变图像的颜色空间来实现的。

Android提供了一个叫做ColorMatrix的类,允许我们使用矩阵变换来调整饱和度。

下面我们将一步一步解释如何使用ColorMatrix类来修改饱和度。

第一步:获取原始图像的Bitmap对象首先,我们需要获取原始图像的Bitmap对象。

可以通过以下代码来实现:Bitmap originalBitmap =BitmapFactory.decodeResource(getResources(),R.drawable.original_image);这里,我们使用了BitmapFactory类的decodeResource()方法来获取资源中的图像,并将其存储在originalBitmap对象中。

你可以根据你的需求使用其他的方法来获取Bitmap对象。

第二步:创建ColorMatrix对象接下来,我们将创建一个ColorMatrix对象。

ColorMatrix类提供了一系列方法用于执行矩阵变换。

我们可以使用其中的方法来修改饱和度。

ColorMatrix colorMatrix = new ColorMatrix();这一行代码创建了一个初始的ColorMatrix对象,并将其存储在colorMatrix变量中。

第三步:设置饱和度值现在,我们可以通过修改ColorMatrix对象的值来调整饱和度。

在ColorMatrix类中,饱和度的值被存储在一个4x5的矩阵变量中。

我们可以通过调用setSaturation()方法来设置饱和度的值。

非常全面的AndroidBitmap知识点梳理

非常全面的AndroidBitmap知识点梳理

非常全面的AndroidBitmap知识点梳理原文出处:/article/android-bitmap-tips.html在日常开发中,可以说和Bitmap低头不见抬头见,基本上每个应用都会直接或间接的用到,而这里面又涉及到大量的相关知识。

所以这里把Bitmap的常用知识做个梳理,限于经验和能力,不做太深入的分析。

1区别decodeResource()和decodeFile()这里的区别不是指方法名和参数的区别,而是对于解码后图片尺寸在处理上的区别:decodeFile()用于读取SD卡上的图,得到的是图片的原始尺寸decodeResource()用于读取Res、Raw等资源,得到的是图片的原始尺寸 * 缩放系数可以看的出来,decodeResource()比decodeFile()多了一个缩放系数,缩放系数的计算依赖于屏幕密度,当然这个参数也是可以调整的:我们分具体情况来看,现在有一张720×720的图片: inScaled属性如果inScaled设置为false,则不进行缩放,解码后图片大小为720×720; 否则请往下看。

如果inScaled设置为true或者不设置,则根据inDensity和inTargetDensity计算缩放系数。

默认情况把这张图片放到drawable目录下, 默认:以720p的红米3为例子,缩放系数 = inTargetDensity(具体320 / inDensity(默认160)= 2 = density,解码后图片大小为1440×1440。

以1080p的MX4为例子,缩放系数 = inTargetDensity(具体480 / inDensity(默认160)= 3 = density, 解码后图片大小为2160×2160。

*dpi文件夹的影响把图片放到drawable或者raw这样不带dpi的文件夹,会按照上面的算法计算。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config 中。缺省值是ARGB_8888。
• inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回 值为null,但是Options的outAbc中解出了图像的基本信息。
• public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height, Matrix m, boolean filter) • public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height) • public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight,boolean filter) • 第一个方法是最终的实现,后两种只是对第一种方法的封装 • 第二个方法可以从源Bitmap中指定区域(x,y, width, height)中挖出一块来实现剪切 • 第三个方法可以把源Bitmap缩放为dstWidth x dstHeight的Bitmap。
使用Bitmap实现图像操作的原理|保存图像文件
8
保存图像文件
• 经过图像变换之后的Bitmap里的数据可以保存到图像压缩文件里(JPG/PNG)。
JNI实例化。 • 这必然是某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就
是BitmapFactory。
使用Bitmap实现图像操作的原理|decode的选项
3
decode时的选项
• 在使用方法decodeFile()/decodeResource()时,都可以指定一个BitmapFacotry.Options。 • 利用Options的下列属性,可以指定decode的选项:
Hale Waihona Puke 使用Bitmap实现图像操作的原理|Bitmap实现图像变换的方法
6
Bitmap实现图像变换的方法
使用Bitmap实现图像操作的原理|Bitmap实现图像变换的方法
7
Bitmap实现图像变换的方法
• 设置Matrix的Rotate(通过setRotate())或者Scale(通过setScale()),传入第一个方法,可实现旋转或缩放。
Android中使用Bitmap实现 图像操作的原理
使用Bitmap实现图像操作的原理|简介
2
简介
• Bitmap是Android系统中的图像处理的最重要类之一。 • 用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。 • Bitmap实现在android.graphics包中,但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过
• inSampleSize 设置decode时的缩放比例。
使用Bitmap实现图像操作的原理|decode的时序图
4
decode时的时序图
使用Bitmap实现图像操作的原理|利用Bitmap和Matrix实现图像变换
5
利用Bitmap和Matrix实现图像变换
• Bitmap可以和Matrix结合实现图像的剪切、旋转、缩放等操作。 • 用源Bitmap通过变换生成新的Bitmap的方法:
相关文档
最新文档