网站管理模板,企业设计网站系统,现在学做网站赚钱吗,室内设计个人工作室项目背景#xff1a;博主之前做过一个摄像头采集数据#xff0c;然后在LCD上显示视频数据的项目#xff0c;假如我们摄像头采集的一帧数据的分辨率比我们的LCD的分辨率要大#xff0c;那么LCD则无法显示整个图像#xff0c;这时候我们就要把这么一帧图片进行缩放#xff…项目背景博主之前做过一个摄像头采集数据然后在LCD上显示视频数据的项目假如我们摄像头采集的一帧数据的分辨率比我们的LCD的分辨率要大那么LCD则无法显示整个图像这时候我们就要把这么一帧图片进行缩放然后再显示在LCD上。 本文采用的是近邻取样插值方法缩放图片比如原图有100个点想缩放10倍的话那就要取10个点点的编号比如0 10 20 30 。。。100其他点就不要了。 下面我们直接通过程序来分析首先我们用 输入分辨率/压缩后的分辨率 可得到一个缩放比例值k根据这个k值找出我们要保存原图上哪些竖线和横线。横线和竖线的交点就是我们要保存的点。
/*********************************************************************** 函数名称 PicZoom* 功能描述 近邻取样插值方法缩放图片* 注意该函数会分配内存来存放缩放后的图片,用完后要用free函数释放掉* 近邻取样插值的原理请参考网友lantianyu520所著的图像缩放算法* 输入参数 ptOriginPic - 内含原始图片的象素数据* ptBigPic - 内含缩放后的图片的象素数据* 输出参数 无* 返 回 值 0 - 成功, 其他值 - 失败***********************************************************************/
int PicZoom(PT_PixelDatas ptOriginPic, PT_PixelDatas ptZoomPic)
{unsigned long dwDstWidth ptZoomPic-iWidth;//压缩后分辨率的宽度值unsigned long* pdwSrcXTable;unsigned long x;unsigned long y;unsigned long dwSrcY;unsigned char *pucDest;unsigned char *pucSrc;unsigned long dwPixelBytes ptOriginPic-iBpp/8;if (ptOriginPic-iBpp ! ptZoomPic-iBpp){return -1;}//pdwSrcXTable数组用来存放要保存的是哪些“竖线”保存上图红色竖线的位置pdwSrcXTable malloc(sizeof(unsigned long) * dwDstWidth);if (NULL pdwSrcXTable){DBG_PRINTF(malloc error!\n);return -1;}//pdwSrcXTable数组用来存放要保存的是哪些“竖线”保存上图红色竖线的位置for (x 0; x dwDstWidth; x)//生成表 pdwSrcXTable{pdwSrcXTable[x](x*ptOriginPic-iWidth/ptZoomPic-iWidth);}//循环“压缩后图片的分辨率的高度”次也就是开始把要留下的点放进输出buffer了for (y 0; y ptZoomPic-iHeight; y){ //找出每一次要保存的“横线” dwSrcY (y * ptOriginPic-iHeight / ptZoomPic-iHeight);//目的的起始地址pucDest ptZoomPic-aucPixelDatas y*ptZoomPic-iLineBytes;//源的起始地址横线的位置是每个点的起始地址竖线的位置是偏移位置pucSrc ptOriginPic-aucPixelDatas dwSrcY*ptOriginPic-iLineBytes;//每条横线上有dwDstWidth个点要保存for (x 0; x dwDstWidth; x){//结合pdwSrcXTable数组找出要保存的点memcpy(pucDestx*dwPixelBytes, pucSrcpdwSrcXTable[x]*dwPixelBytes, dwPixelBytes);}}free(pdwSrcXTable);return 0;
}