数码相框实现五:图片的手动播放

一、本文目标
本文实现数码相框的最后一个功能:图片的手动播放
具体操作:浏览模式-->点击某张图片(支持jpg\bmp)-->显示图片(可放大、缩小、连播、图片移动)
显示效果如下图:

图片手动播放页面
如何实现呢?
依然两步走:1)页面显示(包括菜单图标 + 图片) 2)功能实现(放大、缩小、连播等)
下面按这两步依次讲解。

二、手动播放页面显示
对于手动播放页面坐标计算,看下图(备注:菜单图标坐标对称的,很简单,主要讲解图片如何缩放并居中显示)

手动播放页面坐标计算
源码就不贴出来了,理解上图再看源码,不难理解的。还请到我的“代码集合”获取源码。

三、实现放大、缩小、连播等功能
先来实现图片的缩放,如下图解释

图片缩放的解释

由上图可知,要实现缩放,关键要确定“原图”和“缩放后图”的左上角坐标。
下面结合源码解释坐标是如何确定的。

图片缩放的源码解释
在这里插入图片描述图片缩放源码解读2

其实,理解上面源码很抽象,要彻底理解,需理解那几个变量。
我再次解释下,看下图

缩放变量解释1
缩放变量解释2

理解上面几个变量之后,下面的新旧图片合并就看得懂了。
/* 
 * 把新图片并入老图片
 * iStartXofNewPic, iStartYofNewPic : 从新图片的(iStartXofNewPic, iStartYofNewPic)开始读出数据用于合并
 * iStartXofOldPic, iStartYofOldPic : 合并到老图片的(iStartXofOldPic, iStartYofOldPic)去
 * iWidth, iHeight : 合并区域的大小
 * ptNewPic        : 新图片
 * ptOldPic        : 老图片
 * 为什么是“新图片”合并到老图片?
 * 因为新图片是经过缩放后的图片数据,所谓“老图片”实际确定了缩放后图片在LCD显示的起始位置而已。
 */
int PicMergeRegion( int iStartXofNewPic, int iStartYofNewPic, 
                    int iStartXofOldPic, int iStartYofOldPic, 
                    int iWidth, int iHeight, 
                    PT_PixelDatas ptNewPic, PT_PixelDatas ptOldPic)
{
	int i;
 	unsigned char *pucSrc;
 	unsigned char *pucDst;
    	int iLineBytesCpy = iWidth * ptNewPic->iBpp / 8;
    	
    	/* pucsrc/pucDst  = 起始位置 + 行字节数 * 行数 + 像素字节数 * 列数 */
	pucSrc = ptNewPic->aucPixelDatas + iStartYofNewPic * ptNewPic->iLineBytes + 
                    iStartXofNewPic * ptNewPic->iBpp / 8; 
 	pucDst = ptOldPic->aucPixelDatas + iStartYofOldPic * ptOldPic->iLineBytes + 
                    iStartXofOldPic * ptOldPic->iBpp / 8;
                    
 	for (i = 0; i < iHeight; i++)
 	{
  		memcpy(pucDst, pucSrc, iLineBytesCpy);
  		pucSrc += ptNewPic->iLineBytes;
  		pucDst += ptOldPic->iLineBytes;
 	}
 	return 0;
}
OK,连播、上一页、下一页的功能实现看源码就行,此处就不赘述了。

到此为止,数码相框的基本功能已经实现。实现的功能有:
页面:主页面、文件浏览页面、设置页面、时间间隔设置页面、手动播放页面
	 (这些页面显示都涉及一系列坐标位置计算  +  缓冲块、LCD显存写入(好像没有读出的))
功能:图片连播(可设置“时间间隔” +  “播放目录”, 默认根目录,时间间隔1s)。
	  图片手动播放(缩放、图片切换、图片连播)
	  (这些操作用到 jpeglib解压jpg图片、freetype字体渲染库、bmp图片格式分析等)

上面只是简单梳理前面完成的工作。这个数码相框 + 电子书 还有很多完善的地方。
对于完善部分,我并不会连续更新(因为还有其它事情要忙),但我一定持续完善 !
待全部完善后,再来梳理、总结这个项目。:)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值