图象拉伸问题,高手救命啊!!!给你我所有的分数。 我这有一段图象拉伸的代码能实现横向拉伸(可以将图片的下方拉大),那位高手能读懂这一段代码,我想纵向拉伸(将图片的左方拉大)该怎样实现。有兴趣者可以发短信和mail给我([email protected]). 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 pDC->StretchBlt(int x,int y, int Width,int nHeight,CDC *pDC, int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop)你也可以查一下《Visual c++ 数字图像处理》人民邮电出的。 用StrectchBlt等API函数都有很严重的失真,我是用了一个算法实现的。 [email protected]我也相看看啊。不明白横向拉伸是怎么改变高度的。 lqs10您能将您的算法代码让小弟看看吗?? IPicture->Render我的项目里面我用了这个接口,除了速度略微慢点,缩放效果还可以阿。 头文件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; }} 楼上的,你的代码不错,不知道有没有像这样封装好的,处理alpha混合,透明色处理的汇编代码?看你的程序,应该是一个类库里出来的八^_^ 我研究过啊,我改写了Intel网站上的alpha汇编代码,但是颜色支持的限制去不掉我希望支持8位色-32位色,并且封装为函数,用asm文件链接不太方便,而且函数不能加到vc左边的treelist。如果你有,就发一份给我吧,共享一下不好吗? 关于一个字符转换的简单问题 直线车道线检测 我真孤陋寡闻了= =!!! 设置对话框背景图片[好方法] win32 Dll ....为什么我在MFC中调win32 Dll 中的一个窗体 关闭后 客户窗体不能响应了 请关H2协议 此线程好奇怪的问题!!请进,在线等!小妹再此先谢过拉 如何在一个类中调用另一个类的公共函数 怎样得到TREE中当前所选种的那个ITEM的Text MFC多文档程序怎样实现如下的问题? 面对一个新的问题,比如让你用一个新的库,让你改编一个很难看懂的算法。大家是怎么做的呢,欢迎大家讨论。(怎样做效率最高) 关于Com编程中的#Import指令的使用
你也可以查一下《Visual c++ 数字图像处理》人民邮电出的。
我也相看看啊。不明白横向拉伸是怎么改变高度的。
我的项目里面我用了这个接口,除了速度略微慢点,缩放效果还可以阿。
#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;
}
}
如果你有,就发一份给我吧,共享一下不好吗?