在 Android 中 Matrix 实现图像的缩放和裁剪将 Glide 图像从 fitCenter 转换为 centerCrop

在 Android 中,Matrix 可以用来实现图像的缩放和裁剪逻辑。要将 Glide 图像从 fitCenter 转换为 centerCrop,需要通过 Matrix 计算变换逻辑。
以下是使用 Kotlin 实现的方法:
实现步骤
计算目标变换矩阵:根据目标宽高比,判断是否需要横向或纵向裁剪。
设置 Matrix:使用 Matrix 执行缩放和平移操作。
应用到 Glide:自定义一个 Glide 的 Transformation 类。
以下是完整的代码实现:

import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.Paint
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import java.security.MessageDigest

class FitCenterToCenterCropTransformation : BitmapTransformation() {
    override fun updateDiskCacheKey(messageDigest: MessageDigest) {
        messageDigest.update("fit_center_to_center_crop".toByteArray(Charsets.UTF_8))
    }

    override fun transform(
        pool: BitmapPool,
        toTransform: Bitmap,
        outWidth: Int,
        outHeight: Int
    ): Bitmap {
        val srcWidth = toTransform.width.toFloat()
        val srcHeight = toTransform.height.toFloat()
        val targetWidth = outWidth.toFloat()
        val targetHeight = outHeight.toFloat()

        val matrix = Matrix()

        // Calculate the scale
        val scale: Float
        val dx: Float
        val dy: Float

        if (srcWidth / srcHeight > targetWidth / targetHeight) {
            // Wider image, fit height and crop width
            scale = targetHeight / srcHeight
            dx = (targetWidth - srcWidth * scale) / 2
            dy = 0f
        } else {
            // Taller image, fit width and crop height
            scale = targetWidth / srcWidth
            dx = 0f
            dy = (targetHeight - srcHeight * scale) / 2
        }

        // Apply scale and translation
        matrix.setScale(scale, scale)
        matrix.postTranslate(dx, dy)

        // Create the transformed bitmap
        val transformedBitmap = pool.get(outWidth, outHeight, toTransform.config ?: Bitmap.Config.ARGB_8888)
        val canvas = Canvas(transformedBitmap)
        val paint = Paint(Paint.FILTER_BITMAP_FLAG)
        canvas.drawBitmap(toTransform, matrix, paint)

        return transformedBitmap
    }
}

使用方法
将自定义的 Transformation 应用到 Glide:

Glide.with(context)
    .load(imageUrl)
    .transform(FitCenterToCenterCropTransformation())
    .into(imageView)

解释
Matrix 的作用:通过 Matrix 调整图像的缩放和位置。
兼容性处理BitmapConfig 可能为空,所以在新建位图时要默认使用 ARGB_8888
Glide 的缓存updateDiskCacheKey 用于区分不同的变换操作,避免缓存冲突。
效果
该代码会将原本 fitCenter(全图适配但留黑边)的图片按比例裁剪,转换成 centerCrop(以中间为基准裁剪并充满视图)。

发布者:myrgd,转载请注明出处:https://www.object-c.cn/5067

Like (0)
Previous 2024年12月3日 下午12:23
Next 2024年12月3日 下午1:11

相关推荐

  • 远程仓库 ,从GitHub拉取代码失败的解决办法

    从GitHub拉取代码失败通常由以下几种原因引起:网络问题、认证失败、远程仓库配置错误等。以下是常见的失败场景及解决办法。 1. 网络问题症状连接超时。报错如:fatal: unable to access ‘https://github.com/…’: Failed to connect to github.com port 443: Connecti…

    2024年11月28日
    00
  • 使用Docker搭建Deepl开源翻译组件使用教程

    DeepL 是一个优秀的翻译工具,目前官方并未提供直接的开源版本或本地部署方案。不过,社区中存在一些基于 DeepL API 的开源项目,可以通过 Docker 搭建一个翻译服务接口。以下是使用 Docker 搭建 DeepL 翻译组件的详解。 一、准备工作 二、开源项目选择 1. 使用社区项目封装的 DeepL API 服务 社区中有一些开源项目,基于 D…

    2024年11月23日
    00
  • 在使用 PHP 抓取 HTTPS 资源时,会遇到一些常见问题

    在使用 PHP 抓取 HTTPS 资源时,可能会遇到一些常见问题。这些问题通常与 SSL 配置、证书验证或 PHP 设置相关。以下是常见问题及其解决方法的汇总: 1. SSL 证书验证失败问题描述当使用 file_get_contents、cURL 等方法访问 HTTPS 资源时,可能会遇到类似以下错误: 解决方法更新 cacert.pem 文件下载最新的根…

    2024年12月2日
    00
  • 在微信服务号中,通过设置自动回复,可以在新用户关注时引导其进入小程序

    在微信服务号中,通过设置自动回复,可以在新用户关注时引导其进入小程序。以下是实现的方法和建议: 1. 使用文本自动回复引导在服务号后台设置关注自动回复,可以通过一段欢迎语并附带小程序链接,引导用户点击进入。示例文案: 小程序链接格式: 设置路径:进入 微信公众平台 > 自动回复 > 关注后自动回复,添加以上文案。 2. 使用卡片自动回复引导你可以直接在自动回…

    2024年12月3日
    00
  • 在 Apache Kafka 中消息的消费和传递通过消费者与 Kafka 的分布式系统协作完成

    在 Apache Kafka 中,消息的消费和传递是通过消费者(Consumer)与 Kafka 的分布式系统协作完成的。以下是消息传递的主要流程: 1. Producer 生产消息到 Kafka 2. Consumer 消费消息 Kafka 中消费者的消息消费流程如下: 2.1 订阅主题 消费者通过 Kafka 客户端订阅一个或多个主题。它可以: 2.2 …

    2024年12月9日
    00
  • 在 Spring Boot 中实现定时任务,可以使用以下三种方式

    1. 使用 @Scheduled 注解 这是 Spring 提供的简单方式,基于注解实现定时任务。 步骤: 3. 创建任务类使用 @Scheduled 注解定义定时任务: 4. @Scheduled 参数详解 2. 使用 ScheduledExecutorService 如果任务管理需要更灵活,可以使用 Java 自带的线程池。 示例: 3. 使用 Quar…

    2024年11月26日
    00
  • 在 Neo4j 中存储 Liquidity Structure(的层次和关联结构)

    在 Neo4j 中存储 Liquidity Structure(流动性结构)的层次和关联结构时,可以使用其图数据库的特性:节点(Node)表示实体,关系(Relationship)表示这些实体之间的连接。流动性结构通常涉及多层次的实体(如母公司、子公司、账户、资金池等)及其关联关系。 以下是具体实现步骤: 1. 设计数据模型节点类型:实体层次(Hierarc…

    2024年12月2日
    00
  • 微信支付域名回调用个人服务器域名的方法

    在使用微信支付功能时,微信支付的回调需要指定合法的 支付回调通知地址(即回调域名)。如果你想使用个人服务器的域名来作为微信支付的回调域名,需要满足以下条件并完成配置: 1. 域名要求 合法域名的要求 2. 配置个人服务器域名 步骤 1:准备域名 步骤 2:设置 HTTPS 步骤 3:配置域名解析 3. 微信支付后台配置 3. 保存配置。 4. 在代码中处理回…

    2024年11月24日
    00
  • 如何用pbootcmsAPI接口开发微信小程序UNIAPP

    使用 PbootCMS 的 API 接口结合 UniApp 开发微信小程序,可以实现高效的内容管理和展示。以下是一个完整的开发流程,包括 API 接口设置、小程序功能设计和开发细节。 1. 准备工作1.1 配置 PbootCMS API 接口PbootCMS 提供 API 功能,需在后台开启并配置:登录 PbootCMS 后台管理。前往 系统管理 -> AP…

    2024年11月28日
    00
  • Jeewx-Api 1.3.1 发布:更简易的微信小程序开发 API 降低了开发成本

    Jeewx-Api 1.3.1 发布:更简易的微信小程序开发 API Jeewx-Api 是一款开源的微信开发 SDK,支持微信公众号、小程序、企业微信等全场景开发。1.3.1 版本针对小程序功能做了全面优化,为开发者提供了更简洁易用的 API,降低了开发成本。 1. 新版本亮点 支持微信小程序功能 更简洁的 API 支持企业微信与公众号 2. Jeewx-…

    2024年12月3日
    00
  • Android 解决 “Module was compiled with an incompatible version of Kotlin“

    “Module was compiled with an incompatible version of Kotlin” 错误通常出现在 Android 开发中,因为模块的 Kotlin 编译器版本与项目中的 Kotlin 编译器版本不匹配。以下是解决此问题的方法: 1. 检查 Kotlin 插件版本步骤:打开 Android Studio。点击顶部菜单的 …

    2024年11月26日
    00
  • 微信小程序设计和实现一个校园音乐应用的方法

    基于微信小程序设计和实现一个校园音乐平台,主要包括以下几个方面的设计与功能实现: 1. 需求分析 1.1 功能需求 1.2 非功能需求 2. 技术架构设计 2.1 前端:微信小程序 2.2 后端 2.3 技术栈 3. 数据库设计 表结构示例: 4. 功能实现 4.1 用户登录与注册 4.2 音乐播放 4.3 歌单与榜单 4.4 评论功能 5. 部署与优化 5…

    2024年11月26日
    00
  • 在 Mac 上,Google Chrome 无法打开网页的问题

    在 Mac 上,Google Chrome 无法打开网页可能由多个因素引起。以下是一些常见的原因及解决方法: 1. 检查网络连接 确保你的 Mac 已连接到互联网,尝试使用其他设备(如手机或其他电脑)打开相同的网页,确认问题是否出在设备本身或网络。 2. 清除浏览器缓存和历史记录 长期积累的缓存和浏览数据可能导致加载问题。尝试清除缓存和历史记录: 3. 禁用…

    2024年11月23日
    00
  • 在 uni-app 小程序中,使用 uni.getLocation 获取用户位置信息等

    在 uni-app 小程序 中,使用 uni.getLocation 获取用户位置后,可以通过 腾讯地图 API 将经纬度转化为详细的地址信息(如省、市、区、街道等)。以下是完整的操作流程: 1. 前置准备:开通腾讯地图 API 服务注册腾讯位置服务账号:登录 腾讯位置服务官网。创建项目并获取 Key:进入 控制台,创建新应用,选择 小程序。获取生成的 ke…

    2024年11月26日
    00
  • Llama-Factory 用于大语言模型开发、微调、量化和优化的工具

    Llama-Factory 是一个用于大语言模型开发、微调、量化和优化的工具。针对量化部分,它旨在通过精度压缩的方式减少模型大小和推理时间,同时尽可能保持模型的性能。以下是关于 Llama-Factory 量化部分的详细说明和流程: 1. 为什么需要量化?减少模型大小:传统的大模型通常使用 16-bit 或 32-bit 浮点数表示权重,占用大量存储和内存。…

    2024年12月2日
    00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信