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

作者:陈舜尧

导语: “这张图片在快捷发图栏背景是黑色的,为啥发到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

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

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

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:陈舜尧 导语: "这张图片在快捷发图栏背景是黑色的,为啥发到AIO(会话窗口)里背景就变成白的了?" 通过一个bug ...

  2. qt客户端显示服务器发送的图片,qt客户端显示服务器发送的图片

    qt客户端显示服务器发送的图片 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. ...

  3. OpenCV显示MNIST中的手写图片

    <OpenCV系列教程> 项目位置:OpenCV-Sample 代码位置:26-ShowMnist.py 在学习手写图片识别的时候,总想看看那些训练图片什么样子,这个demo就是显示里面的 ...

  4. 解决别人在收到我们发送的*.md文档时,图片无法显示的问题。

    原因:         .word格式其实是一个压缩包,把图片也放在里面了,所以我们在收到word文件后,可以正常查看其中的图片. 但是.md格式不同,一般的,我们需要同时传输.md文档和图片,或者他 ...

  5. 完美世界手游不显示新服务器,完美世界手游手Q互通-黑曜开服时间表_完美世界手游新区开服预告_第一手游网手游开服表...

    2019-12-27 10:00 微信互通-赤炼 已经开服 10:00 手Q互通-仙志 已经开服 2019-12-13 10:00 微信互通-金武 已经开服 10:00 手Q互通-黑曜 已经开服 20 ...

  6. 诛仙服务器显示横线,诛仙手游聊天颜色字体代码发送带颜色的字

    诛仙手游聊天颜色字体代码发送带颜色的字,玩家们在游戏中聊天看到很多玩家都用带颜色字体聊天,这不是VIP特权是玩家用颜色代码聊天发送,输入喜欢颜色代码加上聊天内容就可以发送了.世界上突然出现了一堆五颜六 ...

  7. 计算机可移动磁盘无法显示图片,手机插电脑不显示可移动磁盘的详细解决方法...

    有时候因为某些原因,我们需要将手机上的文件转移到电脑上,但是在操作的过程中,却遇到了手机插电脑不显示可移动磁盘的情况,不知道如何处理很是苦恼.所以针对这一问题,今天本文为大家整理的就是关于手机插电脑不 ...

  8. 从技术角度谈一谈,我参与设计开发的手Q春节红包项目--转

    原文地址:http://chuansong.me/n/1608115051125 作者|吴逸翔编辑|唐聪 今年春节期间,QQ以AR技术为支撑.娱乐体验为导向在春节期间推出系列红包并成功刷屏,系列红包包 ...

  9. 研发手Q推广遇到的一系列问题

    第一次做和手Q对接的项目,虽然只是做一个静态页面,但是遇到的问题无数,分享出来,做个记录. 项目需求,做一个静态页面,为APP导流,要求记录QQ号,为后续分析准备,页面访问量使用MTA统计,页面要能够 ...

最新文章

  1. 【转载】pycharm远程调试配置
  2. HttpClient post 与get
  3. Git 进阶之底层相关
  4. 任务中断间的同步与通信概述
  5. Django从理论到实战(part55)--将网站上传到GitHub
  6. a76比a73强多少_arm的a73和a72同上10nm,谁强?
  7. Linux 6.8 源码安装MySQL8.0
  8. C#LeetCode刷题之#404-左叶子之和​​​​​​​​​​​​​​(Sum of Left Leaves)
  9. 判别式模型和生成式模型的区别(discriminative model and generative model)
  10. 【汇编语言】通用数据处理指令——位操作类指令
  11. 今天就来分享一招坐着减肥法~ 办公室“久坐族”也同样适用
  12. 函数式语言(functional language)的相关了解
  13. 宿主机进程挂载到容器内_微服务架构之 容器技术
  14. linux双核cpu调试软死锁问题,记一次linux通过jstack定位CPU使用过高问题或排查线上死锁问题...
  15. 08.音频系统:第004课_Android音频系统详解:第001节_分析思路
  16. C盘爆红,一个操作将微信缓存踢走
  17. 机房布线的最高境界 | 最后的暗黑系,真是亮瞎眼
  18. pdf转图片,pdf转高清图片方法
  19. android中的尺寸单位是什么,Android中各种长度尺寸单位(dp,dip,px,sp,pt)的区别
  20. 基于PHP的客户分销商管理系统

热门文章

  1. c语言实现图书借阅系统
  2. 科创板拟上市企业申联生物和传音控股已提交注册
  3. 2021 年,中台的“瓜”你还吃吗?
  4. 如何快速解决 Mybatis 异常:Invalid bound statement (not found)
  5. (筆記) 如何在字串中從指定字元抓到指定字元? (C/C++) (C)
  6. 2011 imac 固态_iMac (21.5 英寸, 2011 年中) - 技术规格
  7. 灰度图转热力图_热力图下看区域城市密集度,密集度较高的主要在沿海和省会周边...
  8. Spring data报错:Inferred type 'S' for type parameter 'S' is not within its bound;
  9. STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏
  10. LibJpeg的安装与修复颜色错误图像错位保姆级教程