受UWA这篇文章的启发,我们老大也安排我对原来TrueColor32bit的UI图集进行一次优化。前期准备工作主要是了解了下Floyd的Dither算法,然后继续研究的时候发现大部分UI图片的Dither+A8的效果和ETC1+A8的效果很接近,如下图。ETC也是有损压缩,它的压缩倍率更高(6倍),为什么能和压缩倍率是(1.5倍)的Dither565效果持平呢。所以我又去了解下了ETC1的原理,特作一篇笔记。另外感谢这篇文章,写得很棒。

UI图集压缩优化,以及对Dither和ETC1算法的深入了解-1.jpg (69.84 KB, 下载次数: 3)

2018-3-25 23:15 上传

一、Floyd-Steinberg Dither算法

将24bit的图片转化成16bit过程中因为精度丢失,产生明显的色阶。而抖动算法,则是把这部分丢失的精度,扩散到周围,使得颜色整体更正确。

丢失的精度,我们将它想象为图片上的一些颜料粉末,抖动算法即是将这些粉末朝着某个方向抖动。

[code][/code]这是Floyd-Steinberg抖动算法的Unity中的实现版本,这个算法我把他分为两步。

UI图集压缩优化,以及对Dither和ETC1算法的深入了解-2.jpg (4.83 KB, 下载次数: 1)

2018-3-25 23:15 上传

把当前位置的像素从RGB8888转化为RGB4444,并把最后的浮点数相减得到丢失的精度。  把丢失的精度按照上面的对照图,按比例叠加到周围的像素中。

二、ETC1算法

ETC1将图片分为4x4的块来压缩,由4x4x24=384bit压缩为64bit,压缩倍率为6。 我们先看一下压缩后的64bit是如何表示,如何解码的。以下是一个4x4块的数据:

UI图集压缩优化,以及对Dither和ETC1算法的深入了解-3.jpg (86 KB, 下载次数: 0)

2018-3-25 23:15 上传

1. ETC64bit内存布局

ETC1算法将4x4的块划分为2个4x2的子块(subblock)。

用0-31位储存了4x4=16个像素的亮度修正下标,其中0-15位表示该下标的低位,16-31表示该下标的高位。32位(flipbit)表示横分或者竖分。0为竖分,1为横分。  33位(diffbit)表示如何表示两个字块的颜色均值,0为individual模式(RGB444/RGB444),1位differential模式(RGB555/RGB333)。  34-36位储存子块2的亮度修正表索引    37-39位储存子块1的亮度修正表索引  40-63位按照B2->B1->G2->G1->R2->R1的顺序来储存两个色块的平均颜色值。如果是differential模式,则按照3-5-3-5-3-5一共24位的方式划分。2. 像素索引

横分

---- ---- ---- ---

|0   |4   |8   |12  |

|1   |5   |9   |13  |

---- ---- ---- ----

|2   |6   |10 |14  |

|3   |7   |11 |15  |

---- ---- ---- ----

2. 亮度修正映射表

UI图集压缩优化,以及对Dither和ETC1算法的深入了解-4.jpg (46.46 KB, 下载次数: 0)

2018-3-25 23:15 上传

3. 解码示例

32位表示该4x4的色块横分为2个4x2的子块33位表示子块的平均颜色值储存为RGB555(子块1),RGB333(子块2)。34-36位表示子块2的亮度修正索引为110=6,查表得到修正映射表[-106, -33, 33, 106]。37-39位表示子块1的亮度修正索引为010=2,查表得到修正映射表[-29, -9, 9, 29]。40-42位G2=000=0,43-47位G1=00011=3,48-50位B2=010=2,51-55位B1=00100=4,56-58位R2=100=-4,59-63位R1=11100=28。RGB1=(28, 4, 3),RGB2=(-4, 2, 0)。Individual模式下,将4bit复制到末尾,扩充为8bit,得到子块的基础颜色。Differential模式下,将5bit的高3位复制到末尾,扩充为8bit。将3bit和对应的5bit相加转为5bit,然后再用一样的方式扩充为8bit。3bit中最高位为符号位,所以3bit的取值范围为[-4, 3]。例如R1=28=11100=111001110 00010 00001 1110=198。所以RGB2=(-4, 2, 0)=(28-4, 4+2, 3+0)=(11000, 00110, 00011)->(1100 00011 00001 1RGB1(231, 33, 24)、RGB2(198, 49, 24)为两个色块的基础颜色,然后每个像素点从0-15位和16-31位中分别取得修正映射表的下标的低位(lsb)和高位(msb)。比如第一个像素对应0bit和16bit=00,得到修正映射表的下标a。然后用这个下标去第三步和第四步的修正映射表中找到修正值,即映射表[-29, -9, 9, 29]中的9。所以第一个像素点的颜色值叠加为(231+9, 33+9, 24+9)=(240, 42, 33),修正到[0, 255]区间,其他的像素点同理修正。最后得到16个RGB24的颜色值,解码完成。4. 编码过程

将图划分为4x4的子块,如果不够4x4,则将这些像素填充在4x4块的左上角。每个子块尝试以下编码,取解码后和原像素,差值最小的那种编码。是否flip,flip确定以后就能知道两个子块的平均颜色值。如果两个子块的平均颜色值非常接近,则diffbit=1。每个子块使用哪一个修正映射表每个像素使用映射表中的哪个值合并所有子块编码三、总结

虽然了解了这些算法,并没有解决掉实际问题,我们还是决定使用Dither+A8的压缩格式。但是知也无涯,学习的过程就是一种修行。

etc的常见算法_UI图集压缩优化,以及对Dither和ETC1算法的深入了解相关推荐

  1. 基于LZ77算法的文件压缩

    基于Huffman算法和LZ77算法的文件压缩(五) 基于Huffman算法和LZ77算法的文件压缩(四)已经讲解LZ77算法到基本原理和压缩过程. 本文详细讲解文件压缩过程当中的问题 一.文件压缩的 ...

  2. 【优化求解】基于粒子群算法求解多目标优化问题matlab源码

    [优化求解]基于粒子群算法求解多目标优化问题matlab源码 1 算法介绍 1.1 关于速度和位置 粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快 ...

  3. 使用蜂虎狩猎(BEH)算法进行单目标优化问题的求解

    使用蜂虎狩猎(BEH)算法进行单目标优化问题的求解 蜂虎狩猎算法是基于蜜蜂生长和繁殖.虎群狩猎行为等自然现象而形成的一种启发式优化算法.它是一种群体智能算法,可以应用于单目标优化问题的求解. 以下是使 ...

  4. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  5. matlab采用粒子群优化算法求解含压缩储能设备的综合能源系统运行优化

    matlab采用粒子群优化算法求解含压缩储能设备的综合能源系统运行优化. 结果包含储能设备24时出力,内燃机发电和发热出力,电制冷机出力等. 代码包含相关注释,方便对算法进行改进. 附相关参考文献. ...

  6. matlab meas 函数_L1_homotopy_v2.0 这厮压缩感知恢复算法中L1同伦优化的 matlab 238万源代码下载- www.pudn.com...

    文件名称: L1_homotopy_v2.0下载 收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 975 KB 上传时间: 2015-04-17 下载次数: 4 提 ...

  7. 【学习笔记】【算法】【智能优化】粒子群优化(PSO)

    [学习笔记][算法][智能优化]粒子群优化(PSO) 文章目录 [学习笔记][算法][智能优化]粒子群优化(PSO) 1 算法背景 1.1 背景 1.2 基础知识 2 算法原理 2.1 基本原理 2. ...

  8. Android性能优化之图片压缩优化

    1 分类 Android图片压缩结合多种压缩方式,常用的有尺寸压缩.质量压缩.采样率压缩以及通过JNI调用libjpeg库来进行压缩. 参考此方法:Android-BitherCompress 备注: ...

  9. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  10. Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型

    Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型 原文:https://blog.csdn.net/u011808673/article/details/8079 ...

最新文章

  1. 三、MySql查询语句执行的特征
  2. 把技术卖给不懂技术的人
  3. linux封装函数,libc库和封装函数 | 求索阁
  4. 在 Ubuntu 16.04 LTS 上安装 Python 3.6.0
  5. 初识Mysql(part7)--我需要知道的5个关于正则的小知识
  6. python编程软件排行榜_Python编程开发工具:这10个对Web开发者最有用的Python包
  7. 类与对象的定义与使用小结 1114
  8. Python+matplotlib绘制动态更新的柱状图
  9. 那年学过的web后端笔记
  10. manage.py和simplejson调用报错解决
  11. 最近任务 react文章列表
  12. LIO-SAM探秘第三章之代码解析(二) --- featureExtraction.cpp
  13. 【单目标优化求解】基于matlab水循环算法求解约束优化问题【含Matlab源码 1428期】
  14. 酷信即时通讯源码,视酷即时通讯的升级版,性能高2-5倍,高性能企业即时通讯产品
  15. 2021-05-19 C语言逻辑取反! 学习
  16. 阿里云服务器选购之国际版和国内版的平台对比及建议
  17. 怎么查看自己本地的ip地址
  18. OSChina 周三乱弹 —— 无他,唯眼熟尔
  19. 基于核的黎曼编码和字典学习
  20. 英文词典中的那些词性缩写字母的原型

热门文章

  1. 让Win7系统下的硬盘不在狂闪的诀窍【mfxp】
  2. 时序分析 19 VAR(Vector Autoregression) 向量自回归
  3. 经典语录大全微信小程序源码下载多种分类语录
  4. 2018电大计算机操作题怎么评分,2018年度电大专科计算机应用基础学习知识win7系统上机操作技巧题操作技巧.doc...
  5. Hive 2.3.4 Name node is in safe mode. The reported blocks xxx has reached the threshold 0.9990 of to
  6. 【noi.ac】#283. 唐时月夜
  7. Android各种屏幕尺寸
  8. 百度找不到服务器是怎么回事,百度搜索不能用了
  9. 《葬花吟》笛箫简谱-红楼梦主题曲
  10. ubuntu看不了bilibili视频