8812|21

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

那位用了WinCE下的IImage显示部分图片的? [复制链接]

我用CxImage加载图片,但是发现用用IImage接口的Draw函数,如果第三个参数srcRect为NULL的时候,可以比较多的图片,但是如果不为NULL,则很多图片都不能显示,简单的640*480的分辨率都不能显示,返回值是E_INVALIDARG,真是怪了.
难不成IImage只能显示很小的图片?

最新回复

你好,想请教一个问题 我用IImage显示图片 为什么 IImageFactory 编译通不过呢   wince 5.0  vs08  详情 回复 发表于 2010-4-12 13:26
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
IImage的Draw函数肯定可以可以显示大图片的,
如果是E_INVALIDARG,那么就是参数有错了,你把参数贴出来看看了
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
参数应该不会错,因为同样的代码,图片比较小的时候就没问题
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
为了方便大家分析,我贴出主要的代码如下:

        ImageInfo sttImageInfo;
        IImagingFactory *pImgFactory = NULL;

        hr = CoCreateInstance(CLSID_ImagingFactory, NULL, CLSCTX_INPROC_SERVER,
                              IID_IImagingFactory, (void**)&pImgFactory);
        if(FAILED(hr))
        {
                return hr;
        }

        //从文件中创建图片
        strImagePath = m_strArrImageList.GetAt(p_iImageIndex);
        hr = pImgFactory->CreateImageFromFile(strImagePath, &m_pICurrentImage);
        if(FAILED(hr))
        {
                ASSERT(FALSE);
                goto FUNCTION_EXIT;
        }

        hr = m_pICurrentImage->GetImageInfo(&sttImageInfo);
        if(S_OK == hr)
        {
                HDC hDC;
                CRect objClient;
                CSize objSize;

                hDC = ::GetDC(m_hWnd);
                if(NULL == hDC)
                {
                        ASSERT(FALSE);
                        goto FUNCTION_EXIT;
                }

                //根据测试,如果图片大点,GetPhysicalDimension返回后objSize的cx,cy都是为0,而且hr=0表示函数成功,怪了????????
                hr = m_pICurrentImage->GetPhysicalDimension(&objSize);
                GetClientRect(&objClient);

                // 根据测试,第一次显示总是要求第二个参数为NULL才行,否则会返回错误值的,怪了?????????
                hr = m_pICurrentImage->Draw(hDC), &objClient, NULL);
        }
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
对啊,GetPhysicalDimension这个函数没用吧,返回的不是像素大小,你是不是拿这个值作为Draw的输入参数了
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

7
 
Draw()函数中RECT是以0.01mm为单位,看看是不是单位搞错了。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

8
 
不好意思,没注意,第二个参数应该是以0.01mm 为单位。估计你就是应为这个才会去调用GetPhysicalDimension,但是GetPhysicalDimension又没有拿到正确的值。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
楼住你能把GetImageInfo里面显示的Width,Height,Xdpi,Ydpi打出来看看么?
GetPhysicalDimension里的cx,cy是根据这几个值算出来的
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

10
 
呵呵,可以看看这篇博文。里面提到了单位转换。
http://blog.eeworld.net/norains/archive/2007/08/26/1759912.aspx
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

11
 
关于第二个参数的单位问题,我已经注意到了,就是不调用GetPhysicalDimension函数也是一样的结果,我保证第二个参数100%没有单位问题的时候,解码还是不行的
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 9 楼 ruritanian 的回复:
楼住你能把GetImageInfo里面显示的Width,Height,Xdpi,Ydpi打出来看看么?
GetPhysicalDimension里的cx,cy是根据这几个值算出来的

对于大图片, Width,Height的值是没有问题的
但是Xdpi,Ydpi的值为0
奇怪的是对于小图片这些值都是正确的,我读的文件格式是png格式的

我搜索了WinCE500这个目录下的文件,发现所有调用Draw的函数中,第二个参数都是为NULL,想找个不为NULL的例子都不容易啊.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
看上去Xdpi和Ydpi是从文件里读出来的,得看一下文件里这两个值有没有设。
如果这两个值为0的话,系统是算不出正确的长宽的,所以返回E_INVALIDARG就不奇怪了
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

14
 
文件应该是没有什么问题的吧,我是在PC上用画图打开一个bmp文件,然后另存为png的,然后就拿这个png去测试的,现在问题的关键是图片小就没问题,图片大了就有问题(其实不算大,不到1M的图片)
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

15
 
图片是通过PC下的画图程序另存的,图片本身应该没有什么问题吧
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 15 楼 panghuang 的回复:
图片是通过PC下的画图程序另存的,图片本身应该没有什么问题吧


图片写入的时候参数有没写有没写对?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

17
 
参数肯定是对的啦
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

18
 
        hCopyDC = ::CreateCompatibleDC(hdc);
        CWRAEx(hCopyDC != _NULL, HRESULT_FROM_WIN32(GetLastError()));

        hBitmap = CreateCompatibleBitmap(hdc, rect.right-rect.left , rect.bottom-rect.top);
        CWRAEx(hBitmap != _NULL, HRESULT_FROM_WIN32(GetLastError()));
        hBitTemp   =   (HBITMAP)   SelectObject(hCopyDC,   hBitmap);
        CWRAEx(hBitTemp != _NULL, HRESULT_FROM_WIN32(GetLastError()));

        hr = m_pNewBitMap->QueryInterface(IID_IImage,(void **)&pImage);
        CHR(hr);

        pImage->GetImageInfo(&imgInfo);
        dDotPermmX = imgInfo.Xdpi / 25.4;
        dDotPermmY = imgInfo.Ydpi / 25.4;

        xImage = (int)(imgInfo.Width / dDotPermmX / 0.01);
        yImage = (int)(imgInfo.Height / dDotPermmY / 0.01);

        xOffset = (int)(m_xOffset * 1.0 / rect.right * xImage);
        yOffset = (int)(m_yOffset * 1.0 / rect.bottom * yImage);

        rcImage.left = xOffset / m_EnlargeFactor;
        rcImage.bottom = yImage - yOffset / m_EnlargeFactor;
        rcImage.top = rcImage.bottom - yImage / m_EnlargeFactor;
        rcImage.right = rcImage.left + xImage / m_EnlargeFactor;

        // important, if the rcImage out of the image size,
        // there will be a big error, the CreateCompatibleDC
        // will always return null.
        rcImage.top = rcImage.top < 0 ? 0 : rcImage.top;
        rcImage.left = rcImage.left < 0 ? 0 : rcImage.left;
        rcImage.right = rcImage.right > xImage ? xImage : rcImage.right;
        rcImage.bottom = rcImage.bottom > yImage ? yImage : rcImage.bottom;
        CBR(rcImage.left < rcImage.right);
        CBR(rcImage.top < rcImage.bottom);

        hr = pImage->Draw(hCopyDC,&rect,&rcImage);
        CHR(hr);

        if (!lParam && m_bThumb && m_EnlargeFactor > 1)
        {
            BitBlt(hCopyDC,m_thumbRect.left,m_thumbRect.top,m_thumbRect.right-m_thumbRect.left,m_thumbRect.bottom-m_thumbRect.top,m_thumbDC,0,0,SRCCOPY);
            TuneThumbPos(hCopyDC, rect);
        }
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

19
 
我现在遇到的问题是这第三个参数的坐标系统。。。有topbottom和bottomtop之分,但是
通过GetImageInfo无法获取sinktopbottom属性。。。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

20
 
楼上的,我这边获取到的imgInfo.Xdpi和imgInfo.Ydpi是0啊,按照你的做法dDotPermmX 是0的,这样结果就是除0错误啊.
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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