C#基于MMX指令集的程序设计简介之三(转)

本文介绍了一个使用MMX技术处理32位RGB图像的演示项目,实现了图像颜色反相和颜色平衡调整功能。此外,还探讨了SSE2技术在提高图像处理效率方面的优势,并提供了具体的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MMX32 演示项目

MMX32项目可对32位象素的RGB图象进行处理。进行的图象处理工作是图象颜色反相操作和更改图象颜色的平衡度(将象素点的每一种颜色乘以一定的值)操作。

MMX的乘法实现起来比加减法复杂得多,因为乘法运算通常得出的结果的位数不再是以前位数的大小。比如,如果乘法的操作数有一个字节(8位的BYTE)大小,那么结果会达到一个字(16位的WORD)大小。这需要额外的转换,并且使用MMX汇编指令和C++代码进行图象转换花费时间的差别不是很大(时间差为5-10%)。

用Visual C++.NET的MMX指令函数实现的更改图象颜色平衡度的函数:

void CImg32Operations::ColorsC_MMX(
BYTE* pSource,
BYTE* pDest,
int nNumberOfPixels,
float fRedCoefficient,
float fGreenCoefficient,
float fBlueCoefficient)
{
int nRed = (int)(fRedCoefficient * 256.0f);
int nGreen = (int)(fGreenCoefficient * 256.0f);
int nBlue = (int)(fBlueCoefficient * 256.0f);

// 设置相乘系数
__int64 c = 0;
c = nRed;
c = c << 16;
c |= nGreen;
c = c << 16;
c |= nBlue;

__m64 nNull = _m_from_int(0); // null
__m64 tmp = _m_from_int(0); // 临时工作临时变量初始化

_mm_empty(); // 清空MMX寄存器。

__m64 nCoeff = Get_m64(c);

DWORD* pIn = (DWORD*) pSource; // 输入双字数组
DWORD* pOut = (DWORD*) pDest; // 输出双字数组

for ( int i = 0; i < nNumberOfPixels; i++ )
{
tmp = _m_from_int(*pIn); // tmp = *pIn (在tmp的低32位写入数据)

tmp = _mm_unpacklo_pi8(tmp, nNull ); //将tmp中低位的4个字节转化为字
//字的高位用nNull中对应位上的位值填充。

tmp = _mm_mullo_pi16 (tmp , nCoeff); //将tmp中的每一个字相乘,将相乘结果的高位送到nCoeff,在tmp中只保留每个结果的低位。

tmp = _mm_srli_pi16 (tmp , 8); // 将tmp中的每一个字右移8位,相当于除以256

tmp = _mm_packs_pu16 (tmp, nNull); // 使用饱和模式将tmp中的结果做如下处理:
//将tmp中的4个字转化为4个字节,并将这4个字节写到tmp中的低32位中
// 同时,将nNull中的4个字转化为4个字节,并将这4个字节写到tmp的高32位中。

*pOut = _m_to_int(tmp); // *pOut = tmp (将tmp低32位的数据放入pOut数组中)

pIn++;
pOut++;

}

_mm_empty();
}

你可以参看示例项目的源代码了解有关此项目的更多的细节。

SSE2 技术

SSE2技术包含有一个类似MMX中对整数操作的指令集,同时也包含128位的SSE寄存器组。比如,用SSE2技术实现更改图象颜色平衡度能够比用纯C++代码实现此功能在效率上有很大提升。SSE2同时是SSE技术的扩展,比如它不仅可以单精度浮点数数组,而且能够处理双精度浮点数数据类型的数组。用C++实现的MMXSwarm 示例项目不仅使用了MMX指令函数,而且使用了SSE2指令对整型数操作的函数。

参考文档:

[1] Intel软件说明书(Intel Software manuals): http://developer.intel.com/design/archives/processors/mmx/index.htm

[2] MSDN中有关MMX技术的主题: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vcrefsupportformmxtechnology.asp

[3] Microsoft Visual C++ CPUID项目示例: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/vcsamcpuiddeterminecpucapabilities.asp

[4] Microsoft Visual C++ MMXSwarm项目示例:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/vcsamMMXSwarmSampleDemonstratesCImageVisualCsMMXSupport.asp。

[5]
Matt Pietrek在Microsoft Systems Journal 1998年2月刊上的评论文章:
http://www.microsoft.com/msj/0298/hood0298.aspx 。[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8781179/viewspace-924613/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8781179/viewspace-924613/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值