package com.rangergame.yanheji_guiji.utils; import android.content.Context; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader.TileMode; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.Log; import android.widget.ImageView; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * author : makenna * time : 2020/11/14 * describe :Bitmap工具类 */ public class BitmapUtils { private static String TAG="tag"; /** * 根据文件名,从Assets中取图片 * * @param context * @param fileName * 例如:game_bg.png * @return */ public static Bitmap getBitmapFromAsset(Context context, String fileName) { Bitmap bmp = null; if (TextUtils.isEmpty(fileName)) { return null; } AssetManager asm = context.getAssets(); if (asm == null) { return bmp; } InputStream is = null; try { is = asm.open(fileName); bmp = BitmapFactory.decodeStream(is); } catch (IOException e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } } catch (IOException e) { e.printStackTrace(); } } return bmp; } /** * 根据路径,以流的形式,在sdcard中读取图片 * * @param filename * @return */ public static Bitmap getBitmapFormSdcard(String filename) { if (TextUtils.isEmpty(filename)) { return null; } Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeFile(filename); } catch (OutOfMemoryError e) { if (bitmap != null) { if (!bitmap.isRecycled()) { bitmap.recycle(); } bitmap = null; } } catch (Exception e) { if (bitmap != null) { if (!bitmap.isRecycled()) { bitmap.recycle(); } bitmap = null; } } return bitmap; } /** * 根据URL下载图片 * * @param imageUrl * 网络url地址 * @param connectTimeout * 链接超时 * @param readTimeout * 读取超时 * @return */ public static Bitmap downloadPic(String imageUrl, int connectTimeout, int readTimeout) { if (TextUtils.isEmpty(imageUrl)) { return null; } URL url = null; HttpURLConnection conn = null; InputStream is = null; Bitmap bitmap = null; try { url = new URL(imageUrl); conn = (HttpURLConnection) url.openConnection(); // conn.setConnectTimeout(connectTimeout); // conn.setReadTimeout(readTimeout); conn.setDoInput(true); // conn.connect(); is = conn.getInputStream(); // bitmap = BitmapFactory.decodeStream(is); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (OutOfMemoryError e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { if (conn != null) { conn.disconnect(); conn = null; } if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } finally { is = null; } } } return bitmap; } /** * 更改bitmap的宽,高 * * @param bmp * @param targetWidth * @param targetHeight * @return */ public static Bitmap resizeBitmap(Bitmap bmp, int targetWidth, int targetHeight) { if (bmp == null || bmp.isRecycled()) { return null; } Bitmap bmResult = null; try { // 原始图片宽度 float width = bmp.getWidth(); // 原始图片高度 float height = bmp.getHeight(); Matrix m1 = new Matrix(); // 这里指的是目标区域(不是目标图片) m1.postScale(targetWidth / width, targetHeight / height); // 声明位图 bmResult = Bitmap.createBitmap(bmp, 0, 0, (int) width, (int) height, m1, true); } catch (Exception e) { if (bmResult != null) { if (!bmResult.isRecycled()) { bmResult.recycle(); bmResult = null; } } bmResult = bmp; } return bmResult; } /** * 按某个比例缩放图片 * * @param bmp * @param ratio * @return */ public static Bitmap resizeBitmap(Bitmap bmp, float ratio) { if (bmp == null || bmp.isRecycled()) { return null; } Bitmap bmResult = null; try { // 图片宽度 float width = bmp.getWidth(); // 图片高度 float height = bmp.getHeight(); Matrix m1 = new Matrix(); m1.postScale(ratio, ratio); // 声明位图 bmResult = Bitmap.createBitmap(bmp, 0, 0, (int) width, (int) height, m1, true); } catch (Exception e) { if (bmResult != null) { if (!bmResult.isRecycled()) { bmResult.recycle(); bmResult = null; } } bmResult = bmp; } return bmResult; } /** * 将图片存入Sdcard中指定路径 * * @param bitmap * @param path * @return */ public static boolean saveBitmapToSdcard(Bitmap bitmap, String path) { if (bitmap == null || TextUtils.isEmpty(path)) { return false; } File file = null; FileOutputStream fos = null; try { file = new File(path); if (file.exists()) { file.delete(); } // fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 80, fos); fos.flush(); return true; } catch (Exception e) { // } finally { if (null != fos) { try { fos.close(); } catch (Exception e) { } } } return false; } /** * 处理头像(填充圆角) * * @param bitmap * @param roundPx * @return */ public static Bitmap getCornerBitmap(Bitmap bitmap, float roundPx) { if (bitmap == null) { return null; } Bitmap output = null; try { output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); final Paint paint = new Paint(); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } catch (OutOfMemoryError e) { if (output != null) { if (!output.isRecycled()) { output.recycle(); output = null; } } output = bitmap; // e.printStackTrace(); } return null; } /** * 镜像效果mirror * * @param originalImage * @return */ public static Bitmap getMirrorImage(Bitmap originalImage) { if (originalImage == null) { return null; } Bitmap bitmapWithReflection = null; try { final int reflectionGap = 2; int width = originalImage.getWidth(); int height = originalImage.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height / 2, width, height / 2, matrix, false); bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 6), Config.ARGB_8888); Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(originalImage, 0, 0, null); canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, height, 0, bitmapWithReflection.getHeight() + reflectionGap + 20, 0xffffffff, 0x00ffffff, TileMode.MIRROR); paint.setShader(shader); paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); } catch (OutOfMemoryError e) { if (bitmapWithReflection != null) { if (!bitmapWithReflection.isRecycled()) { bitmapWithReflection.recycle(); bitmapWithReflection = null; } } bitmapWithReflection = originalImage; // e.printStackTrace(); } return bitmapWithReflection; } /** * Mosaic a bitmap * @param srcBitmap * @param radius The pixel number of a block. such as width/16 * @param dstBitmap the width and height must be the same of srcBitmap * @return {@link #SUCCESS} or {@value #OUT_OF_BOUNDS_EXCEPTION} */ public static boolean mosaic(final Bitmap srcBitmap, final int radius, Bitmap dstBitmap){ try { Log.d(TAG, "mosaic srcBitmap = " + srcBitmap + ", radius = " + radius + ", dstBitmap = " + dstBitmap); int w = srcBitmap.getWidth(); int h = srcBitmap.getHeight(); int[] srcData = new int[w*h]; int[] dstData = new int[w*h]; int midRadius = radius >> 1; int srcX,srcY; // int[] srcData = srcBitmap.mBuffer; Log.d(TAG, "mosaic:w= " + w + ",h=" +h); long startTime = System.currentTimeMillis(); srcBitmap.getPixels(srcData, 0, w, 0, 0, w, h); for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { srcX = i - i%radius + midRadius; srcY = j - j%radius + midRadius; if(srcX >= w){ srcX = w-1; } if(srcY >= h){ srcY = h-1; } dstData[j*w + i] = srcData[srcY * w + srcX]; } } Log.d(TAG, "exe time = " + (System.currentTimeMillis() - startTime)); dstBitmap.setPixels(dstData, 0, w, 0, 0, w, h); Log.d(TAG, "setPixels time = " + (System.currentTimeMillis() - startTime)); } catch (ArrayIndexOutOfBoundsException e) { // TODO: handle exception Log.e(TAG, "ArrayIndexOutOfBoundsException = " + e); return false; }catch (IllegalStateException e) { Log.e(TAG, "IllegalStateException = " + e); return false; }catch (Exception e) { Log.e(TAG, "Exception = " + e); return false; } return true; } /** * Mosaic2 a bitmap. The time cost is 9 times against as mosaic(...), * but the memory is half of it * @param srcBitmap * @param radius The pixel number of a block. such as width/16 * @param dstBitmap the width and height must be the same of srcBitmap * @return {@link #SUCCESS} or {@value #OUT_OF_BOUNDS_EXCEPTION} */ public static boolean mosaic2(final Bitmap srcBitmap, final int radius, Bitmap dstBitmap){ try { Log.d(TAG, "mosaic srcBitmap = " + srcBitmap + ", radius = " + radius + ", dstBitmap = " + dstBitmap); int w = srcBitmap.getWidth(); int h = srcBitmap.getHeight(); int srcData = 0; // int dstData = 0; int midRadius = radius >> 1; int srcX,srcY; Log.d(TAG, "mosaic:w= " + w + ",h=" +h); long startTime = System.currentTimeMillis(); // srcBitmap.getPixels(srcData, 0, w, 0, 0, w, h); for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { srcX = i - i%radius + midRadius; srcY = j - j%radius + midRadius; if(srcX >= w){ srcX = w-1; } if(srcY >= h){ srcY = h-1; } srcData = srcBitmap.getPixel(srcX, srcY); dstBitmap.setPixel(i, j, srcData); // dstData[j*w + i] = srcData[srcY * w + srcX]; } } Log.d(TAG, "exe time = " + (System.currentTimeMillis() - startTime)); // dstBitmap.setPixels(dstData, 0, w, 0, 0, w, h); // Log.d(TAG, "setPixels time = " + (System.currentTimeMillis() - startTime)); } catch (ArrayIndexOutOfBoundsException e) { // TODO: handle exception Log.e(TAG, "ArrayIndexOutOfBoundsException = " + e); return false; }catch (IllegalStateException e) { Log.e(TAG, "IllegalStateException = " + e); return false; }catch (Exception e) { Log.e(TAG, "Exception = " + e); return false; } return true; } /** * 设置 ImageView 图标颜色 */ public void setImageViewColorFilter(ImageView view, int color) { if (view == null) return; view.setColorFilter(view.getContext().getResources().getColor(color)); } /** * 获取 指定颜色 的图标 * * @param context * @param resID * @return */ public Drawable getThemeDrawableColorFilter(Context context, int resID, int color) { Drawable drawable = null; try { drawable = context.getResources().getDrawable(resID); drawable.setColorFilter(context.getResources().getColor(color), PorterDuff.Mode.SRC_ATOP); } catch (Exception | OutOfMemoryError error) { error.printStackTrace(); } if (drawable == null) { return new ColorDrawable(Color.TRANSPARENT); } else { return drawable; } } }
相关推荐
BitmapUtils是Android开发中常用的工具类,主要用于处理Bitmap对象,如图像合成、放大缩小、旋转等操作。在Android中,Bitmap是表示图像的基本类,它包含像素数据,并且可以进行各种图像处理。以下是对BitmapUtils类...
Android图片的处理工具类BitmapUtils,供大家参考,具体内容如下 项目中经常会用到图片,所以在这先简单的总结一下。闲言少叙,上代码。 package com.lvstudio.myapp.utils; import android.content.Context; ...
BitmapUtils工具类是Android开发中常见的一种自定义组件,它主要负责对Bitmap对象进行高效、灵活的处理。在Android应用中,Bitmap对象是用于显示图像的主要数据结构,但它的内存管理以及性能优化往往需要开发者投入...
BitmapUtils是Android开发中常见的工具类,用于对Bitmap对象进行高效、便捷的操作。在Android应用开发中,图片处理是非常重要的一环,因为Bitmap对象的管理直接影响到应用的性能和用户体验。 BitmapUtils通常包含...
BitmapUtils Bitmap Unility Class BlurUtils Blur Unility Class ByteUtils Byte Unility Class CalendarUtils Calendar Unility Class ClipboardUtils Clipboard Unility Class CollectionUtils Collection ...
BitmapUtils工具类是Android开发中不可或缺的一部分,它提高了代码的复用性和可维护性,同时也简化了复杂的图像处理任务。对于一个优秀的Android开发者来说,掌握并熟练运用BitmapUtils工具类是非常必要的。在实际...
**Android快速开发框架xUtils3.0学习Demo详解** xUtils3.0是一款高效、轻量级的Android开源框架,由国内知名开发者WuXiaolong开发,它集成了网络请求、数据库操作、图片加载、UI绑定等多种功能,极大地提高了...
在Android应用开发中,工具类库是提升效率和代码质量的关键。这些工具类通常包含了各种通用功能,可以解决开发者在日常编程中遇到的常见问题。本文将深入探讨标题所提及的"Android快速开发不可或缺的11个工具类",...
XUtils是一个集成度很高的Android开发工具库,其中的BitmapUtils模块专门处理图片加载、缓存等问题,使得获取网络图片变得更加便捷和高效。以下是使用XUtils的方式: 首先,确保在项目中已经添加了XUtils的依赖。...
例如,`StringUtils`用于字符串处理,`DateUtils`用于日期时间操作,还有`BitmapUtils`用于图片处理等。这些工具类通常具有高度的复用性和独立性,能够帮助开发者快速实现功能,减少重复代码。 在"Android-收集了...
可以使用ZXing的`BitmapUtils`类进行转换。 4. 处理异常:在生成二维码的过程中,可能会遇到编码错误、数据长度过长等问题,需要捕获并处理异常。 此外,为了提高用户体验,通常还会添加扫描二维码的功能,这同样...
- `BitmapUtils`:处理位图对象,包括加载、压缩、裁剪、缩放图片,以避免内存溢出。 - ` Glide` 或 `Picasso`:这两个是流行的图片加载库,能够高效地加载网络和本地资源中的图片,支持缓存和占位符等特性。 - `...
xUtils是一个功能强大的Android库,它集合了网络请求(HttpUtils)、数据库操作(DbUtils)、图片加载(BitmapUtils)和视图(ViewUtils)等常用功能。在本文中,xUtils框架为游戏资讯应用的开发提供了极大便利,帮助开发者...
这个源码资源很可能采用了以上的一种或多种方法,可能涉及到关键的类如`CornerTransform`或`BitmapUtils`,用于处理图片的裁剪和转换。在使用这些源码时,开发者需要注意以下几点: 1. **兼容性**:检查代码是否...
CommonLibrary主要是自己整理的一些项目开发中常用的工具类、通用UI的集合,目前在不断的更新中,尽可能的覆盖Android开发中通用的一些东西 。 > anim > -- AnimationUtils、ViewAnimationUtils。动画工具类,也可...
- 常见的工具类包括:`StringUtils`(处理字符串)、`DateUtils`(处理日期时间)、`BitmapUtils`(图片处理)、`SharedPreferencesUtils`(存储偏好设置)等。 2. **开源的优势**: - 开源工具类允许开发者直接...
在 Android 中,我们可以使用 BitmapUtils 帮助类来实现将 Bitmap 保存到本地。BitmapUtils 帮助类提供了一个静态方法 saveBitmap,用于将 Bitmap 保存到本地。 saveBitmap 方法 saveBitmap 方法的参数包括文件名...
request.setImageData(BitmapUtils.bitmapToByteArray(bitmap)); // 设置识别类型,例如通用文字识别 request.setLanguage(OCRRequest.LANGUAGE_CHINESE); // 调用OCRClient的recognize方法进行识别 ...