欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

brew 中使用内存中的jpeg创建图像,该怎么处理

更新时间: 2014-01-05 02:50:45 责任编辑: Author_N1

 

BREW 中使用内存中的JPEG创建图像
我使用socket收到了数据流,里面的数据是JPEG格式的,现在想把它直接显示出来,使用了IMEMASTREAM_Set()接口和IIMAGE_SetStream()接口及IIMAGE_Draw()接口,代码如下:
C/C++ code

/*图像的每一帧都以0101 0101 1010 1010为开始的标志
*开始标志位后面的一个字节表示帧的长度
*然后是帧的内容(主体)
*帧内容(主体)后面的一个字节是校验码,由帧长度与 0x00F0 与而获得
*/
static void HandleRecvData(eMonitor * pMe)
{
    IImage * pIImage = NULL;
    IMemAStream * pIStream = NULL;
    int nFontHeight = 0;

    byte * pFrameBuffer = NULL;        //帧缓冲区
    byte * pFrame = NULL;    //帧缓冲区的指针
    byte * pBuffer = NULL;    //当前指针位置

    int nFrameIndex1; 
    int nFrameIndex2;
    int nParity = 0; //校验位的值
    int nFrameLength = 0;        //帧大小     
    int i = 0; //循环变量

    nFontHeight = IDisplay_GetFontMetrics(pMe->a.m_pIShell, AEE_FONT_NORMAL, NULL, NULL);

    //建立处理JPEG图片格式的 IImage 接口
    if (ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_JPEG, (void **)&pIImage) != SUCCESS)
    {
        DBGPRINTF("Create IImage fall");
        return;
    }

    //MEMCPY(pBuffer, pData, size);
    //建立处理流的 IMenAStream 接口
    if (ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_MEMASTREAM, (void **)&pIStream) != SUCCESS)
    {
        DBGPRINTF("Create IStream fall");
        return;
    }

    //MEMCPY(pMe->m_pbDisplayBuffer, pMe->m_pbRecvBuffer, pMe->m_nRecvSize);
    //pBufferCurrent = pMe->m_pbDisplayBuffer;
    pBuffer = pMe->m_pbRecvBuffer;

    //0101 0101 1010 1010表示一帧图片的开始,后面一个byte表示一帧画面的长度
    while (pBuffer != NULL)
    {
        nFrameIndex1 = * pBuffer;
        //nFrameIndex1 = GetHigh8Bits(* pBufferCurrent);
        nFrameIndex2 = *(++ pBuffer);
        //nFrameIndex2 = GetHigh8Bits(nFrameIndex2);
        //DBGPRINTF("Buffer Current: %x", pBufferCurrent);
        //if (nFrameIndex1 == 0x55 || nFrameIndex2 == 0xaa )
        if ( nFrameIndex2 == 0xaa )
        {
            ++ pBuffer;
            nFrameLength = * pBuffer; //获取帧的长度

            //将图片缓冲的大小设置为图片的长度
            pFrameBuffer = (byte *)MALLOC(nFrameLength * sizeof(byte));

            //从 pBuffer 的后一个位置开始,复制 nFrameLength个byte到pFrameBuffer
            pFrame = pBuffer ++;
            MEMCPY(pFrameBuffer, pFrame, nFrameLength * sizeof(byte));
            pFrame += nFrameLength; //pBuffer 指针后移 nFrameLength 个字节
            nParity = * pFrame; //获取校验位
            if ((nFrameLength & 0x00F0) == nParity)
            {
                //校验正确,显示
                DBGPRINTF("success to get new frame image, size is %d", nFrameLength);
                //格式化数据为存储流
                IMEMASTREAM_Set(pIStream, pFrameBuffer, nFrameLength, 0, FALSE);

                //把流设置为图片数据
                //IIMAGE_SetStream()函数使 IAStream 接口与 IImage 接口对象关联,以使图像数据从文件或套接字流入
                IIMAGE_SetStream(pIImage, pIStream);
                /*IIMAGE_SetStream(pIImage, pFrameBuffer);*/

                IIMAGE_Draw(pIImage, 0, nFontHeight + 10);

                IMEMASTREAM_Release(pIStream);
                //释放变量
                FREEIF(pFrameBuffer);
            }
            else
            {
                //丢弃该帧
                FREEIF(pFrameBuffer);
            }
        }
        pBuffer ++; //缓冲区指针继续往后移动
        i ++;
        /*if (i == 31)
        {
            DBGPRINTF("***%x", pBufferCurrent);
            DBGPRINTF("Find times %d", i);
            return;
        }*/
    }
    DBGPRINTF("***%x", pBuffer);
    DBGPRINTF("Find times %d", i);
}

但是运行时报错,说语句 IMEMASTREAM_Set(pIStream, pFrameBuffer, nFrameLength, 0, FALSE);中发送访问冲突,debug跟踪时发现指针均没有问题,有相关经验或遇到相关问题的高人帮帮我,小弟感激不尽~~~


--参考方法--
先移到BREW区吧
--参考方法--
是,欢迎捧场,呵呵
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:50:45
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/15213/
本文WWW.DOC100.NET DOC100.NET版权所有。