13348|28

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

100分求wince上GIF动画显示解决办法,本人现在在用gif98a类在改写,但遇到两个问题,帮忙解决一样给分.问题内详!!!! [复制链接]

在wince下没有CreateDIBitmap函数,但好象可以通过使用CreateDIBSection函数来做到,但确实对这两个函数都不熟悉,谁能给一个修改好的函数呀.如果能说明一下两个函数的使用就更好了,分再给
看见以前讨论的一篇帖子,关于wince上gif动画的显示,其实我就是在用gif89a 在移植.但遇到几个问题,首先就是文件创建时的几个参数不支持FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,然后就是我上面提到的问题,有好的解决办法么?或给点儿提示,谢谢了.
http://topic.eeworld.net/t/20051213/17/4457006.html

此帖出自WindowsCE论坛

最新回复

麻烦楼主也发给我一份吧!rpf413@163.com    在这里先谢谢了!  详情 回复 发表于 2010-6-25 23:18
点赞 关注
 

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
HBITMAP CreateGifBitmap(int nWidth, int nHeight, void ** ppBuffer)
{
        BITMAPINFO bmi;

        memset(&bmi, 0, sizeof(BITMAPINFO));
        bmi.bmiHeader.biSize          = sizeof (BITMAPINFOHEADER) ;
        bmi.bmiHeader.biWidth         = nWidth;
        bmi.bmiHeader.biHeight        = -nHeight;
        bmi.bmiHeader.biPlanes        = 1;
        bmi.bmiHeader.biBitCount      = 16;
        bmi.bmiHeader.biCompression   = BI_BITFIELDS;
        bmi.bmiHeader.biClrUsed       = 3;
        bmi.bmiHeader.biClrImportant  = 3;

        DWORD * pRGB565Mask = (DWORD *)(bmi.bmiColors);  
        pRGB565Mask[0] = 0xf800;
        pRGB565Mask[1] = 0x07e0;
        pRGB565Mask[2] = 0x001F;

        return CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, ppBuffer, NULL, 0);
}

上msdn看看
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
回 leimiaomiao(水木倩) 
  我照着改了,但还是不对.其实我先前也是这样改的,但读不出正确信息,又不知道是哪里的问题,因为水平有限,看不懂数据,没法跟:(
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
自己顶`````求高手
此帖出自WindowsCE论坛
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

5
 
gif89a  中的DWORD 好象有点问题,特别是以前有人说过WINCE 内存对齐的问题,

好几处的 DWORD 取出来的值是不准确的.特别内存部队的时候.
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
up
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
如果你可以把你的code 发给大家看的话,大家改起来应该会容易点
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
code 没问题,也不是自己写的,就是太多了,我先把有问题的这段发出来,如果要完整代码留下邮箱我可以发给大家.
        UINT uLocalColorTableSize;
        WORD code,oldcode,code1;
        int iFinishCode,iResetCode;
        int iPrimaryTableSize,iTableSize;
        BITMAPINFOHEADER *bitmapheader;
        BYTE *pcColorTable;
        BYTE *pcInfo;
        GIFTABLE *pcGifTable;
        HBITMAP hBitmap;
        m_iLeft=*(WORD*)m_pcGifTrack;
        m_pcGifTrack+=2;
        m_iTop=*(WORD*)m_pcGifTrack;
        m_pcGifTrack+=2;
        m_iWidth=*(WORD*)m_pcGifTrack;
        m_pcGifTrack+=2;
        m_iWidth1=((m_iWidth-1)|0x3)+1;
        m_iHeight=*(WORD*)m_pcGifTrack;
        m_pcGifTrack+=2;
        m_cPackedField=*m_pcGifTrack++;
        m_iTotalReadByte+=9;
        m_iMaxByte=m_iWidth1*m_iHeight;
        pcInfo=new BYTE[256*sizeof(RGBQUAD)+sizeof(BITMAPINFOHEADER)+m_iMaxByte+sizeof(GIFTABLE)*4096];
        //1-BITMAPINFOHEADER
        //2-COLORTABLE
        //3-Bitmap bits
        //4-GIFTABLE;
        bitmapheader=(BITMAPINFOHEADER*)pcInfo;
        pcColorTable=pcInfo+sizeof(BITMAPINFOHEADER);
        m_pcBitmap=pcColorTable+256*sizeof(RGBQUAD);
        pcGifTable=(GIFTABLE*)(m_pcBitmap+m_iMaxByte);
        for(int i=0;i<4096;i++)pcGifTable.previouscode=pcGifTable.nextcode=0;
        bitmapheader->biSize=sizeof(BITMAPINFOHEADER);
        bitmapheader->biWidth=m_iWidth;
        bitmapheader->biHeight=-m_iHeight;
        bitmapheader->biPlanes=1;
        bitmapheader->biBitCount=8;
        bitmapheader->biCompression=BI_RGB;
        bitmapheader->biSizeImage=0;
        bitmapheader->biXPelsPerMeter=0;
        bitmapheader->biYPelsPerMeter=0;
        bitmapheader->biClrUsed=256;
        bitmapheader->biClrImportant=256;

        if(m_cPackedField&0x80)
        {
                uLocalColorTableSize=1;
                uLocalColorTableSize<<=(m_cPackedField&7)+1;
                if(m_bTransparentIndex)
                {
                        m_TransparentColor=RGB(m_pcGifTrack[m_iTransparentIndex*3],m_pcGifTrack[m_iTransparentIndex*3+1],m_pcGifTrack[m_iTransparentIndex*3+2]);
                }
                m_iTotalReadByte+=uLocalColorTableSize*3;
                for(UINT i=0;i                 {
                        pcColorTable[2]=*m_pcGifTrack++;
                        pcColorTable[1]=*m_pcGifTrack++;
                        pcColorTable[0]=*m_pcGifTrack++;
                        pcColorTable[3]=0;
                        pcColorTable+=4;
                }

        }
        else
        {
                BYTE *pcGlobalColor=m_pcGlobalColorTable;
                if(m_bTransparentIndex)
                {
                        m_TransparentColor=RGB(pcGlobalColor[m_iTransparentIndex*3],pcGlobalColor[m_iTransparentIndex*3+1],pcGlobalColor[m_iTransparentIndex*3+2]);
                }
                for(int i=0;i                 {
                        pcColorTable[2]=*pcGlobalColor++;
                        pcColorTable[1]=*pcGlobalColor++;
                        pcColorTable[0]=*pcGlobalColor++;
                        pcColorTable[3]=0;
                        pcColorTable+=4;
                }
        }
        m_uPrimaryBitSize=m_uBitSize=(*m_pcGifTrack++);
        m_iTotalReadByte++;
        iPrimaryTableSize=iTableSize=(1<         iFinishCode=iTableSize-1;
        iResetCode=iFinishCode-1;

        m_uPrimaryBitSize++;
        m_uBitSize++;
        m_uRemain=0;
        m_cCurentByte=0;
        m_uBlockSize=0;
        m_uReadByte=1;
        m_x=m_y=0;
        m_iPass=1;m_iRow=0;
        while((code=GetCode())!=iFinishCode)
        {
                if(code==iResetCode)
                {
                        m_uBitSize=m_uPrimaryBitSize;
                        iTableSize=iPrimaryTableSize;
                        oldcode=GetCode();
                        if(oldcode>iTableSize){delete[] pcInfo;return 0;}
                        Output((BYTE)oldcode);
                        continue;
                }
                if(code exist in the string pcGifTable
                {
                        code1=code;
                        WORD code2=0;
                        while(code1>=iPrimaryTableSize)
                        {
                                pcGifTable[code1].nextcode=code2;
                                code2=code1;
                                code1=pcGifTable[code1].previouscode;
                                if(code1>=code2){delete[] pcInfo;return 0;}
                        }
                        Output((BYTE)code1);
                        while(code2!=0)
                        {
                                Output(pcGifTable[code2].bit);
                                code2=pcGifTable[code2].nextcode;
                        }
                        pcGifTable[iTableSize].bit=(BYTE)code1;
                        pcGifTable[iTableSize].previouscode=oldcode;
                        iTableSize++;
                        if(iTableSize==(0x0001<                         if(m_uBitSize>12)m_uBitSize=12;
                        oldcode=code;
                }
                else    // doesn't exist in the string pcGifTable
                {
                        code1=oldcode;
                        WORD code2=0;
                        while(code1>=iPrimaryTableSize)
                        {
                                pcGifTable[code1].nextcode=code2;
                                code2=code1;
                                code1=pcGifTable[code1].previouscode;
                                if(code1>=code2){delete[] pcInfo;return 0;}
                        }
                        Output((BYTE)code1);
                        while(code2!=0)
                        {
                                Output(pcGifTable[code2].bit);
                                code2=pcGifTable[code2].nextcode;
                        }
                        Output((BYTE)code1);
                        pcGifTable[iTableSize].bit=(BYTE)code1;
                        pcGifTable[iTableSize].previouscode=oldcode;
                        iTableSize++;
                        if(iTableSize==(0x0001<                         if(m_uBitSize>12)m_uBitSize=12;
                        oldcode=code;
                }
        }


    //就是这里需要修改       
        hBitmap=CreateDIBitmap(m_hDC,(BITMAPINFOHEADER*)pcInfo,CBM_INIT,m_pcBitmap,(BITMAPINFO*)pcInfo,DIB_RGB_COLORS);       

        m_pcGifTrack++;
        m_iTotalReadByte++;
        delete[] pcInfo;
        return hBitmap;
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
只有自己顶了~~~
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
我最近也在搞这个东西.是win32的.一直没搞定分享下.
您的代码没仔细看过,我和您的解决方案也不一样.
/////////////////////////////////////////////////////////////////////////////
// CBeexb_gifView message handlers
typedef struct gifImage{
        WORD lWidth;
        WORD lHeight;
        WORD width;
        WORD height;
        struct flag{
                BYTE d:3;
                BYTE c:1;
                BYTE b:3;
        BYTE a:1;
        }Flag;
}GifImage,*PGifImage;
#include

static UINT GifThread(LPVOID gifDC)
{
        CDC* pdc = (CDC*)gifDC;
        HINSTANCE handle = ::AfxGetResourceHandle();
        HRSRC hrsrc = ::FindResource(handle,MAKEINTRESOURCE(IDR_IMAGE1),"IMAGE");
         DWORD word = ::SizeofResource(handle,hrsrc);
         BYTE* lpBy = (BYTE*)LoadResource(handle,hrsrc);
        BYTE* pByte[20];
        DWORD nu[20];
        int num = 0;
        DWORD firstLocation = 0;
        for(DWORD j=0;j         {
                if(lpBy[j]==0x2c)
                {
                        if(lpBy[j-1]==0x00)
                        {
                               
                                if(num==0)
                                {
                                         firstLocation = j;
                                }
                                     PGifImage nowImage = (PGifImage)&lpBy[j+1];
                                if(nowImage->Flag.a==0)
                                {
                                        DWORD number = 1+sizeof(GifImage);
                                        while(lpBy[j+number]!=0)
                                        {
                                            number = number+(DWORD)lpBy[j+number]+1;
                                        }
                                        number++;
                                        pByte[num] = new BYTE[number];
                                        for(DWORD n=0;n                                         {
                                                *(BYTE*)(pByte[num]+n) = lpBy[j+n];
                                        }
                                        nu[num] = number;
                                        j = j+number-1;
                                        num++;
                                }
                                else
                                {
                                        int number = 1+sizeof(GifImage)+1+3*(int)floor(pow(2,nowImage->Flag.d));
                                        while(lpBy[j+number]!=0)
                                        {
                                            number = number+lpBy[j+number];
                                        }
                                        pByte[num] = new BYTE[number];
                                        for(int n=0;n                                         {
                                                *(BYTE*)(pByte[num]+n) = lpBy[j+n];
                                        }
                                        nu[num] = number;
                                        j = j+number-1;
                                        num++;
                                }
                        }
                }
        }
        int i = 1;
        while(i)
        {
                for(int m=0;m                 {
                        CBrush brush(RGB(255,255,255));
                        pdc->FillRect(CRect(0,0,500,500),&brush);
                        DWORD DDD;
                        VirtualProtect(lpBy,word,PAGE_READWRITE,&DDD);
            for(DWORD n=0;n                         {
                                lpBy[firstLocation+n] = *(BYTE*)(pByte[m]+n);
                        }
                        VirtualProtect(lpBy,word,DDD,NULL);



                CMemFile file(lpBy,word);
            CArchive ar(&file,CArchive::load|CArchive::bNoFlushOnDelete);
            CArchiveStream arcstream(&ar);
            CComQIPtr m_picture;
                        HRESULT hr = OleLoadPicture((LPSTREAM)&arcstream,0,false,IID_IPicture,(void**)&m_picture);
                        long a,b;
                        m_picture->get_Width(&a);
                        m_picture->get_Height(&b);
                        CSize sz(a,b);
                        pdc->HIMETRICtoDP(&sz);
                        CRect rect;
                        m_picture->Render(*pdc,0,0,sz.cx,sz.cy,0,b,a,-b,&rect);
                        Sleep(1000);
                }
        }
        return 1;
}

void CBeexb_gifView::OnShowGif()
{
        static BOOL bIsRunning = FALSE;
        if(!bIsRunning)
        {
                CDC* pdc = GetDC();
                m_gifDC = new CDC;
                m_gifDC->Attach(pdc->GetSafeHdc());
                AfxBeginThread(GifThread,(LPVOID)m_gifDC);
                bIsRunning = TRUE;
        }
}
这个是基于MFC的(能运行,实际操作就是分别把gif里的各张图片分张显示,Sleep(1000)间隔显示).我正想把他改成win32的.有点麻烦.

再问下(水木倩) HBITMAP CreateGifBitmap(int nWidth, int nHeight, void ** ppBuffer)
void ** ppBuffer 可以从哪个函数得到?用你那个函数得到HBITMAP
然后经过
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
BitBlt(ps.hdc, (rect.right - bm.bmWidth) / 2,(rect.bottom - cy) / 2, bm.bmWidth, bm.bmHeight,hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hOldBitmap);
DeleteDC(hMemDC);就能直接显示动态gif了吗?不是要只能显示第一帧的那种.或者是需要其他途径.

我还尝试了其他方法如picture control.发现只能显示bmp和ico(太天真了).

还有个问题:那个大虾知道怎么搞progress bar control吗?要win32工程的.就是我提交一个socket请求那段时间让它显示下进度.别让客户等太急.谢谢.
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
windows上直接用gif98a,不用改都可以的~~~
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
是用.net 2005建的基于win32的pocketpc2003或者smartphone5程序(可以在模拟机上跑的).
看了下.你说的gif98a类加进去说fstream找不到.有pocketpc2003或者smartphone5的读gif的原码没.我是新手.有的话发到我油箱好吗youcaiqian@163.com
此帖出自WindowsCE论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

13
 
Mark!
学习,以后可能会用到。
此帖出自WindowsCE论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

14
 
progress bar control已经搞定
for(int i=0; i<10; i++)
{
    SendDlgItemMessage(hDlg, IDC_PROGRESS1, WM_USER+2, (i+1)*10, 0);
    UpdateWindow( GetDlgItem(hDlg, IDC_PROGRESS1) );
    Sleep(200);
}
希望给一些朋友有些帮助.问题就剩gif了.使用gif98a还有点问题.请教高手.
问下用.net 2005建的基于win32的pocketpc2003或者smartphone5程序能使用gif98a类吗?
别让我尝试半天说不行.......
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
经过我查询结果是,做适当修改后是可以的.你下的那个类是不是有问题,我把我下的发给你吧,你改改看,现在就剩下CreateDIBitmap函数的问题了,不知道pocketpc2003或者smartphone5是否有问题,还有就是如果不播gif动画的话,可以用imaging 解决.
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

16
 
发了,别人写vc下的.不知是否对你有帮助.
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

17
 
邮件收到了谢谢楼主.
CreateDIBitmap不能用.
有其他方法吗?真累.处于绝望边缘.
同学叫我放弃gif了.弄个time显示多张jpg得了.
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

18
 
这个问题`````````确实很麻烦.找了n久还是没找到解决办法``一起努力吧
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

19
 
哈哈,问题解决了.
谢谢nbcool(载舟之水)高人呀.看了你的帖子受益非浅
http://topic.eeworld.net/t/20040914/21/3372675.html
http://topic.eeworld.net/t/20050203/16/3773752.html

解决办法:


稍做改动,可以支持   1位,2位,4位,8位   24位   图像。   
  对于   3,5,7,9,10   到16位,以及   25   到   64位图像   其实也很简单,但是需要你十分熟悉图像处理知识,另外对于使用RLE编码压缩的BMP因为算法比较麻烦也没做处理,对于最新的BMP标准,我也没有做处理,所以以下内容只兼容老的BMP标准。   
   
   
   
  WORD   PaletteSize(   LPSTR   lpbi   )   
  {   
          return   (   DIBNumColors(   lpbi   )   *   sizeof(   RGBQUAD   )   );   
  }   
  WORD   DIBNumColors(   LPSTR   lpbi   )   
  {   
          WORD   wBitCount;   
          DWORD   dwClrUsed;   
   
          dwClrUsed   =   ((LPBITMAPINFOHEADER)   lpbi)->biClrUsed;   
   
          if   (dwClrUsed)   
                  return   (WORD)   dwClrUsed;   
   
          wBitCount   =   ((LPBITMAPINFOHEADER)   lpbi)->biBitCount;   
   
          switch   (wBitCount)   
          {   
                  case   8: return   256;   
                  case   1:   return   2;   
                  case   2:   return   4;   
  case   4:   return   16;   
   
                  default:return   0;   
          }   
          return   0;   
  }   
   
  HBITMAP   DIBTohBitmap(HDC   m_hDC,LPSTR   lpSrcDIB)   
  {   
      HBITMAP   hBitmap   =   NULL;   
      HBITMAP   hOldBmp   =   NULL;   
      HDC   hTmpDC   =   NULL;   
      BITMAPINFOHEADER*   bitmapheader   =   (BITMAPINFOHEADER*)lpSrcDIB;   
   
      hBitmap   =   CreateCompatibleBitmap(m_hDC,   
                                                                    bitmapheader->biWidth,   
                                                                    -(bitmapheader->biHeight));   
      hTmpDC=CreateCompatibleDC(m_hDC);   
      hOldBmp=(HBITMAP)SelectObject(hTmpDC,hBitmap);   
      INT   dwPSize   =   PaletteSize((LPSTR)lpSrcDIB);   
      BITMAPINFO   *   pbinfo   =   (BITMAPINFO   *)lpSrcDIB;   
   
      StretchDIBits(hTmpDC,0,0,bitmapheader->biWidth,   
          (-bitmapheader->biHeight),0,0,bitmapheader->biWidth,   
          (-bitmapheader->biHeight),lpSrcDIB   +   40   +   dwPSize,pbinfo,   
          DIB_RGB_COLORS,SRCCOPY);   
   
      SelectObject(hTmpDC,hOldBmp);   
      DeleteDC(hTmpDC);   
      return   hBitmap;   //记得外面用完释放   
  }   
   
  //注意上面出现的三处负值   
  //   -(bitmapheader->biHeight)   (-bitmapheader->biHeight)   (-bitmapheader->biHeight)   
  //   我忘记了为什么这么写,但是如果在vc6上调试,则需要全部改成正数。   
  //   以上代码我在vc6下调试通过,没在wince下面做,因为重装系统后还没空装EVC4。

此帖出自WindowsCE论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

20
 
如果nbcool(载舟之水)看到,请回复帖,我给分,希望这个帖子能给其他人帮助
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表