数码相框实现五:图片的手动播放
一、本文目标
本文实现数码相框的最后一个功能:图片的手动播放
具体操作:浏览模式-->点击某张图片(支持jpg\bmp)-->显示图片(可放大、缩小、连播、图片移动)
显示效果如下图:
如何实现呢?
依然两步走: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图片格式分析等)
上面只是简单梳理前面完成的工作。这个数码相框 + 电子书 还有很多完善的地方。
对于完善部分,我并不会连续更新(因为还有其它事情要忙),但我一定持续完善 !
待全部完善后,再来梳理、总结这个项目。:)