MMX:褪色两个图像结果

Posted

技术标签:

【中文标题】MMX:褪色两个图像结果【英文标题】:MMX: fading two images result 【发布时间】:2015-11-26 15:28:07 【问题描述】:

我试图淡化两个图像,结果不是预期的(之前用 C 代码做过)。 这是 MMX 代码:

void fadeMMX(ImagenBMP *imagen1, ImagenBMP *imagen2, int f) 
double *puntero1;
double *puntero2;
int valor = (int)f*255;
for (int i=0; i <imagen1->tamanyo; i+=4) //De 4 en 4, ya que leemos 4 pixels cada vez
        
            puntero1 = (double*) &imagen1->datos[i];
            puntero2 = (double*) &imagen2->datos[i];
            _asm
                /*Guardar Imagenes*/
                /*Imagen A*/
                mov esi, puntero1[0]//imagen 1, leer
                mov edi, puntero1[0]//imagen 1, guardar
                movq mm1, [esi] //guardamos A (32 bits)
                punpcklbw mm2,mm1 //desempaquetamos A en mm2 
                /*Imagen B*/
                mov esi, puntero2[0]//imagen 2, leer
                movq mm3, [esi] //guardamos B (32 bits)
                punpcklbw mm4,mm3 //desempaquetamos B en mm4

                //Guardamos el valor
                movq mm0, valor     
                punpcklbw mm6,mm0 

                //Operaciones
                psubsw mm2,mm4  //restamos B a A y guardamos en A 
                pmulhw mm2, mm6 //multiplicamos A * F y guardamos en A, los bits mas significativos
                paddusw mm2, mm4 //sumamos lo que tenemos ahora en A mas lo que teniamos en B y guardamos en A

                /*Empaquetar*/
                packsswb mm5, mm2 //empaquetamos en mm5 - saturacion con signo
                movd [edi], mm5 //guardamos en memoria el nuevo valor
            
 //end for
_asm
                
                    emms //Finalizar utilización de registros MMX   
                ; //end fadeMMX

Resulting image of fadeMMX with f = 100

Expected image

【问题讨论】:

您选择为此使用 MMX 和程序集的任何特殊原因?使用内在函数的 SSE 实现会更容易编码,并且可能会使运行时间加快 2 倍。 这是一个学校项目的练习,下面的练习是用SSE做的,你能给我一些建议吗? @PaulR 对于 SSE 实现,我绝对推荐使用内在函数而不是原始程序集。除此之外,它可能与您的 MMX 方法非常相似,预计每次循环迭代您将处理两倍的像素。查看 *** 上 sse 标签中的一些问题和答案,以获得有用的想法。 【参考方案1】:

我刚刚找到了“答案”:我忘了添加这一行

mov edi, puntero2[0]//imagen 2, guardar

将第二张图片保存到指针中。

【讨论】:

以上是关于MMX:褪色两个图像结果的主要内容,如果未能解决你的问题,请参考以下文章

带有淡入淡出边框的清晰图像

MMX 符号扩展

根据灰度动态范围将图像分类为褪色或不褪色?

IE 褪色导致图像出现白点

scss 懒惰褪色光滑滑块背景图像

基本JavaScript图像褪色