白夜追凶 :手 Q 图片的显示和发送逻辑

2023-11-17

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~

作者:陈舜尧

导语: “这张图片在快捷发图栏背景是黑色的,为啥发到AIO(会话窗口)里背景就变成白的了?” 通过一个bug单,对黑白背景问题跟进的过程中发现了手q中很多奇怪的表现。一层层看代码,整理总结了手q中图片的显示和发送逻辑,以及对透明通道图片的特殊处理。

一、黑背景?白背景?

这张图片在快捷发图栏背景是黑色的,发到AIO里背景就变成白的了。拿到问题,分析有两种可能原因:展示view的背景色不一致;选中的png图片的透明通道在AIO和快捷发图栏两个不同的场景下过滤规则不一致。

很容易就能发现两个场景处理图片的不同:快捷发图栏将png图片获取为bitmap,再压缩成jpeg,这个过程直接忽略了透明通道,android默认处理的结果就是一张黑色背景的jpeg。快捷发图栏所有图片的字节流持久化到同一个文件里,这样做的目的是下次从本地加载多张图片时,会共用同一个文件IO,提高加载效率;

AIO中的缩略图也是由原图压缩成jpeg,在处理的代码中,我发现了人为加白色背景的逻辑,原来这都是产品的策略,可能考虑到AIO中png图片黑色背景视觉上不太美观,所以进行了特殊处理。然而快捷发图栏和AIO中视觉上没做到统一,有道是 产品拍头一时爽,开发解bug火葬场

二、都是png,怎么有黑又有白!

既然问题找到了,美滋滋的准备加个鸡腿,然而事情并没有那么简单!回归问题的时候我用了另外一张png图片测试,咦,怎么这张图片在AIO中背景是黑色的?

有两个怀疑方向:1、png压缩成jpeg的过程,丢失透明通道导致AIO中这张图片为黑色背景;2、有没有可能是在canvas上绘制白色背景失败导致的该问题?

先从第一个方向分析,通过BitmapFactory.decode把png输出为bitmap,再把白底、bitmap依次绘到canvas上,期间旋转信息的处理、对长图的特殊处理、subSample这里就不展开了。这里怀疑png输出为bitmap时,透明通道丢失。

我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值,Bitmap.Option中config的值有下面几种,ALPHA_8 代表8位Alpha位图 ,ARGB_4444 代表16位ARGB位图 ,ARGB_8888 代表32位ARGB位图 ,RGB_565 代表16位RGB位图。有没有可能是png输出为bitmap的过程中,有奇葩的策略调整config的值导致ALPHA通道遗失?于是一步步断点跟踪这块的代码,很遗憾没发现异常。

再看看第二个方向,我们review下加白色背景的代码(见上图),Paint设置了Xfermode。PorterDuff.Mode能设置canvas绘图时不同图层的混合方式,下图展示了不同的混合方式。我们处理是将图片bitmap叠加到白色背景上,这里SRC_OVER看上去也没问题。。。

啪啪啪打脸,看来不是怀疑的两个方向出了问题。于是病急乱投医把锅甩给了图片。。。。。

“会不会是png格式的问题,png某个参数导致转化过程中bitmap背景不同????”

在查阅资料、用工具分析对比了两张png图片的结构,欣喜得发现问题跟png格式并没有半毛钱关系。冷静下来,还是用老办法,一步一步跟代码!!!!

游戏图压缩后P2大于P1(是的你没看错,压缩后图片反而大,压缩步骤取bitmap,再绘制,最后质量压缩成jpeg),所以是拿原始图片当作大图P3去生成缩略图P4,原始图片有透明通道,所以对应的缩略图能加上白色背景;骰子图片压缩后发现比原图小,所以用压缩图P2当作大图P3去生成缩略图P4。P2是质量压缩png生成的jpeg,已经丢失透明通道,是一张黑色背景的图。即使在P4加上白色背景也被上层图层覆盖,我们看到的就是黑色骰子缩略图。

我之前分析的过程中忽略了压缩原始图片生成P2这一步。一叶障目,理清了思路,问题就显而易见了!

三、黑白分明,搞清楚所有情况下的表现

既然理清了流程,那就把所有情况下的表现分析下吧。我们看看勾选原图下的表现。

这里很好理解,骰子图勾选原图后,是把原始图片生成缩略图P4,原始图有透明通道,所以生成的缩略图也有白色背景。

如果是PC发送PNG图片,客户端去接收消息下载图片呢?PC端发送图片不存在是否勾选原图的概念,也不存在压缩的概念(耿直boy)。客户端接收方会去下载PC端发送的图片P5和架平生成的缩略图P7。

四、黑白闪变是什么鬼!

这时我在回归过程中又发现了一起不寻常的现象。客户端发送游戏图后,接收端收到图片,在AIO中的缩略图会有一个由黑变白的过程。呵呵,兵来将挡,bug来我解。又滚去熟悉了下接收端的逻辑。

发送的这张游戏图是由透明通道的,架平并没有为有透明通道的图片添加白色背景的策略,所以接收端下载的是一张黑色背景的架平缩略图。

这里要提到手q的预下载策略。用户可能会去点开大图,如果点击时再去下载,转菊花的过程体验很差,所以手q会综合网络情况、当前已用流量等维度去判断是否需要提前帮用户下载大图。图中图片消息命中了预下载策略,手q帮用户提前下载好了大图。

这时候问了,大图明明是黑色背景,为什么AIO中会闪变成白色?哈哈哈,这里又是手q人性化的一点,由于下载好了大图,为了让用户在AIO中可以直接可以看到比较清晰的缩略图,手q不信任架平生成的缩略图,用已经下载的大图在本地生成了相对高清的缩略图。

而下载的大图是有透明通道的png,根据前面已经提到的产品策略,我们会给本地生成的缩略图加上白色背景,所以出现了闪变~

五、总结

全文告一段落,在跟进问题的过程中,又完整的走了一遍手Q的图片发送流程。

除了提高对业务的熟悉程度之外,不禁感慨,前辈们为图片发送展示流程做了数不清的优化项,前人栽树后人乘凉,由衷的钦佩!

阅读推荐

一站式满足电商节云计算需求的秘诀
Web 前端性能优化 : 如何有效提升静态文件的加载速度
使用 Skeleton Screen 提升用户感知体验


此文已由作者授权腾讯云技术社区发布,转载请注明文章出处
原文链接:https://cloud.tencent.com/community/article/602504

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

白夜追凶 :手 Q 图片的显示和发送逻辑 的相关文章

随机推荐

  • C语言-函数栈帧(每次调用函数,开辟函数的大概流程)

    思路 emm 有点懵 这一块 只知道个大概 如果后期我深挖的话 我再回头来补充 上图 括号的位置 便是每次创建 调用函数的时候 所产生的函数栈帧 也可以理解为每次调用函数 在电脑里开辟的一块空间 这空间实际就是一个栈 ebp栈底指针 esp
  • Ubuntu14.04 安装搜狗输入法

    Ubuntu14 04 安装搜狗输入法 一 安装fcitx 1 点击System Settings 2 选择Software Updates 3 点击Other Software 4 添加软件源 ppa fcitx team nightly
  • wpf 读取网络图片

    wpf读取网络图片 private void ViewImage string fileUri BitmapImage bitImage new BitmapImage bitImage BeginInit bitImage UriSour
  • 域名解析的过程

    互联网的域名解析不是靠一个DNS服务器完成的 而是分到多个DNS服务器上的 那么怎么分 net com edu 根 分别对应自己的服务器 根这个服务器虽然不负责具体的层级域名的解析 但是他知道 net com edu等是由哪些服务器解析的
  • 使用Visual Studio Team Explorer管理项目源代码

    最近参与了WPMind站长张欣发起的一个WP7开源项目 其中用到了Visual Studio Team Explorer进行源代码管理 以下是使用Visual Studio Team Explorer管理Codeplex上源代码的一些说明
  • 使用nginx部署项目

    开发工具 VScode 项目上线 部署项目 1 确保自己的代码是最新的 1 提交代码 git add git commit m 备注 git push git merge 分支名 git pull 2 确认是最新代码 2 VScode 1
  • python中遇见module ‘random‘ has no attribute ‘seed‘原因

    是因为我设置 py文件名为random与这个模块好像冲突 具体啥原因我也解释不清楚 修改文件名就可以了 import random random seed 10 print random random print random random
  • React生命周期

    React生命周期 4个阶段 1 挂载卸载过程 初始化 2 更新过程 3 销毁阶段 4 错误处理阶段 挂载卸载过程 构建并插入真实DOM 1 1 constructor 1 2 componentWillMount 1 3 render 1
  • 悟道·天鹰 Aquila + 天秤 FlagEval,打造大模型能力与评测标准双标杆

    为推动大模型在产业落地和技术创新 智源研究院发布 开源商用许可语言大模型系列 开放评测平台 2 大重磅成果 打造 大模型进化流水线 持续迭代 持续开源开放 01 悟道 天鹰 Aquila 开源商用许可语言大模型系列 悟道 天鹰 Aquila
  • 如祺出行冲刺自动驾驶商业化,人少的地方机会多?

    网约车 正在迎来让人 不明觉厉 的新一轮竞赛 网约车监管信息交互系统的数据显示 截至今年6月30日 全国共有318家网约车平台公司取得网约车平台经营许可 环比增加5家 网约车监管信息交互系统6月份共收到订单信息7 63亿单 环比上升3 7
  • 华为三层交换机 配置

    1 拓扑图 2 汇聚层交换机设置
  • 第十四篇 Inception V3——论文翻译

    文章目录 摘要 1 引言 2 通用设计原则 3 基于大滤波器尺寸分解卷积 3 1 分解到更小的卷积 3 2 空间分解为不对称卷积 4 利用辅助分类器 5 有效的网格尺寸减少 6 Inception v2 7 通过标签平滑进行模型正则化 8
  • 【PAT乙级】旧键盘打字

    题目描述 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中对应英文字母的坏键以大
  • C# System.UnauthorizedAccessException:“对路径“C:\xxx”的访问被拒绝。

    C 程序运行时提示 对路径 C xxx 的访问被拒绝 System UnauthorizedAccessException 对路径 C Excel2007 xlsx 的访问被拒绝 解决办法是 启动visual studio时选择右键 gt
  • System.in.read()问题

    来源 http zhidao baidu com question 74164319 Q System in read 中in是一个字段即静态常量 JAVA帮助文档中 public static final InputStream in 那
  • MAC地址介绍及相关操作

    一 MAC地址介绍 MAC地址简介 MAC Mediun access cntrol 地址 用来表示互联网每一个站点的标识符 采用十六进制数表示 共六个字节 其中 前三个字节是由IEEE的注册管理机构RA负责给不同厂家分配的代码 也称为 编
  • ArcGIS 10.8打开后显示loading document后闪退

    安装ArcGis完成后 打开ArcMap 卡在Loading Document后 闪退的问题 为何为肖的博客 CSDN博客 arcmap加载文档后闪退b同事新装ArcGis10 5后出现这个情况 联想以前编译Qgis时python环境变量的
  • 由一个例子,介绍linux目录的多用户及其读写可执行权限

    例子 查看文件的读写权限以及所属用户 查看目录的读写权限以及所属用户 目录读写权限默认为755即rwxr xr x 文件读写权限默认为744即rwxrr 目录和子目录的读写权限特点 例子 ls ld home1 drwxrwxrwx 39
  • 模板小程序是什么?怎么选择?

    模板小程序是指第三方服务商基于某个模板开发的小程序 这个模板可以根据开发者的需求进行定制 包括页面设计 功能模块 数据管理等方面 开发者可以在模板基础上进行自主开发 实现自己的需求和功能 模板小程序的优点是开发周期短 价格相对较低 一般是直
  • 白夜追凶 :手 Q 图片的显示和发送逻辑

    欢迎大家前往腾讯云社区 获取更多腾讯海量技术实践干货哦 作者 陈舜尧 导语 这张图片在快捷发图栏背景是黑色的 为啥发到AIO 会话窗口 里背景就变成白的了 通过一个bug单 对黑白背景问题跟进的过程中发现了手q中很多奇怪的表现 一层层看代码