★☆★☆★ 最快的图像平滑缩放程序写出来了(速度已超过Seedling(叶子)发给我的内嵌汇编的) ★☆★☆★

zyl910 2002-11-17 03:20:56
下载地址:http://www.dapha.net/vb/list.asp?id=1967




最快的图像平滑缩放程序


CPU:K6-2 350
操作系统:Windows 98 第二版 2222
速度测试情况(单位:秒):

┏━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┓
┃ 160*160┃最邻近插值│StretchBlt│双线内插值│三次卷积法┃
┣━━━━╋━━━━━┿━━━━━┿━━━━━┿━━━━━┫
┃我的程序┃  0.023 │  0.042 │  0.152 │  0.423 ┃
┠────╂─────┼─────┼─────┼─────┨
┃内嵌汇编┃  ×  │  ×  │  0.179 │  ×  ┃
┠────╂─────┼─────┼─────┼─────┨
┃书上示例┃  0.125 │  ×  │  0.400 │  1.035 ┃
┗━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┛

┏━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┓
┃ 640*480┃最邻近插值│StretchBlt│双线内插值│三次卷积法┃
┣━━━━╋━━━━━┿━━━━━┿━━━━━┿━━━━━┫
┃我的程序┃  0.219 │  0.380 │  1.461 │  3.827 ┃
┠────╂─────┼─────┼─────┼─────┨
┃内嵌汇编┃  ×  │  ×  │  1.610 │  ×  ┃
┠────╂─────┼─────┼─────┼─────┨
┃书上示例┃  1.190 │  ×  │  3.790 │  9.795 ┃
┗━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┛


内嵌汇编:Seedling(叶子)我的内嵌汇编缩放图片的,源程序在ASM目录下
书上示例:《Visual C++ 数字图像与图形处理》上的示例程序,源程序在VC目录下

----------------------------------------------------------

如果你觉得速度慢的话,那是因为:
一、别在VB开发环境下按F5运行,那是解释运行的。解释运行的程序能快吗?!请运行编译后的exe;
二、双线内插值、三次卷积法 都需要大量的运算。特别是三次卷积法:为了计算一个像素就得读取周边16个像素,每计算一个RGB分量的值就需要 两次 浮点矩阵乘法,即 计算一个像素 需要 六次 浮点矩阵乘法。
...全文
327 129 打赏 收藏 转发到动态 举报
写回复
用AI写文章
129 条回复
切换为时间正序
请发表友善的回复…
发表回复
win98ddk 2002-12-12
  • 打赏
  • 举报
回复
语言本身只是一个符号,并不代表什么,之所以有一个C语言,只不过是盖子想给大家留个纪念,我现在做的视频处理,界面用VB,核心用VC,特别的两个要求高速的,用了ASM。
因此说,算法才是最重要的,没有了好的算法,再厉害的ASM都是很慢的,什么,不信?那你可以先用一万个mov eax,0 然后再调用一个MessageBoxA看看,保证快不到哪里去。
shisanjin 2002-12-12
  • 打赏
  • 举报
回复
:>...
viperstorm 2002-12-10
  • 打赏
  • 举报
回复
不同意。你以为真的是你的C快吗?错了!是C的编译器好而已,没有其他值得你骄傲的了,从汇编学期的人都知道这个事实。
lanzhengpeng2 2002-12-06
  • 打赏
  • 举报
回复
不过,我可以放一点不相关的代码:
00000006 10001350 ?Convert@VPicture@@QAEXH@Z
void VPicture::Convert(int32 depth)
{
if(depth != GetDepth())
{
VPicture pic;
if(_Convert(pic,depth) == VP_OK)
Attach(pic);
}
}
victorycore.dll中的内存分配函数:
VFX_API void * _vfxMemoryNew(size_t size)
{
static __memory_init memory_init;

#ifdef _MT
auto_memory_lock lock;
#endif //end _MT

if(size > __max_bytes)
return large_alloc::getalloc().alloc(size);
else
return small_alloc::getalloc().alloc(size);
}

我觉得啊,代码是不是我写的是我的事,信不信是你的事。但是,证明了你的幼稚可笑才是我的目的,也是你难过和疑问的根源。
不过我还是那句话:我相信你是一个优秀的VB程序员。不过,你再优秀,你站的起点就低了。而且,最致命的错误是你的表现象井底之蛙——而我又特别喜欢拍这样的人。
呵呵
倒希望这个帖子成为精品帖。
lanzhengpeng2 2002-12-06
  • 打赏
  • 举报
回复
呵呵,源代码我是不能给你的。不过,缩放代码的位置你分析错了,是在victorycore.dll里实现的:
extern "C" __declspec(dllexport) DWORD ResizeTextureA8R8G8B8(const VFXLTFF_DESC & in,VFXLTFF_DESC & out);
enum VFXFORMAT
{
VFXFMT_A8R8G8B8 = 21,
VFXFMT_X8R8G8B8 = 22,

VFXFMT_FORCE_DWORD = 0x7fffffff
};

typedef struct
{
DWORD Flags; //0
VFXFORMAT Format; //VFXFMT_A8R8G8B8 或 VFXFMT_X8R8G8B8
UINT Width; //图象宽度
UINT Height; //图象高度
UINT Span; //图象每行数据的长度,必须4字节对齐
UINT Size; //图象总的数据长度 Span * Height
UINT ColorKey; //0
BYTE * Image; //图象数据地址
}VFXLTFF_DESC;
效率你可以自己通过loadLibrary实验。
代码里是否利用了其他人和其他设备如显卡的加速问题你可以自己反汇编看

但是源代码我不能给你。而且我也从来没有说过这个代码是我亲自写的。但是,我可以告诉你:这是使用VC+ASM完成的,是一个对C/C++热烈爱好者写的。
lanzhengpeng2 2002-12-06
  • 打赏
  • 举报
回复
发送者 zyl910
发送时间 2002-12-6 7:15:32

用eXeScope分析了一下

你那个程序是用vpic.dll中的函数实现缩放的吧

那个dll是不是你写的?

缘由:
00000025 100519D0 ?vpic_LoadBMP@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
……
0000002E 10054AF0 ?vpic_LoadTIFF@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z


如果是你写的
能不能给我看看缩放部分的源代码?

我的E-Mail:zyl910@sina.com

----------------------------------------------------------------
原贴内容:
http://www.calfsoft.net/testVPic.rar
lanzhengpeng2 2002-12-06
  • 打赏
  • 举报
回复
算了,冤家宜解不宜结。我也懒的再针砭什么了。
不过,劝你最好还是放弃VB吧,选择任何一个C/C++开发平台和编译器都会比VB强。如果你在C/C++上花时间的话,现在你的程序还会更快。
祝顺利!
zyl910 2002-12-06
  • 打赏
  • 举报
回复
是的

用汇编的话可以进行更细致的操作,以提高速度


但是我想要做的是:
完全用高级语言写
思考最快的处理算法
而不是从最底层优化
rongyijizhu 2002-12-05
  • 打赏
  • 举报
回复
叶子是谁?你们是不是很出名
怎么下载不到?
xiaoxinghappy 2002-12-05
  • 打赏
  • 举报
回复
下载看看,各位都是高手,学习,正在对VC头痛中
songfeng163 2002-12-05
  • 打赏
  • 举报
回复
支持,看看先...
zyl910 2002-12-05
  • 打赏
  • 举报
回复
导出, vpic.dll
序号 地址 名称
00000001 10002200 ??0VPicture@@QAE@XZ
00000002 100022A0 ??1VPicture@@UAE@XZ
00000003 100016E0 ??AVPicture@@QAEPAEH@Z
00000004 1005618C ??_7VPicture@@6B@
00000005 100023B0 ?Attach@VPicture@@QAEXAAV1@@Z
00000006 10001350 ?Convert@VPicture@@QAEXH@Z
00000007 100022C0 ?Create@VPicture@@UAE?AW4VP_FLAGS@@HHH@Z
00000008 100519A0 ?DeleteInfo@VPicture@@QAE?AW4VP_FLAGS@@PAX@Z
00000009 100023F0 ?Detach@VPicture@@QAEXXZ
0000000A 100016F0 ?Draw@VPicture@@QAE?AW4VP_FLAGS@@PAUHDC__@@HHHHHHHHI@Z
0000000B 10001840 ?Flip@VPicture@@QAEXXZ
0000000C 100024A0 ?GetColorTable@VPicture@@QBE?AW4VP_FLAGS@@HHPAUtagRGBQUAD@@@Z
0000000D 10002460 ?GetColorTable@VPicture@@QBE?AW4VP_FLAGS@@HPAUtagRGBQUAD@@@Z
0000000E 10001670 ?GetDepth@VPicture@@QBEHXZ
0000000F 10001660 ?GetHeight@VPicture@@QBEHXZ
00000010 100016C0 ?GetImage@VPicture@@QAEPAXXZ
00000011 100016D0 ?GetImage@VPicture@@QBEPBXXZ
00000012 100016A0 ?GetPalette@VPicture@@QAEPAUtagRGBQUAD@@XZ
00000013 100016B0 ?GetPalette@VPicture@@QBEPBUtagRGBQUAD@@XZ
00000014 10001680 ?GetPitch@VPicture@@QBEHXZ
00000015 10001690 ?GetSize@VPicture@@QBEHXZ
00000016 10001650 ?GetWidth@VPicture@@QBEHXZ
00000017 10001630 ?IsEmpty@VPicture@@QBE?AW4VP_FLAGS@@XZ
00000018 10001640 ?IsPalette@VPicture@@QBE?AW4VP_FLAGS@@XZ
00000019 100517C0 ?Load@VPicture@@QAE?AW4VP_FLAGS@@PAEHPAXI@Z
0000001A 10051960 ?LoadAndKeepInfo@VPicture@@QAE?AW4VP_FLAGS@@PAEHPAXI@Z
0000001B 10051970 ?LoadFromInfo@VPicture@@QAE?AW4VP_FLAGS@@PAX@Z
0000001C 10001880 ?Mirror@VPicture@@QAEXXZ
0000001D 10002370 ?Release@VPicture@@UAE?AW4VP_FLAGS@@XZ
0000001E 10001C50 ?Rotate180@VPicture@@QAEXXZ
0000001F 10001FB0 ?Rotate270@VPicture@@QAEXXZ
00000020 10001A40 ?Rotate90@VPicture@@QAEXXZ
00000021 100024C0 ?SetColorTable@VPicture@@QAE?AW4VP_FLAGS@@HHPBUtagRGBQUAD@@@Z
00000022 10002480 ?SetColorTable@VPicture@@QAE?AW4VP_FLAGS@@HPBUtagRGBQUAD@@@Z
00000023 10002410 ?SetGrayPalette@VPicture@@QAEXXZ
00000024 10001000 ?_Convert@VPicture@@QAE?AW4VP_FLAGS@@AAV1@H@Z
00000025 100519D0 ?vpic_LoadBMP@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
00000026 100522B0 ?vpic_LoadGIF@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
00000027 10052770 ?vpic_LoadISee@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
00000028 10052920 ?vpic_LoadJPG@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
00000029 10052EF0 ?vpic_LoadPCX@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
0000002A 10053590 ?vpic_LoadPNG@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
0000002B 10053AB0 ?vpic_LoadPSD@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
0000002C 10054240 ?vpic_LoadRLA@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
0000002D 10054530 ?vpic_LoadTGA@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
0000002E 10054AF0 ?vpic_LoadTIFF@@YAIAAVVPicture@@PAEHPAUVP_LAYER_INFO@@I@Z
zyl910 2002-12-05
  • 打赏
  • 举报
回复
能不能给我看看源程序?

zyl910@sina.com
zyl910 2002-12-05
  • 打赏
  • 举报
回复
To lanzhengpeng2(兰征鹏):

你那个程序怎么用?

我打开了一个640*480的图片
在两个文本框中都输入2
点“SCALE”

发现图像是放大了
但只能察看一部分的图片
lanzhengpeng2 2002-12-05
  • 打赏
  • 举报
回复
首先要说明实际时间的计算:
实际时间(ms) = 显示时间 * 667 / 你的CPU速度(MHz)
因为我的机器是PIII 667。呵呵
lanzhengpeng2 2002-12-05
  • 打赏
  • 举报
回复
http://www.calfsoft.net/testVPic.rar
哎,各位捧个场吧,然后再回来看这个帖子。

再跟我一起唱:Only C~~~~~~~~`````
再跟我一起唱:Only C~~~~~~~~`````
再跟我一起唱:Only C~~~~~~~~`````
http://www.calfsoft.net/testVPic.rar
liangfang 2002-12-05
  • 打赏
  • 举报
回复
占领天时的 VC ,
???地利???
??? ? 人和????
zyl910 2002-12-05
  • 打赏
  • 举报
回复
下载地址:http://www.5ivb.net/zyl910/zyl910_Scale.zip
zyl910 2002-12-04
  • 打赏
  • 举报
回复
先什么?


先选中部队,按A,再点击做标记的贴子……


我好怕阿
(即时战略游戏后遗症)
王集鹄 2002-12-04
  • 打赏
  • 举报
回复
嘻嘻嘻 做一个标记,先~~ 嘻嘻嘻嘻
加载更多回复(108)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧