6164|21

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

使用IImagingFactory显示JPG图片的问题? [复制链接]

使用IImagingFactory显示图片时,发现效率非常低,调试发现
当用IImage调用Draw()函数时,居然要好几秒才会返回,不知道是
什么原因?是图片太大?
图片为2592 x 1944,大小985KB!
显示的的窗口为480 x 640
if(FAILED(hr = m_pImage->Draw(hdcmem,&rc, NULL)))

最新回复

贴代码  照这种格式来写,速度保证3秒内绘制完成,10M的图片都没有问题,用完的东西就赶快回收掉,内存宝贵呀。 BOOL CImageMaster::DrawIntegrity(HDC hdc, ImageDrawMode mode, const RECT *pDstRect, const RECT *pSrcRect, BOOL bDraw) {     if(pDstRect == NULL)     {         return FALSE;     }                if (m_ImageInfo.Width >= 1024 || m_ImageInfo.Height >= 768)         {                                RECT rcDraw = {0};                         CalculateDrawArea(mode,pDstRect,pSrcRect,&rcDraw);//计算绘制区域                                 m_ImageInfo.Width = rcDraw.right - rcDraw.left;                                 m_ImageInfo.Height = rcDraw.bottom - rcDraw.top;         }         m_pImagingFactory->CreateBitmapFromImage(m_pImage, m_ImageInfo.Width, m_ImageInfo.Height, m_ImageInfo.PixelFormat, InterpolationHintDefault, &m_pBitmap);                 if(m_pImage != NULL)     {         m_pImage->Release();         m_pImage = NULL;     }                 m_pBitmap->QueryInterface(IID_IImage, (void **)&m_pImage);                 if (m_pBitmap != NULL)         {                 m_pBitmap->Release();                 m_pBitmap = NULL;         }     if(IsOKMemoryDC(&m_IntegrityMemDCInfo) == FALSE)     {                         if(IsOKImagingInterfaces() == FALSE)         {             return FALSE;         }                         if(CreateMemoryDC(hdc,&m_IntegrityMemDCInfo,m_ImageInfo.Width,m_ImageInfo.Height) == FALSE)         {             return FALSE;         }                         RECT rcMemDC = {0,0,m_ImageInfo.Width,m_ImageInfo.Height};            HRESULT hr = m_pImage->Draw(m_IntegrityMemDCInfo.hdc,&rcMemDC,NULL);         if(FAILED(hr))         {             ReleaseImagingInterfaces();             DeleteMemoryDC(&m_IntegrityMemDCInfo);             return FALSE;         }     }         BOOL bResult = TRUE;            if(bDraw == TRUE)     {         RECT rcDraw = {0};         CalculateDrawArea(mode,pDstRect,pSrcRect,&rcDraw);         bResult = Draw(hdc,&rcDraw,&m_IntegrityMemDCInfo,pSrcRect);     }                    return bResult; }  详情 回复 发表于 2010-3-8 17:33
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
Draw()函数显示图片的速度较慢,因此不适合在OnPaint()或OnDraw()之类的消息处理函数里面调用。

可以使用双缓冲技术来解决
在读取图片时先调用Draw()函数画到内存DC中,然后在OnPaint()或OnDraw()函数中只需使用当前DC来BitBlt已经保存的内存DC就行,速度很快。
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
Draw()函数画到内存DC中的速度也是一样的慢,不会比直接画到显示内存上快的。
所以楼上的说法有待考究!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
2592 x 1944,图片是挺大的,慢是比较正常的。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
2592 x 1944??

985KB能算大的了。

显示图片:
需要根据设备的显示效果来微调图片的各种参数。
图片只要能基本达到显示效果就行,不要把太大的图
放上去,效果也不会更好。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 91program 的回复:
Draw()函数画到内存DC中的速度也是一样的慢,不会比直接画到显示内存上快的。
所以楼上的说法有待考究!

画到内存DC跟显示内存上的速度是一样的,不过采用内存DC,可以只在图片初始化函数中调一次Draw()函数画到内存DC,在OnPaint()或OnDraw()函数中就不必调用Draw()函数了,比每次响应WM_PAINT都调Draw()效率高很多
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
原来这是这种方式的硬伤呀,我还打算用它来实现一个图片浏览器(600 x 800)兼特效显示,如百叶窗效果,
看来是不行了,请问,哪位有没有显示JPG图片的方法,请推荐!

 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

8
 
IImage、IImagingFactory支持JPG格式
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 biaozai06 的回复:
IImage、IImagingFactory支持JPG格式


我现在就用的这个,但效率低了,碰到稍大的图片就不行了!
 
 
 

回复

93

帖子

0

TA的资源

一粒金砂(初级)

10
 
大图肯定慢
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

11
 
我也做过一个WINCE下图片显示的应用程序,只能说WINCE下支持的接口太少了,跟WIN32是没得比。。
WINCE下能支持JPG的目前我只发现IImage、IImagingFactory类
至于显示速度的问题,我采用了内存DC后只有打开图片时要Draw()一次,会有点慢。响应WM_PAINT消息时,由于不必调Draw()函数,所以也蛮快的
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 5 楼 biaozai06 的回复:
引用 2 楼 91program 的回复:
Draw()函数画到内存DC中的速度也是一样的慢,不会比直接画到显示内存上快的。
所以楼上的说法有待考究!

画到内存DC跟显示内存上的速度是一样的,不过采用内存DC,可以只在图片初始化函数中调一次Draw()函数画到内存DC,在OnPaint()或OnDraw()函数中就不必调用Draw()函数了,比每次响应WM_PAINT都调Draw()效率高很多


IImage 足够了  我用6M 大小的 JPG 图像做测试,不管画图还是特效都没问题 主要是程序框架和优化 绝对没问题 我发誓
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

13
 
ls介绍一下了。

最好详细一点的思路。

谢谢。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

14
 
To xajhuang:
是啊,老兄能说说你的思路吗?因为我目前用的MFC,程序框架好象也沒太大的调整了。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

15
 
2592 x 1944 直接Draw 就是对整幅图解码,速度很慢!但画出来可能只有480 x 272 或者 320 x 240
图太大了的话 建议用GetThumbnail生成个小图  Draw的时候解码量小很多,很多精细的数据就省略掉了
而画出来480 x 272 的效果不会比全解的差
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(中级)

16
 
引用 14 楼 sping_karen 的回复:
2592 x 1944 直接Draw 就是对整幅图解码,速度很慢!但画出来可能只有480 x 272 或者 320 x 240
图太大了的话 建议用GetThumbnail生成个小图  Draw的时候解码量小很多,很多精细的数据就省略掉了
而画出来480 x 272 的效果不会比全解的差


楼上正解
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

17
 
多线程(加载文件) + IImage(装载图像) + DirectDraw(绘图)
我想不出来还有比这个更快的方法了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

18
 
mark
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

19
 
帮顶……
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

20
 
IImagingFactory底层用COM实现的,
COM本身效率就不怎么样,通用性高了,牺牲效率那是当然的事了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表