Glide图片框架使用详细介绍(三)自定义glide以及图片处理自定义transform

图片默认质量

Picasso的默认质量是 ARGB_8888

Glide的默认质量则为 RGB_565

Glide默认的图片质量比Picasso稍微差一些。

加载一张4000 * 2000(一般手机拍摄的都超过这个像素)的图片

占用内存

Picasso需要占用的内存为: 32MB

4000 * 2000 * 4 / 1024 / 1024 = 30 (MB)

Glide需要占用的内存为: 16MB

4000 * 2000 * 2 / 1024 / 1024 = 15 (MB)

也就是说只要同时加载几张图片,你的应用就会OOM(内存溢出了),最恐怖的是就算你的ImageView的宽高只有10px,同样会占用那么多内存,这就是为什么需要做图片压缩的原因了

二、自定义glide

当然我们也能用glide加载更高清的图片,通过自定义glide实现。

1.创建一个类实现GlideModule

public class NewGlideModule implements GlideModule {

@Override

public void applyOptions(Context context, GlideBuilder builder) {

//TODO

}

@Override

public void registerComponents(Context context, Glide glide) {

//TODO

}

}

2.配置清单文件

在AndroidManifest中配置刚刚创建的GlideModule,需要在application节点下添加

<meta-data

android:name=“com.xiayu.xiayuglidedemo.XiayuGlideModule”

android:value=“GlideModule” />

其中Android:name就是刚才创建的GlideModule的实现类

3.进行自定义配置

刚才创建的GlideModule的实现类时,会要实现两个方法,这里要用到的是其中的applyOptions方法,applyOptions方法里面提供了一个GlideBuilder,通过GlideBuilder我们就能实现自定义配置了

public class NewGlideModule implements GlideModule {

@Override

public void applyOptions(Context context, GlideBuilder builder) {

builder.setDiskCache();//自定义磁盘缓存

builder.setMemoryCache();//自定义内存缓存

builder.setBitmapPool(); //自定义图片池

builder.setDiskCacheService();//自定义本地缓存的线程池

builder.setResizeService();//自定义核心处理的线程池

builder.setDecodeFormat();//自定义图片质量

}

@Override

public void registerComponents(Context context, Glide glide) {

//TO

}

}

4.例子(配置默认图片质量)

由于Glide的配置涉及到的东西比较多,在以后的文章里面会对每一种配置做说明具体介绍,这里就先示范一个比较简单的配置,那就是图片质量配置

用过Picasso的朋友应该知道,Picasso默认的图片质量是ARGB_8888,而Glide默认的图片质量是RGB_565,这里我们就来修改默认配置,让Glide的默认质量为ARGB_8888

(ARGB_8888是指32位图,即每个像素占4byte)

(RGB_565是16位图,即每个像素占2byte)

public class NewGlideModule implements GlideModule {

@Override

public void applyOptions(Context context, GlideBuilder builder) {

//自定义图片质量

builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);

}

@Override

public void registerComponents(Context context, Glide glide) {

//TO

}

}

5.其他

在清单文件中可以配置多个GlideModule,Glide会依次遍历并读取。

三、自定义Transformation

1.创建一个类继承BitmapTransformation

需要实现两个方法,其中transform方法里面能拿到bitmap对象,这里就是对图片做处理的地方

public class CornersTransform extends BitmapTransformation {

@Override

protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {

//TODO

}

@Override

public String getId() {

//TODO
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

目前已经更新的部分资料:



《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

//img2.imgtp.com/2024/03/13/H4lCoPEF.jpg" />

最后

目前已经更新的部分资料:

[外链图片转存中…(img-S0V3nq5f-1711858722305)]
[外链图片转存中…(img-vafU5KMB-1711858722305)]
[外链图片转存中…(img-d2JTLR0Z-1711858722305)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了在Android中实现图片资源加密解密,我们可以使用以下步骤: 1. 将图片转换为字节数组 2. 使用加密算法(如AES)对字节数组进行加密 3. 将加密后的字节数组保存到文件中,以自定义格式作为文件扩展名(如“.enc”) 4. 在应用程序中使用Glide加载图片时,使用自定义的解密器将加密的图片解密为原始字节数组 5. 将解密后的字节数组作为参数传递给Glide加载图片 以下是一个简单的示例代码,演示了如何使用AES加密和解密图片资源: 加密代码: ```java public static void encryptImage(Context context, int resourceId, String outputPath) throws Exception { InputStream inputStream = context.getResources().openRawResource(resourceId); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } byte[] data = outputStream.toByteArray(); outputStream.close(); inputStream.close(); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec("my-secret-key-123".getBytes(), "AES"); IvParameterSpec ivSpec = new IvParameterSpec("my-iv-parameter-456".getBytes()); cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); byte[] encryptedData = cipher.doFinal(data); FileOutputStream fileOutputStream = new FileOutputStream(outputPath); fileOutputStream.write(encryptedData); fileOutputStream.close(); } ``` 解密代码: ```java public static byte[] decryptImage(Context context, Uri uri) throws Exception { InputStream inputStream = context.getContentResolver().openInputStream(uri); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } byte[] encryptedData = outputStream.toByteArray(); outputStream.close(); inputStream.close(); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec("my-secret-key-123".getBytes(), "AES"); IvParameterSpec ivSpec = new IvParameterSpec("my-iv-parameter-456".getBytes()); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); byte[] data = cipher.doFinal(encryptedData); return data; } ``` 在应用程序中使用Glide加载解密后的图片: ```java Glide.with(context) .load(Uri.parse("file:///android_asset/image.enc")) .asBitmap() .format(new CustomImageFormat()) .decoder(new CustomImageDecoder()) .into(imageView); ``` 其中,CustomImageFormat用于指定自定义图片格式的文件扩展名(如“.enc”),CustomImageDecoder用于实现自定义的解密器,将加密的图片资源解密为原始字节数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值