博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
rgb565格式 alpha混合算法优化
阅读量:5248 次
发布时间:2019-06-14

本文共 1382 字,大约阅读时间需要 4 分钟。

原始的算法:

因为调用频繁,所以采用宏或内联函数方式实现。

#define RGB565_ALPHA_CONVERSION( d, s, alpha)     \

{             \
  unsigned int sr = (s) & 0xF800;             \
  unsigned int sg = (s) & 0x07E0;             \
  unsigned int sb = (s) & 0x001F;             \
  unsigned int dr = (d) & 0xF800;             \
  unsigned int dg = (d) & 0x07E0;             \
  unsigned int db = (d) & 0x001F;             \
  \
  dr += ((sr - dr) * (alpha)) >> 8;           \
  dg += ((sg - dg) * (alpha)) >> 8;           \
  db += ((sb - db) * (alpha)) >> 8;           \
  dr &= 0xF800;                               \
  dg &= 0x07E0;                               \
  db &= 0x001F;                               \
  d= dr | dg | db;       \
}

 

根据实际应用测试,图片中点的alpha为0 或255居多,所以先处理,性能有显著提高:

 

#define RGB565_ALPHA_CONVERSION( d, s, alpha)     \

{             \
 if(alpha==0)         \
 {            \
             \
 }else if(alpha == 255)       \
 {            \
  d = s;          \
 }else           \
 {            \
  unsigned int sr = (s) & 0xF800;             \
  unsigned int sg = (s) & 0x07E0;             \
  unsigned int sb = (s) & 0x001F;             \
  unsigned int dr = (d) & 0xF800;             \
  unsigned int dg = (d) & 0x07E0;             \
  unsigned int db = (d) & 0x001F;             \
  \
  dr += ((sr - dr) * (alpha)) >> 8;           \
  dg += ((sg - dg) * (alpha)) >> 8;           \
  db += ((sb - db) * (alpha)) >> 8;           \
  dr &= 0xF800;                               \
  dg &= 0x07E0;                               \
  db &= 0x001F;                               \
  d= dr | dg | db;       \
 }            \
}

 

再来:看以下代码:

TUint32 Fast_AlphaBlender(TUint32 x, TUint32 y, TUint32 Alpha)

{
 x = ( x | ( x<<16 ) ) & 0x7E0F81F;
 y = ( y | ( x<<16 ) ) & 0x7E0F81F;
 TUint32 result = ( ((x - y) * Alpha) >> 5 + y ) & 0x7E0F81F;
 return (TUint32)(result&0xFFFF) | (result>>16);
}

采用这个算法再加上用宏的形式并对0 255 单独处理,性能肯定会提高,不过我还没来得及测试,参考以下文档:

转载于:https://www.cnblogs.com/shinecolin/p/3285416.html

你可能感兴趣的文章
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
S5PV210根文件系统的制作(一)
查看>>
51NOD 1244 莫比乌斯函数之和
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
数据清洗
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
【转】代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
【SVM】libsvm-python
查看>>
C++循环单链表删除连续相邻重复值
查看>>
渣渣小本求职复习之路每天一博客系列——Java基础(3)
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
ASP.NET使网页弹出窗口不再困难
查看>>
Leetcode Balanced Binary Tree
查看>>
Leetcode 92. Reverse Linked List II
查看>>