OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12463|回复: 5

移植ChaN的TJpgDec图片解码模块,基本成功,还有几个小问题,求教。。。

[复制链接]

12

主题

42

帖子

0

精华

限制会员

积分
-44
金钱
-44
注册时间
2011-9-6
在线时间
0 小时
发表于 2012-3-22 09:56:21 | 显示全部楼层 |阅读模式

移植参考的ourdev上的一篇基于LPCXXX移植的文章,在STM32上采用开窗显示的方法。。。

TJpgDec中重定义的数据类型和他早先作品FATFS中一样。
移植主要是针对其图片数据结构体中的两个函数指针编写出函数原型。如下:


UINT STM32_tjd_input (
                            JDEC* jd,        /* Decoder object */
                            BYTE* buff,        /* Pointer to the read buffer (NULL:skip) */
                            UINT nd            /* Number of bytes to read/skip from input stream */
                        )
{
    UINT rb;
    FIL *fil = (FIL*)jd->device;    /* Input stream of this session */   
    if (buff)     /* Read nd bytes from the input strem */
    {
        f_read(fil, buff, nd, &rb);
        return rb;        /* Returns number of bytes could be read */
    } 
    else 
    {
        return (f_lseek(fil, f_tell(fil) + nd) == FR_OK) ? nd : 0;/* Skip nd bytes on the input stream */
    }
}

 

/* User defined call-back function to output RGB bitmap */

UINT STM32_tjd_output (
                        JDEC* jd,        /* Decoder object */
                        void* bitmap,    /* Bitmap data to be output */
                        JRECT* rect      /* Rectangular region to output */
                        )
{
    jd = jd;    /* Suppress warning (device identifier is not needed) */

    STM32_disp_blt(rect->left, rect->right, rect->top, rect->bottom, (uint16_t*)bitmap);

    return 1;    /* Continue decompression */
}


还有一个输出函数调用的显示函数
// 在屏幕上显示图片
void STM32_disp_blt (
                            int left,        /* Left end (-32768 to 32767) */
                            int right,        /* Right end (-32768 to 32767, >=left) */
                            int top,        /* Top end (-32768 to 32767) */
                            int bottom,        /* Bottom end (-32768 to 32767, >=right) */
                            const uint16_t *pat    /* Pattern data */
                        )
{
    int yc, xc;   
    u32 i;
     u32 len=0; 
     if (left > right || top > bottom) 
    {
        return;             // Check varidity
    }
    if (left > MaskR || right < MaskL  || top > MaskB || bottom < MaskT)    //屏幕的上下左右截止区
    {
        return;                // Check if in active area 
    }    
    yc = bottom - top  + 1;    // Vertical size 
    xc = right  - left + 1; 
    if (top < MaskT)         // Clip top of source image if it is out of active area 
    {
        pat+= xc * (MaskT - top);
        yc -= MaskT - top;
        top = MaskT;
    }
    if (bottom > MaskB)     // Clip bottom of source image if it is out of active area 
    {
        yc -= bottom - MaskB;
        bottom = MaskB;
    }
    if (left < MaskL)         // Clip left of source image if it is out of active area 
    {
        pat += MaskL - left;
        xc -= MaskL - left; 
        left = MaskL;
    }
    if (right > MaskR)         // Clip right of source image it is out of active area
    {
        xc -= right - MaskR;
        right = MaskR;
    }

    // 已经计算出了要绘制的x方向pixels和y方向pixels
    // 上下左右的值已经校正为,为屏幕上的绝对位置,由此可以算出屏幕缓冲区的起始位置
    
 if(whflag==1)
 {
  LCD_Set_Window(left,top,right,bottom);
  LCD_Scan_Dir(U2D_L2R);//从上到下,从左到右
  LCD_SetCursor(left,top);//设置光标位置
 }
 else
 {
  LCD_Set_Window(left,top,right,bottom);
  LCD_Scan_Dir(L2R_U2D);//从左到右,从上到下
  LCD_SetCursor(left,top);//设置光标位置
 }
 LCD_WR_REG(R34);                    //开始写入GRAM 
 len=(right-left+1)*(bottom-top+1); //写入的数据长度
 for(i=0;i<len;i++)
 {
  LCD_WR_DATA(*pat);
  pat++;
 }  
 LCD_Set_Window(0,0,239,319);
}

//绘制图像函数
BYTE Buff[4096] __attribute__ ((aligned(4)));   
u32 Commander_DRAWJPEG(FIL* fJpeg,const char* filename)
{
    FRESULT FatFsRet;
    JDEC     jd;         /* Decoder object (124 bytes) */
    JRESULT rc;
    BYTE     scale;


    FatFsRet = f_open(fJpeg,filename,FA_READ);
    if(FatFsRet != FR_OK)
    { 
      LCD_ShowString(60,130,"open jpeg error!");
        Delay(10000);
        f_close(fJpeg);
        return FatFsRet;
    } 
    rc = jd_prepare(&jd, STM32_tjd_input, Buff, sizeof(Buff), fJpeg);   
// LCD_ShowNum(100,220,rc,16,12);            //调试输出错误信息为JDR_INP。显示输入设备错误!!
    if (rc == JDR_OK) 
    {
        for (scale = 0; scale < 3; scale++)              //确定比例因子
        {
   //此处可修改图像显示大小,3个等级。1/2,1/4,1/8
            if ((jd.width >> scale) <= 400 && (jd.height >> scale) <= 600) 
            {
                break;
            }
        }
    
        rc = jd_decomp(&jd, STM32_tjd_output, scale);  //开始解压JPEG文件
    }
    else
    {
  LCD_ShowString(60,130,"jpegDecode error!");
  Delay(10000);
        f_close(fJpeg);
        return FatFsRet;
    }
    
    f_close(fJpeg);
    return 0;

以上就是解码模块的需要改动的地方。
目前还存在的问题:
1.


这个表格的作用。
2.图像只有竖屏显示,当宽大于高时显示别扭,我做了一点修改,效果不理想,可以横屏,但是显示出来的与原图成镜像对称。
我修改过的几个地方:
1.Tjpgd.c中的jd_prepare函数;加入了一个宽高标志。
2.Tjpgd.c中的mcu_output函数;根据宽高标志做了一个判断。

希望哪位大虾,抽空帮俺看看。不胜感谢。。。
PS:吐槽,原子哥的图片解码程序真心不好看。一堆全局变量,菜鸟儿表示压力山大。。。


源码在附件.

TJpgDEC.rar

13.56 KB, 下载次数: 620

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-3-22 10:20:25 | 显示全部楼层
回复【楼主位】hongdan0714jin:
---------------------------------
1,不清楚.
2,可能是你窗口设置有误吧.试试画点吧,虽然速度慢一点.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

42

帖子

0

精华

限制会员

积分
-44
金钱
-44
注册时间
2011-9-6
在线时间
0 小时
 楼主| 发表于 2012-3-22 12:48:09 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
哦,我再看看。。。
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-3-22 12:50:42 | 显示全部楼层
楼主给力。,我还没有开始移植这东西呢。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-3-22 12:51:45 | 显示全部楼层
楼主给力。,我还没有开始移植这东西呢。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-7-28
在线时间
0 小时
发表于 2012-7-28 15:05:43 | 显示全部楼层

楼主怎么样啦 最近搞得??我想跟你交流一下。。怎么样??

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 02:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表