android Bitmap用法总结
Android的Bitmap的修改方法
Android的 Bitmap的修改方法
Android的Bitmap和J2ME的Image比较类似。 如果我想从resource里读入一个图片,然后在这个图片上draw一点自己的信息,比如文字。 再画到屏幕上怎么做呢? J2ME里只要Image.getGraphic() 拿到 Graphic的对象就可以想draw什么就draw什么了。 那么Android里怎么实现呢? Java 代码 复制代码 代码如下:
以上代码后பைடு நூலகம்可以用canvas的draw函数在Bitmap上作修改了。 之后只要在onDraw里,用onDraw的参数canvas来drawBitmap就可以了。
Bitmap img = Bitmap.createBitmap(width, height, Config.ARGB_8888); Canvas canvas = new Canvas(); canvas.setBitmap(img); Bitmap img = Bitmap.createBitmap(width, height, Config.ARGB_8888); Canvas canvas = new Canvas(); canvas.setBitmap(img);
Android中Glide获取图片Path、Bitmap用法详解
Android中Glide获取图⽚Path、Bitmap⽤法详解在此之前给⼤家介绍过,⼤家可以先参考⼀下,本篇内容更加深⼊的分析了Glide获取图⽚Path、Bitmap⽤法,以及实现的代码分析。
1. 获取Bitmap:1)在图⽚下载缓存好之后获取Glide.with(mContext).load(url).asBitmap().into(new SimpleTarget<Bitmap>() {@Overridepublic void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {image.setImageBitmap(resource);}}); //⽅法中设置<span style="font-family: Arial, Helvetica, sans-serif;">asBitmap可以设置回调类型</span>上⾯是简单⽅法,下⾯有全⾯的⽅法,可以完美控制:Glide.with(mContext).load(url).asBitmap().into(new Target<Bitmap>() {@Overridepublic void onLoadStarted(Drawable placeholder) {}@Overridepublic void onLoadFailed(Exception e, Drawable errorDrawable) {}@Overridepublic void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {//TODO set bitmap}@Overridepublic void onLoadCleared(Drawable placeholder) {}@Overridepublic void getSize(SizeReadyCallback cb) {}@Overridepublic void setRequest(Request request) {}@Overridepublic Request getRequest() {return null;}@Overridepublic void onStart() {}@Overridepublic void onStop() {}@Overridepublic void onDestroy() {}});2)通过url获取Bitmap myBitmap = Glide.with(applicationContext).load(yourUrl).asBitmap() //必须.centerCrop().into(500, 500).get()2. 获取图⽚缓存路径FutureTarget<File> future = Glide.with(mContext).load("url").downloadOnly(500, 500);try {File cacheFile = future.get();String path = cacheFile.getAbsolutePath();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}注意:这段代码需要在线程中执⾏,否则会保存,⽬前我还没整理出统⼀的⽅法回调,回头再研究研究。
android通过BitmapFactory.decodeFile获取图片bitmap报内。。。
android通过BitmapFactory.decodeFile获取图⽚bitmap报内。
android通过BitmapFactory.decodeFile获取图⽚bitmap报内存溢出的解决办法 原⽅法:public static Bitmap getSmallBitmap(String filePath, int reqWidth, int reqHeight) {final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(filePath, options);// Calculate inSampleSizeoptions.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);// Decode bitmap with inSampleSize setoptions.inJustDecodeBounds = false;return BitmapFactory.decodeFile(filePath, options);} 异常:06-23 11:41:04.817 24959-24959/com.test.tax E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.test.tax, PID: 24959ng.OutOfMemoryErrorat android.graphics.BitmapFactory.nativeDecodeStream(Native Method)at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:623)at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:599)at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:378)at com.test.tax.utils.PictureUtils.getSmallBitmap(PictureUtils.java:138)at com.test.tax.utils.PictureUtils.bitmapToFile(PictureUtils.java:58)at com.test.tax.utils.localalbum.ui.LocalAlbum.onActivityResult(LocalAlbum.java:141)at android.app.Activity.dispatchActivityResult(Activity.java:5441)at android.app.ActivityThread.deliverResults(ActivityThread.java:3353)at android.app.ActivityThread.handleSendResult(ActivityThread.java:3400)at android.app.ActivityThread.access$1300(ActivityThread.java:141)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1250)at android.os.Handler.dispatchMessage(Handler.java:102)at android.os.Looper.loop(Looper.java:136)at android.app.ActivityThread.main(ActivityThread.java:5047)at ng.reflect.Method.invokeNative(Native Method)at ng.reflect.Method.invoke(Method.java:515)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)at dalvik.system.NativeStart.main(Native Method) 解决办法: 通过设置BitmapFactory.Options属性解决options.inPreferredConfig = Bitmap.Config.RGB_565;options.inDither = true; 解决后的⽅法:public static Bitmap getSmallBitmap(String filePath, int reqWidth, int reqHeight) {final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(filePath, options);// Calculate inSampleSizeoptions.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);// Decode bitmap with inSampleSize setoptions.inJustDecodeBounds = false;//避免出现内存溢出的情况,进⾏相应的属性设置。
bitmap的常用方法
bitmap的常用方法Bitmap是一种常用的图像文件格式,被广泛应用于计算机图形处理和图像表示方面。
本文将介绍Bitmap的常用方法,包括创建Bitmap、读取Bitmap、修改Bitmap、保存Bitmap以及一些Bitmap操作的技巧和注意事项。
一、创建Bitmap在开始使用Bitmap之前,我们需要了解如何创建一个Bitmap对象。
创建Bitmap对象有以下几种常见的方法:1. 通过文件路径创建Bitmap:使用指定的文件路径可以创建一个Bitmap对象,例如:Bitmap bitmap = BitmapFactory.decodeFile("path/to/file.jpg");这里的文件路径可以是本地文件路径或者网络文件路径。
2. 通过资源ID创建Bitmap:使用资源ID可以创建一个Bitmap对象,例如:Bitmap bitmap =BitmapFactory.decodeResource(context.getResources(), R.drawable.image);这里的资源ID可以是应用程序中的图片资源ID。
3. 通过字节数组创建Bitmap:使用字节数组可以创建一个Bitmap对象,例如:Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);这里的字节数组可以是图片的二进制数据。
二、读取Bitmap创建了Bitmap对象之后,我们可以通过一些方法读取Bitmap的信息:1. 获取Bitmap的宽度和高度:int width = bitmap.getWidth();int height = bitmap.getHeight();这样我们可以得到Bitmap的尺寸信息。
2. 获取Bitmap的像素颜色:int color = bitmap.getPixel(x, y);这里的x和y是坐标值,表示要获取像素颜色的位置。
bitmap释放流程
bitmap释放流程Bitmap释放流程介绍Bitmap是Android开发中经常用到的一种图片格式,但是如果不正确地释放Bitmap,会导致内存泄漏和OOM(Out of Memory)问题。
本文将详细说明Bitmap的释放流程,以帮助开发者正确处理Bitmap对象。
Bitmap内存管理1.Bitmap对象占用的内存是非常重要的资源,需谨慎管理。
2.Android提供了一种垃圾回收机制,但它对Bitmap的回收并不是即时的。
Bitmap释放流程1. 创建Bitmap•使用BitmapFactory类的decodeResource()或decodeStream()方法,根据资源文件或文件流创建Bitmap对象。
2. 使用Bitmap•在使用Bitmap对象之前,首先要确保它不为空。
3. 回收Bitmap•当Bitmap不再使用时,需要手动回收,避免造成内存泄漏。
•调用Bitmap类的recycle()方法释放Bitmap占用的内存。
•释放后的Bitmap对象将变为无效状态,不能再被使用。
4. 内存释放策略•在Activity或Fragment的生命周期方法中释放Bitmap,例如onDestroy()或onDetach()方法。
•在列表或滑动控件的回收方法中释放Bitmap,例如onViewRecycled()方法。
5. 避免Bitmap内存泄漏•不要将Bitmap对象存储在静态成员变量中。
•不要在循环中创建大量的Bitmap对象而不释放。
6. 控制Bitmap大小•根据需求,可以通过调用BitmapFactory类的Options参数的inSampleSize字段,控制Bitmap的大小。
•通过减小Bitmap的尺寸,可以减少占用的内存空间。
7. 检测内存泄漏•使用内存分析工具,例如Android Studio的内存监视器,检测内存泄漏情况。
•检查是否有未释放的Bitmap对象。
总结正确地释放Bitmap对象对于Android开发非常重要,可以有效地避免内存泄漏和OOM问题。
android中取得bitmap对象缩略图的方法
Android中取得Bitmap对象缩略图的方法| 方法2
4
方法2:不浪费内存的方法
Bitmap.createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter),该方 法可以将一个Bitmap生成指定大小的BItmap,该方法可以放大图片也可以缩小图片。
Android中取得Bitmap对象缩略图的方法| 方法1
方法1:来自开发文档
• BitmapFactory#decodeFile (String pathName, BitmapFactory.Options opts) • opts可以指定inJustDecodeBounds和inSampleSize两个参数。 • 当指定inJustDecodeBounds时候,只解析图片的长度和宽度,不载入图片。 • 当指定inSampleSize的时候,会根据inSampleSize载入一个缩略图。 • 比如inSampleSize=4,载入的缩略图是原图大小的1/4。
缩略图加载过程: • 1. 使用inJustDecodeBounds,读bitmap的长和宽。 • 2. 根据bitmap的长款和目标缩略图的长和宽,计算出inSampleSize的大小。 • 3. 使用inSampleSize,载入一个大一点的缩略图A • 4. 使用createScaseBitmap,将缩略图A,生成我们需要的缩略图B。 • 5. 回收缩略图A。
Android中取得Bitmap对象 缩略图的方法
北京信息职业技术学院 | 范美英
Android中取得Bitmap对象缩略图的方法|一个问题
2
如何获取缩略图?
• 在Android应用开发过程中,有时候不需要展示原图,只需展示 图片的缩略图,可以节省内存。
Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类
Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类[java] n package com.soai.imdemo; n nn import java.io.ByteArrayInputStream; n importjava.io.ByteArrayOutputStream; n import java.io.InputStream; n nn import android.graphics.Bitmap; n import android.graphics.BitmapFactory; n import android.graphics.Canvas; n importandroid.graphics.PixelFormat; n import android.graphics.drawable.BitmapDrawable; n import android.graphics.drawable.Drawable; n nn /**n n* Bitmap与DrawAble与byte[]与InputStream之间的转换工具类n n* @author Administratorn n*n n*/ n public class FormatTools { n n n private static FormatTools tools = new FormatTools(); n nn n n public static FormatTools getInstance() { n n n n n if (tools == null) { n n n n n n n tools = new FormatTools(); n n n n n n n return tools; n n n n n } n n n n n return tools; n n n } n nn n n // 将byte[]转换成InputStream n n n public InputStream Byte2InputStream(byte[] b) { n n n n n ByteArrayInputStream bais = new ByteArrayInputStream(b); n n n n n return bais; n n n } n nn n n // 将InputStream转换成byte[] n n n public byte[] InputStream2Bytes(InputStream is) { n n n n n String str = ""; n n n n n byte[] readByte = new byte[1024]; n n n n n int readCount = -1; n n n n n try { n n n n n n n while ((readCount = is.read(readByte, 0, 1024)) != -1) { n n n n n n n n n str += new String (readByte).trim(); n n n n n n n } n n n n n n n return str.getBytes(); n n n n n } catch (Exception e) { n n n n n n n e.printStackTrace(); n n n n n } n n n n n return null; n n n } n nn n n // 将Bitmap转换成InputStream n n n public InputStream Bitmap2InputStream(Bitmap bm) { n n n n n ByteArrayOutputStream baos = new ByteArrayOutputStream(); n n n n n press(pressFormat.JPEG, 100, baos); n n n n n InputStream is = new ByteArrayInputStream (baos.toByteArray()); n n n n n return is; n n n } n nn n n // 将Bitmap转换成InputStream n n n public InputStream Bitmap2InputStream(Bitmap bm, int quality) { n n n n n ByteArrayOutputStream baos = new ByteArrayOutputStream(); n n n n n press(pressFormat.PNG, quality, baos); n n n n n InputStream is = new ByteArrayInputStream(baos.toByteArray()); n n n n n return is; n n n } n nn n n // 将InputStream转换成Bitmap n n n public Bitmap InputStream2Bitmap (InputStream is) { n n n n n return BitmapFactory.decodeStream(is); n n n } n nn n n // Drawable 转换成InputStream n n n public InputStream Drawable2InputStream(Drawable d) { n n n n n Bitmap bitmap = this.drawable2Bitmap(d); n n n n n return this.Bitmap2InputStream(bitmap); n n n } n nn n n // InputStream转换成Drawable n n n public Drawable InputStream2Drawable(InputStream is) { n n n n n Bitmap bitmap = this.InputStream2Bitmap(is); n n n n n return this.bitmap2Drawable(bitmap); n n n } n nn n n // Drawable转换成byte[] n n n public byte[] Drawable2Bytes(Drawable d) { n n n n n Bitmap bitmap = this.drawable2Bitmap(d); n n n n n return this.Bitmap2Bytes(bitmap); n n n } n nn n n // byte[]转换成Drawable n n n public Drawable Bytes2Drawable(byte[] b) { n n n n n Bitmap bitmap = this.Bytes2Bitmap(b); n n n n n return this.bitmap2Drawable(bitmap); n n n } n nn n n // Bitmap转换成byte[] n n n public byte[] Bitmap2Bytes(Bitmap bm) { n n n n n ByteArrayOutputStream baos = new ByteArrayOutputStream(); n n n n n press(pressFormat.PNG, 100, baos); n n n n n return baos.toByteArray(); n n n } n nn n n // byte[]转换成Bitmap n n n public Bitmap Bytes2Bitmap(byte[] b) { n n n n n if (b.length != 0) { n n n n n n n returnBitmapFactory.decodeByteArray(b, 0, b.length); n n n n n } n n n n n return null; n n n } n nn n n // Drawable转换成Bitmap n n n public Bitmap drawable2Bitmap(Drawable drawable) { n n n n n Bitmap bitmap = Bitmap n n n n n n n n n .createBitmap( n n n n n n n n n n n n ndrawable.getIntrinsicWidth(), n n n n n n n n n n n n n drawable.getIntrinsicHeight(), n n n n n n n n n n n n n drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 n n n n n n n n n n n n n n n n n : Bitmap.Config.RGB_565); n n n n n Canvas canvas = new Canvas(bitmap); n n n n n drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), n n n n n n n n ndrawable.getIntrinsicHeight()); n n n n n drawable.draw(canvas); n n n n n return bitmap; n n n } n nn n n // Bitmap转换成Drawable n n n public Drawable bitmap2Drawable(Bitmap bitmap) { n n n n n BitmapDrawable bd = new BitmapDrawable(bitmap); n n n n n Drawable d = (Drawable) bd; n n n n n return d; n n n } n } n n。
androidBitmapFactory.Options使用方法详解
androidBitmapFactory.Options使⽤⽅法详解BitmapFactory.Options的使⽤是在加载图⽚时,就从图⽚的加载和使⽤说起怎样获取图⽚的⼤⼩?⾸先我们把这个图⽚转成Bitmap,然后再利⽤Bitmap的getWidth()和getHeight()⽅法就可以取到图⽚的宽⾼了。
新问题⼜来了,在通过BitmapFactory.decodeFile(String path)⽅法将突破转成Bitmap时,遇到⼤⼀些的图⽚,我们经常会遇到OOM(Out Of Memory)的问题。
怎么避免它呢?这就⽤到了我们上⾯提到的BitmapFactory.Options这个类。
BitmapFactory.Options这个类,有⼀个字段叫做 inJustDecodeBounds 。
SDK中对这个成员的说明是这样的:If set to true, the decoder will return null (no bitmap), but the out…也就是说,如果我们把它设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回⼀个Bitmap给你,它仅仅会把它的宽,⾼取回来给你,这样就不会占⽤太多的内存,也就不会那么频繁的发⽣OOM了。
⽰例代码如下:BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;Bitmap bmp = BitmapFactory.decodeFile(path, options);/* 这⾥返回的bmp是null */这段代码之后,options.outWidth 和 options.outHeight就是我们想要的宽和⾼了。
有了宽,⾼的信息,我们怎样在图⽚不变形的情况下获取到图⽚指定⼤⼩的缩略图呢?⽐如我们需要在图⽚不变形的前提下得到宽度为200的缩略图。
Android中Bitmap、File与Uri之间的简单记录
Android中Bitmap、File与Uri之间的简单记录简介:感觉Uri 、File、bitmap ⽐较混乱,这⾥进⾏记载,⽅便以后查看.下⾯话不多说了,来⼀起看看详细的介绍吧Bitmap、File与Uri1、将⼀个⽂件路径path转换成FileString path ;File file = new File(path)2、讲⼀个Uri转换成⼀个path以选择⼀张图⽚为例:String path = FileTools.getRealPathFromUri(content,uri);//⾃定义⽅法在下⾯public static String getRealPathFromUri(Context context, Uri uri) {if (null == uri) return null; //传⼊的Uri为空,结束⽅法final String scheme = uri.getScheme(); //得到Uri的schemeString realPath = null;if (scheme == null)realPath = uri.getPath(); //如果scheme为空else if (ContentResolver.SCHEME_FILE.equals(scheme)) {realPath = uri.getPath(); //如果得到的scheme以file开头} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {//得到的scheme以content开头Cursor cursor = context.getContentResolver().query(uri,new String[]{MediaStore.Images.ImageColumns.DATA},null, null, null);if (null != cursor) {if (cursor.moveToFirst()) {int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);if (index > -1) {realPath = cursor.getString(index);}}cursor.close(); //必须关闭}}//经过上⾯转换得到真实路径之后,判断⼀下这个路径,如果还是为空的话,说明有可能⽂件存在于外置sd卡上,不是内置sd卡.if (TextUtils.isEmpty(realPath)) {if (uri != null) {String uriString = uri.toString();int index = stIndexOf("/"); //匹配 / 在⼀个路径中最后出现位置String imageName = uriString.substring(index);//通过得到的最后⼀个位置,然后截取这个位置后⾯的字符串, 这样就可以得到⽂件名字了File storageDir;storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); //查看外部储存卡公共照⽚的⽂件File file = new File(storageDir, imageName);//⾃⼰创建成⽂件,if (file.exists()) {realPath = file.getAbsolutePath();} else {// //那么存储在了外置sd卡的应⽤缓存file中storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);File file1 = new File(storageDir, imageName);realPath = file1.getAbsolutePath();}}}return realPath;⽐如我在android 8.0 上运⾏的时候选择照⽚之后的Uri : content://media/external/images/media/568344进⾏上⾯⽅法转换完之后: /storage/emulated/0/com.appben.appche/browser-photos/1550297407488.jpg}3、File 转换成pathString path = file.getPath();将此抽象路径名转换为⼀个路径名字符串。
Androidbitmap高效显示和优化
Androidbitmap⾼效显⽰和优化第⼀部分:Bitmap⾼效显⽰应⽤场景:有时候我们想在界⾯上显⽰⼀个⽹络图⽚或者显⽰⼀张本地的图⽚,但是图⽚本⾝是很⼤的有⼏兆,但是显⽰的位置很⼩或者说我们可以⽤更⼩的图⽚来满⾜这样的需求,如果把整个图⽚都显⽰出来会⾮常的耗内存,甚⾄可以导致内存溢出,这就需要我们来处理,如何⾼效的显⽰图⽚,减少内存消耗。
1 BitmapFactory.Options options = new BitmapFactory.Options();23 options.inJustDecodeBounds = true;45 BitmapFactory.decodeResource(getResources(), R.id.myimage, options);67int imageHeight = options.outHeight;8int imageWidth = options.outWidth;910 String imageType = options.outMimeType;设置 inJustDecodeBounds 属性为true可以在decoding的时候避免内存的分配,它会返回⼀个null的bitmap,但是 outWidth, outHeight 与 outMimeType 还是可以获取。
这个技术可以允许你在构造bitmap之前优先读图⽚的尺⼨与类型。
将本地⼀张⼤图⽚显⽰到页⾯,为了节省内存对图⽚进⾏压缩下⾯的代码是计算压缩的⽐例:1public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {2// Raw height and width of image3final int height = options.outHeight;4final int width = options.outWidth;5int inSampleSize = 1;67if (height > reqHeight || width > reqWidth) {89final int halfHeight = height / 2;10final int halfWidth = width / 2;1112// Calculate the largest inSampleSize value that is a power of 2 and keeps both13// height and width larger than the requested height and width.14while ((halfHeight / inSampleSize) > reqHeight&& (halfWidth / inSampleSize) > reqWidth) {15 inSampleSize *= 2;16 }17 }1819return inSampleSize;20 }设置inSampleSize为2的幂是因为decoder最终还是会对⾮2的幂的数进⾏向下处理,获取到最靠近2的幂的数。
Android中使用Bitmap实现图像操作的原理
• 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。
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()方法来设置饱和度的值。
android pdfrenderer用法
在Android中使用PdfRenderer时,你需要遵循以下步骤:1. 获取页码数据Page对象。
你可以通过调用`pdfRenderer.open(index)`方法来获取特定页码的Page对象。
2. 创建一个Bitmap对象。
为了将PDF页面渲染到Bitmap上,你需要创建一个Bitmap对象,并指定其宽度和高度。
你可以使用`Bitmap.createBitmap(bitmapRealWidth, mRealHeight, Bitmap.config.ARGB_8888)`来创建一个Bitmap对象,其中ARGB_8888是Bitmap的配置方式,它表示每个像素使用32位来表示颜色,包括Alpha(透明度)、Red、Green、Blue四个分量,每个分量占8位。
3. 调度api方法渲染page。
这一步中,你需要使用Page对象的方法来渲染页面。
由于执行Page对象的方法执行线程是不安全的,会抛出异常,所以在使用Page对象调度方法时需保证线程安全。
4. 关闭PdfRenderer。
在完成渲染后,记得关闭PdfRenderer以释放资源。
下面是一个简单的代码示例,展示了如何在Android中使用PdfRenderer:```javaPdfRenderer renderer = newPdfRenderer(getAssets().open("example.pdf"));int pageNum = 0; // 渲染第一页final PdfRenderer.Page page = renderer.openPage(pageNum);// 创建一个与屏幕等宽的BitmapBitmap bitmap = Bitmap.createBitmap(screenWidth,page.getHeight(), Bitmap.Config.ARGB_8888);// 将Page渲染到Bitmap上Canvas canvas = new Canvas(bitmap);page.render(canvas, null, null,PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);// 关闭Page和PdfRendererpage.close();renderer.close();// 在ImageView中显示BitmapimageView.setImageBitmap(bitmap);```注意,在处理大文件时,`PdfRenderer`可能抛出`OutOfMemoryError`异常。
Android-实现背景平铺的几种常用方法
view.setBackgroundDrawable(drawable);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
=================================================
tileMode 属性就是用于定义背景的显示模式:
disabled
默认值,表示不使用平铺
clamp
复制边缘色彩
repeat
X、Y 轴进行重复图片显示,也就是我们说要说的平铺
android:tileMode="repeat" />
3)第三种自己画出来
< span style="white-space: normal;">< span style="white-space: pre;">public static Bitmap createRepeater(int width, Bitmap src){< /span>< /span>
mirror
在水平和垂直方向上使用交替镜像的方式重复图片的绘制
===============================================
图片平铺的三种方式:
1)第一种利用系统提供的api实现
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
Android 图片加载性能优化总结
Android 图片加载性能优化总结一、Android Bitmap加载大尺寸图片优化:压缩原因:1.imageview大小如果是200*300那么加载个2000*3000的图片到内存中显然是浪费可耻滴行为;2.最重要的是图片过大时直接加载原图会造成OOM异常(out of memory内存溢出)所以一般对于大图我们需要进行下压缩处理看不懂英文的话木有关系,本篇会有介绍主要处理思路是:1.获取图片的像素宽高(不加载图片至内存中,所以不会占用资源)2.计算需要压缩的比例3.按将图片用计算出的比例压缩,并加载至内存中使用官网大图片加载教程(上面网址里的)对应代码就是:/*** 获取压缩后的图片* @param res* @param resId* @param reqWidth 所需图片压缩尺寸最小宽度* @param reqHeight 所需图片压缩尺寸最小高度* @return*/public static Bitmap decodeSampledBitmapFromResource(Resourcesres, int resId, int reqWidth, int reqHeight) {// 首先不加载图片,仅获取图片尺寸final BitmapFactory.Options options= new BitmapFactory.Options();// 当inJustDecodeBounds设为true时,不会加载图片仅获取图片尺寸信息options.inJustDecodeBounds = true;// 此时仅会将图片信息会保存至options对象内,decode方法不会返回bitmap 对象BitmapFactory.decodeResource(res, resId, options);// 计算压缩比例,如inSampleSize=4时,图片会压缩成原图的1/4options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);// 当inJustDecodeBounds设为false时,BitmapFactory.decode...就会返回图片对象了options.inJustDecodeBounds = false;// 利用计算的比例值获取压缩后的图片对象return BitmapFactory.decodeResource(res, resId, options);}代码详解:核心方法是BitmapFactory.decode...(...., options)...的意思是此外还有一系列的decodeFile/decodeStream等等方法,都是利用options灵活解析获取图片,只不过解析图片的来源不同罢了,比如网络图片获取,一般就是解析字节流信息然后decode获取图片实例Options是图片配置信息,参数详细介绍下:inJustDecodeBounds 是否只解析边界设为true时去decode获取图片,只会加载像素宽高信息设为false时decode则会完全加载图片inSampleSize 压缩比例比如原图200*300,如果值是2时会压缩成100*150; 是4则图片压缩成50*75最好是2的幂数,比如2 4 8 16 .....outHeight 图片原高度outWidth 图片原宽度其他参数自行研究,这里暂时只用到这几个decodeSampledBitmapFromResource方法内的三段代码对应上面的三步流程难点在于中间那步,压缩比例的计算,官网同样提供了个calculateInSampleSize方法其中reqWidth和reqHeight是所需图片限定最小宽高值/*** 计算压缩比例值* @param options 解析图片的配置信息* @param reqWidth 所需图片压缩尺寸最小宽度* @param reqHeight 所需图片压缩尺寸最小高度* @return*/public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {// 保存图片原宽高值final int height = options.outHeight;final int width = options.outWidth;// 初始化压缩比例为1int inSampleSize = 1;// 当图片宽高值任何一个大于所需压缩图片宽高值时,进入循环计算系统if (height > reqHeight || width > reqWidth) {final int halfHeight = height / 2;final int halfWidth = width / 2;// 压缩比例值每次循环两倍增加,// 直到原图宽高值的一半除以压缩值后都~大于所需宽高值为止while ((halfHeight / inSampleSize) >= reqHeight&& (halfWidth / inSampleSize) >= reqWidth) {inSampleSize *= 2;}}return inSampleSize;}利用此方法获取到所需压缩比例值,最终获取到压缩后的图片~以上代码能够看懂的话,下面这段/*扯淡*/可以跳过逻辑是将原图宽高一半一半的缩减,一直减到宽高都小于自己设定的限定宽高时为止,测试的时候问题来了原图400*300,我限定值200*150,if满足进入,while循环第一次,400/2/1=200不满足>的条件~结束循环,最终返回了个inSampleSize=1给我马丹我限定值正好是原图的一半啊,你应该返回给我2啊~你特么最后返回个1给我,那压缩处理后的图还是400*300!!!当我将限定值稍微改一下变成195*145稍微降低一点点时~if满足进入,while循环第一次,400/2/1>195满足~然后压缩比例1*2变成了2,在下一次while循环时不满足条件结束,最后返回比例值2~ 满足压缩预期官网的这个方法是: 将图片一半一半的压缩,直到压缩成成大于所需宽高数的那个最低值大于~不是大于等于,所以就会出现我上面那种情况,我觉得方法不是太好= = 能满足压缩的需求,但是压缩的比例不够准确~所以最好改成大于等于,如下(个人意见,仅供参考,在实际压缩中很少遇到恰巧等于的这个情况,所以>和>=差别也不大额~看我这扯扯淡就当对计算比例的逻辑加深个理解吧)while ((halfHeight / inSampleSize) >= reqHeight&& (halfWidth / inSampleSize) >= reqWidth) {inSampleSize *= 2;}优化:还是上面例子,如果限定了200*150,而原图是390*290会是个啥情况?还是第一次while循环,390/2/1结果是195不满足>200的情况,结束循环,比例值为1,最后图片压缩成400*300虽然压缩一次以后没有满足大于所需宽高,但是和所需宽高很接近啊!!!能不能做一个获取压缩成最接近所需宽高数的比例值呢?我也不知道= = 回头可以慢慢研究, 这个"接近"的定义比较模糊,不好掌握~找了几个有名的图片加载开源框架发现也都没有这种处理- -不知道是这样设计是不需要呢,还是没啥用呢以上,图片的像素大小已经做了缩放,但是图片的大小除了和像素有关,还和色彩样式有关不同的样式决定了图片单个像素占的字节数比如,图片默认的色彩样式为ARGB_8888,每个像素占4byte(字节)大小可以看到一共有四种色彩样式ALPHA_8 每个像素只要1字节~可惜只能代表透明度,没有颜色属性ARGB_4444 每个像素要2字节~带透明度的颜色~可惜官方不推荐使用了ARGB_8888 每个像素要4字节~带透明度的颜色, 默认色样RGB_565 每个像素要2字节~不带透明度的颜色默认为ARGB_8888,如果想丧心病狂的继续减少图片所占大小~不需要透明度参数的话,那就可以把色彩样式设为RGB_565设置方法是在BitmapFactory.decode..获取图片事例时修改配置参数的inPreferredConfig 参数opts.inPreferredConfig = Bitmap.Config. RGB_565 ;想亲自撸一撸试一试压缩图片了吧?要注意点问题,如果用res包下图片测试的话,你会发现有图片尺寸有点混乱那是因为在drawable-*dpi文件夹中的图片会根据对应对应的屏幕密度值不同自动进行一定的缩放,比如放在drawable-hdpi里的图片,直接不经过压缩BitmapFactor.decode..出来,会发现bitmap的宽高值是原图的2/3,测试的时候图片记得放在drawable包下(没有的话自己res下新建一个),否则你会被奇怪的宽高值弄凌乱的,具体变化原因参考源代码处理,或者网上搜搜看。
初中级Android开发社招面试之Bitmap
Bitmap1、Bitmap使用需要注意哪些问题?参考回答:o要选择合适的图片规格(bitmap类型):通常我们优化Bitmap时,当需要做性能优化或者防止OOM,我们通常会使用RGB_565,因为ALPHA_8只有透明度,显示一般图片没有意义,Bitmap.Config.ARGB_4444显示图片不清楚,Bitmap.Config.ARGB_8888占用内存最多。
:▪ALPHA_8 每个像素占用1byte内存▪ARGB_4444 每个像素占用2byte内存▪ARGB_8888 每个像素占用4byte内存(默认)▪RGB_565 每个像素占用2byte内存o降低采样率:BitmapFactory.Options 参数inSampleSize的使用,先把options.inJustDecodeBounds设为true,只是去读取图片的大小,在拿到图片的大小之后和要显示的大小做比较通过calculateInSampleSize()函数计算inSampleSize的具体值,得到值之后。
options.inJustDecodeBounds设为false读图片资源。
o复用内存:即通过软引用(内存不够的时候才会回收掉),复用内存块,不需要再重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率。
o使用recycle()方法及时回收内存。
o压缩图片。
2、Bitmap.recycle()会立即回收么?什么时候会回收?如果没有地方使用这个Bitmap,为什么垃圾回收不会直接回收?参考回答:o通过源码可以了解到,加载Bitmap到内存里以后,是包含两部分内存区域的。
简单的说,一部分是Java部分的,一部分是C部分的。
这个Bitmap对象是由Java部分分配的,不用的时候系统就会自动回收了o但是那个对应的C可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。
所以需要调用recycle()方法来释放C部分的内存o bitmap.recycle()方法用于回收该Bitmap所占用的内存,接着将bitmap置空,最后使用System.gc()调用一下系统的垃圾回收器进行回收,调用System.gc()并不能保证立即开始进行回收过程,而只是为了加快回收的到来。
Android读取本地或网络图片并转换为Bitmap
Android读取本地或⽹络图⽚并转换为Bitmap在做android项⽬时,我们经常需要从本地或者⽹络读取图⽚,并转换为Bitmap图⽚,以便使⽤,下⾯是读取本地图⽚并转换的⽅法:Java代码/*** 得到本地或者⽹络上的bitmap url - ⽹络或者本地图⽚的绝对路径,⽐如:** A.⽹络路径: url="/girl2.png" ;** B.本地路径:url="file://mnt/sdcard/photo/image.png";** C.⽀持的图⽚格式 ,png, jpg,bmp,gif等等** @param url* @return*/public static Bitmap GetLocalOrNetBitmap(String url){Bitmap bitmap = null;InputStream in = null;BufferedOutputStream out = null;try{in = new BufferedInputStream(new URL(url).openStream(), Constant.IO_BUFFER_SIZE);final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();out = new BufferedOutputStream(dataStream, Constant.IO_BUFFER_SIZE);copy(in, out);out.flush();byte[] data = dataStream.toByteArray();bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);data = null;return bitmap;}catch (IOException e){e.printStackTrace();return null;}}说明:Constant.IO_BUFFER_SIZE 是⼀个常量⽽已,可以改成常数,⽐如2*1024,其实取决于你的图⽚⼤⼩,⾃⼰根据图⽚的⼤⼩⾃⼰设定吧。
Android中Bitmap和Drawable
Android一、相关概念1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象2、Canvas画布,绘图的目的区域,用于绘图3、Bitmap位图,用于图的处理4、Matrix矩阵二、Bitmap1、从资源中获取BitmapJava代码1.Resources res = getResources();2.Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);2、Bitmap → byte[]Java代码1.public byte[] Bitmap2Bytes(Bitmap bm) {2. ByteArrayOutputStream baos = new ByteArrayOutputStream();3. press(pressFormat.PNG, 100, baos);4. return baos.toByteArray();5.}3、byte[] → BitmapJava代码1.public Bitmap Bytes2Bimap(byte[] b) {2. if (b.length != 0) {3. return BitmapFactory.decodeByteArray(b, 0, b.length);4. } else {5. return null;6. }7.}4、Bitmap缩放Java代码1.public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {2. int w = bitmap.getWidth();3. int h = bitmap.getHeight();4. Matrix matrix = new Matrix();5. float scaleWidth = ((float) width / w);6. float scaleHeight = ((float) height / h);7. matrix.postScale(scaleWidth, scaleHeight);8. Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);9. return newbmp;10.}5、将Drawable转化为BitmapJava代码1.public static Bitmap drawableToBitmap(Drawable drawable) {2. // 取 drawable 的长宽3. int w = drawable.getIntrinsicWidth();4. int h = drawable.getIntrinsicHeight();5.6. // 取 drawable 的颜色格式7. Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_88888. : Bitmap.Config.RGB_565;9. // 建立对应 bitmap10. Bitmap bitmap = Bitmap.createBitmap(w, h, config);11. // 建立对应 bitmap 的画布12. Canvas canvas = new Canvas(bitmap);13. drawable.setBounds(0, 0, w, h);14. // 把 drawable 内容画到画布中15. drawable.draw(canvas);16. return bitmap;17. }6、获得圆角图片Java代码1.public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {2. int w = bitmap.getWidth();3. int h = bitmap.getHeight();4. Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);5. Canvas canvas = new Canvas(output);6. final int color = 0xff424242;7. final Paint paint = new Paint();8. final Rect rect = new Rect(0, 0, w, h);9. final RectF rectF = new RectF(rect);10. paint.setAntiAlias(true);11. canvas.drawARGB(0, 0, 0, 0);12. paint.setColor(color);13. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);14. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));15. canvas.drawBitmap(bitmap, rect, rect, paint);16.17. return output;18.}7、获得带倒影的图片Java代码1.public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {2. final int reflectionGap = 4;3. int w = bitmap.getWidth();4. int h = bitmap.getHeight();5.6. Matrix matrix = new Matrix();7. matrix.preScale(1, -1);8.9. Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h /2, w,10. h / 2, matrix, false);11.12. Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h/ 2),13. Config.ARGB_8888);14.15. Canvas canvas = new Canvas(bitmapWithReflection);16. canvas.drawBitmap(bitmap, 0, 0, null);17. Paint deafalutPaint = new Paint();18. canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint);19.20. canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null);21.22. Paint paint = new Paint();23. LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,24. bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,25. 0x00ffffff, TileMode.CLAMP);26. paint.setShader(shader);27. // Set the Transfer mode to be porter duff and destinationin28. paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));29. // Draw a rectangle using the paint with our linear gradient30. canvas.drawRect(0, h, w, bitmapWithReflection.getHeight()31. + reflectionGap, paint);32.33. return bitmapWithReflection;34.}三、Drawable1、Bitmap转换成DrawableJava代码1.Bitmap bm=xxx; //xxx根据你的情况获取2.BitmapDrawable bd= new BitmapDrawable(getResource(), bm);3.因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
flutter bitmap的用法
Flutter中的Bitmap是一种用于在内存中表示像素数据的类。
它允许您操作图像数据,例如缩放、裁剪、旋转等。
要使用Bitmap,您需要使用Flutter的图像处理库,例如image_picker或image_cropper。
这些库可以帮助您从设备中选择或裁剪图像,并返回一个Bitmap对象。
一旦您拥有了一个Bitmap对象,您可以使用它来访问和操作图像数据。
例如,您可以使用Canvas类来绘制Bitmap对象,或者使用Image类来显示Bitmap对象。
以下是一个使用image_picker库选择图像并将其转换为Bitmap 对象的示例代码:```dartimport 'package:flutter/material.dart';import 'package:image_picker/image_picker.dart';import 'dart:ui' as ui;void main() {runApp(MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Bitmap Example'),),body: Center(child: Image.asset('assets/images/sample.jpg',fit: BoxFit.cover,),),),));}```在上面的代码中,我们首先导入了必要的库。
然后,我们创建了一个MaterialApp对象,并在其home属性中创建了一个Scaffold对象。
在Scaffold的body属性中,我们使用Image.asset方法显示了一个图像。
该方法接受一个文件路径和一个选项对象作为参数,用于设置图像的缩放方式和填充方式。
如果您想要使用Bitmap对象进行更高级的图像处理操作,您需要使用Flutter中的另一个库——skia。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
android Bitmap用法总结Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer41、Drawable → Bitmappublic static Bitmap drawableToBitmap(Drawable drawable) {Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight(),drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);Canvas canvas = new Canvas(bitmap);// canvas.setBitmap(bitmap);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());drawable.draw(canvas);return bitmap;}2、从资源中获取BitmapResources res=getResources();Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);3、Bitmap → byte[]private byte[] Bitmap2Bytes(Bitmap bm){ByteArrayOutputStream baos = new ByteArrayOutputStream();press(pressFormat.PNG, 100, baos);return baos.toByteArray();}4、byte[] → Bitmapprivate Bitmap Bytes2Bimap(byte[] b){if(b.length!=0){return BitmapFactory.decodeByteArray(b, 0, b.length);}else {return null;}}5、保存bitmapstatic boolean saveBitmap2file(Bitmap bmp,String filename){ CompressFormat format= pressFormat.JPEG;int quality = 100;OutputStream stream = null;try {stream = new FileOutputStream("/sdcard/" + filename);} catch (FileNotFoundException e) {// TODO Auto-generated catch blockGenerated by Foxit PDF Creator © Foxit Software For evaluation only.e.printStackTrace();}return press(format, quality, stream);}6、将图片按自己的要求缩放// 图片源Bitmap bm = BitmapFactory.decodeStream(getResources() .openRawResource(R.drawable.dog));// 获得图片的宽高int width = bm.getWidth();int height = bm.getHeight();// 设置想要的大小int newWidth = 320;int newHeight = 480;// 计算缩放比例float scaleWidth = ((float) newWidth) / width;float scaleHeight = ((float) newHeight) / height;// 取得想要缩放的matrix参数Matrix matrix = new Matrix();matrix.postScale(scaleWidth, scaleHeight);// 得到新的图片Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix,true);// 放在画布上canvas.drawBitmap(newbm, 0, 0, paint);相关知识链接:/thread-3162-1-1.html7、bitmap的用法小结BitmapFactory.Options option = new BitmapFactory.Options();option.inSampleSize = 2; //将图片设为原来宽高的1/2,防止内存溢出Bitmap bm = BitmapFactory.decodeFile("",option);//文件流URL url = new URL("");InputStream is = url.openStream();Bitmap bm = BitmapFactory.decodeStream(is);android:scaleType:android:scaleType是控制图片如何resized/moved来匹对ImageView的size。
ImageView.ScaleType / android:scaleType值的意义区别:CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽Generated by Foxit PDF Creator © Foxit Software For evaluation only.FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
//放大缩小图片public static Bitmap zoomBitmap(Bitmap bitmap,int w,int h){int width = bitmap.getWidth();int height = bitmap.getHeight();Matrix matrix = new Matrix();float scaleWidht = ((float)w / width);float scaleHeight = ((float)h / height);matrix.postScale(scaleWidht, scaleHeight);Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);return newbmp;}//将Drawable转化为Bitmappublic static Bitmap drawableToBitmap(Drawable drawable){int width = drawable.getIntrinsicWidth();int height = drawable.getIntrinsicHeight();Bitmap bitmap = Bitmap.createBitmap(width, height,drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);Canvas canvas = new Canvas(bitmap);drawable.setBounds(0,0,width,height);drawable.draw(canvas);return bitmap;Generated by Foxit PDF Creator © Foxit Software For evaluation only.}//获得圆角图片的方法public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){ Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);Canvas canvas = new Canvas(output);final int color = 0xff424242;final Paint paint = new Paint();final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());final RectF rectF = new RectF(rect);paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(bitmap, rect, rect, paint);return output;}//获得带倒影的图片方法public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){final int reflectionGap = 4;int width = bitmap.getWidth();int height = bitmap.getHeight();Matrix matrix = new Matrix();matrix.preScale(1, -1);Bitmap reflectionImage = Bitmap.createBitmap(bitmap,0, height/2, width, height/2, matrix, false);Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888);Canvas canvas = new Canvas(bitmapWithReflection);canvas.drawBitmap(bitmap, 0, 0, null);Paint deafalutPaint = new Paint();Generated by Foxit PDF Creator © Foxit Software For evaluation only.canvas.drawRect(0, height,width,height + reflectionGap,deafalutPaint);canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint();LinearGradient shader = new LinearGradient(0,bitmap.getHeight(), 0, bitmapWithReflection.getHeight()+ reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);paint.setShader(shader);// Set the Transfer mode to be porter duff and destination in paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));// Draw a rectangle using the paint with our linear gradient canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);return bitmapWithReflection;}}。