我这有一段图象拉伸的代码能实现横向拉伸(可以将图片的下方拉大),那位高手能读懂这一段代码,我想纵向拉伸(将图片的左方拉大)该怎样实现。有兴趣者可以发短信和mail给我([email protected]).

解决方案 »

  1.   

    pDC->StretchBlt(int x,int y, int Width,int nHeight,CDC *pDC, int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop)
    你也可以查一下《Visual c++ 数字图像处理》人民邮电出的。
      

  2.   

    用StrectchBlt等API函数都有很严重的失真,我是用了一个算法实现的。
      

  3.   

    [email protected]
    我也相看看啊。不明白横向拉伸是怎么改变高度的。
      

  4.   

    lqs10您能将您的算法代码让小弟看看吗??
      

  5.   

    IPicture->Render
    我的项目里面我用了这个接口,除了速度略微慢点,缩放效果还可以阿。
      

  6.   

    头文件thum_inc.h#ifndef __THUM_INC__
    #define __THUM_INC__// Alpha表尺寸
    #define _IRWE_THUM_APLHATAB_SIZE 129
    // 四字类型对定义
    typedef __int64 QWORD;
    void _Thum_InitAlphaTable();
    void _Thum_BlitStretch(DWORD **lpDesLines, int deswidth, int desheight, 
    DWORD **lpSrcLines, int srcwidth, int srcheight);
    void _Thum_DrawScanLine(DWORD* DestAddr, DWORD* SrcAddr, int Width, DWORD dU);
    void _Thum_DrawScanLineAlpha(DWORD* DestAddr, DWORD* SrcAddr, 
    int Width, DWORD dU, DWORD Alpha);#endif //__THUM_INC__源文件static QWORD s_AlphaTable[_IRWE_THUM_APLHATAB_SIZE];
    // 初始化Alpha表(此函数应该在主程序初始化时就调用)
    void _Thum_InitAlphaTable()
    {
    QWORD temp; for(int i=0;i<_IRWE_THUM_APLHATAB_SIZE;i++)
    {
    temp = (QWORD)i;
    s_AlphaTable[i] = temp<<48 | temp<<32 | temp<<16 | temp;
    }
    }
    // 图像缩放函数(这是该模块唯一的对外接口)
    // 注:本模块只适用于32位DIB位格式。
    void _Thum_BlitStretch(
    DWORD **lpDesLines, // 目标图像缓冲区行地址数组(数组中每个元素的值都是对应图像扫描行的首地址)
    int deswidth, // 目标图像宽度(以象素为单位)
    int desheight, // 目标图像高度(以象素为单位)
    DWORD **lpSrcLines, // 源图像缓冲区行地址数组(数组中每个元素的值都是对应图像扫描行的首地址)
    int srcwidth, // 源图像宽度(以象素为单位)
    int srcheight // 源图像高度(以象素为单位)
    )
    {
    DWORD dU = (srcwidth << 16) / deswidth;
    DWORD dV = (srcheight << 16) / desheight;
    DWORD V1 = 0; for(int i = 0; i < desheight-1; i++)
    {
    _Thum_DrawScanLine((DWORD*)(lpDesLines[i]), (DWORD *)(lpSrcLines[(V1>>16)]), deswidth, dU);
    _Thum_DrawScanLineAlpha((DWORD*)(lpDesLines[i]), (DWORD *)(lpSrcLines[(V1>>16)+1]), deswidth, dU, (V1>>9)&0x7f);
    V1 += dV;
    }
    }
    // 行缩放函数(内部函数)
    void _Thum_DrawScanLine(DWORD* DestAddr, DWORD* SrcAddr, int Width, DWORD dU)
    {
    __asm{
    mov esi, SrcAddr;
    mov edi, DestAddr;
    mov ecx, Width;
    xor edx, edx;  //edx = U1
    mov ebx, dU;
    pxor mm7, mm7; LoopX:
    mov eax, edx;
    and eax, 0xffff;
    shr eax, 9;
    movq mm6, [s_AlphaTable + eax * 8]; //mm6 = a2
    neg eax;
    add eax, 128;
    movq mm5, [s_AlphaTable + eax * 8]; //mm5 = a1 mov eax, edx;
    shr eax, 16;
    movq mm0, [esi + eax * 4];
    movq mm1, mm0;
    PUNPCKLBW mm0, mm7;  //mm0 = 0a10r10g10b1
    PUNPCKHBW mm1, mm7;  //mm1 = 0a20r20g20b2 pmullw mm0, mm5;
    pmullw mm1, mm6;
    paddw  mm0, mm1;
    psrlw  mm0, 7;
    packuswb mm0, mm0;
    movd eax, mm0;
    add edx, ebx;
    stosd; dec ecx;
    jnz LoopX;
    emms;
    }
    }void _Thum_DrawScanLineAlpha(DWORD* DestAddr, DWORD* SrcAddr, int Width, DWORD dU, DWORD Alpha)
    {
    if(!Alpha)
    return; __asm{
    mov esi, SrcAddr;
    mov edi, DestAddr;
    mov ecx, Width;
    xor edx, edx;  //edx = U1
    mov ebx, dU;
    mov eax, Alpha;
    pxor mm7, mm7;
    movq mm4, [s_AlphaTable + eax * 8]; //mm4 = alpha LoopX:
    mov eax, edx;
    and eax, 0xffff;
    shr eax, 9;
    movq mm6, [s_AlphaTable + eax * 8]; //mm6 = a2
    neg eax;
    add eax, 128;
    movq mm5, [s_AlphaTable + eax * 8]; //mm5 = a1 mov eax, edx;
    shr eax, 16;
    movq mm0, [esi + eax * 4];
    movq mm1, mm0;
    PUNPCKLBW mm0, mm7;  //mm0 = 0a10r10g10b1
    movd mm2, [edi];
    PUNPCKHBW mm1, mm7;  //mm1 = 0a20r20g20b2 pmullw mm0, mm5;
    punpcklbw mm2, mm7;
    pmullw mm1, mm6;
    paddw  mm0, mm1;
    psrlw  mm0, 7; psubw mm0, mm2;
    pmullw mm0, mm4;
    psraw  mm0, 7;
    paddw  mm0, mm2; packuswb mm0, mm0;
    movd eax, mm0;
    add edx, ebx;
    stosd; dec ecx;
    jnz LoopX;
    emms;
    }
    }
      

  7.   

    楼上的,你的代码不错,不知道有没有像这样封装好的,处理alpha混合,透明色处理的汇编代码?看你的程序,应该是一个类库里出来的八^_^
      

  8.   

    我研究过啊,我改写了Intel网站上的alpha汇编代码,但是颜色支持的限制去不掉我希望支持8位色-32位色,并且封装为函数,用asm文件链接不太方便,而且函数不能加到vc左边的treelist。
    如果你有,就发一份给我吧,共享一下不好吗?