C++图片缩放处理代码
发布时间:2020-12-16 07:44:41 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 ///////////////////////////////////缩放图像static void _ieInterpImageBilinear8UC1_Ver3_RowFilter(unsigned char* src,long* dst,int len,int* l
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 ///////////////////////////////////缩放图像 static void _ieInterpImageBilinear8UC1_Ver3_RowFilter(unsigned char* src,long* dst,int len,int* leftIdx,int* rightIdx,long* weight,int shift) { int i; for(i = 0; i < len - 4; i+=4) { *dst++ = ((1<<shift) - weight[i])*src[leftIdx[i]] + weight[i]*src[rightIdx[i]]; *dst++ = ((1<<shift) - weight[i+1])*src[leftIdx[i+1]] + weight[i+1]*src[rightIdx[i+1]]; *dst++ = ((1<<shift) - weight[i+2])*src[leftIdx[i+2]] + weight[i+2]*src[rightIdx[i+2]]; *dst++ = ((1<<shift) - weight[i+3])*src[leftIdx[i+3]] + weight[i+3]*src[rightIdx[i+3]]; } for( ; i < len; ++i) { *dst++ = ((1<<shift) - weight[i])*src[leftIdx[i]] + weight[i]*src[rightIdx[i]]; } } #define IET_MAX(x,y) (x)>(y)?(x):(y) #define IET_MIN(x,y) (x)>(y)?(y):(x) #define IET_SWAP(x,y,tmp) (tmp)=(x);(x)=(y);(y)=(tmp); static void ResizeImage(unsigned char* pSrc,int src_w,int src_h,unsigned char* pDst,int dst_w,int dst_h) { int i,j; int sw,sh,sstep; int dw,dh,dstep; unsigned char *sdata,*ddata; float horScaleRatio,verScaleRatio; long *rowBuf1,*rowBuf2; long *upLinePtr,*downLinePtr,*tempPtr; long *horWeight; int *horLeftIdx,*horRightIdx; int preVerUpIdx,preVerDownIdx; int shift = 8; sw=src_w; sh=src_h; sstep=24; sdata=pSrc; dw=dst_w; dh=dst_h; dstep=24; ddata=pDst; horScaleRatio = sw / (float)(dw); verScaleRatio = sh / (float)(dh); rowBuf1 = new long[dw]; rowBuf2 = new long[dw]; horWeight = new long[dw]; horLeftIdx = new int[dw]; horRightIdx = new int[dw]; //col interpolation //计算目标图像像素横向的左右邻居序号,和权重。 for(i = 0; i < dw; i++) { float pos = (i + 0.5f) * horScaleRatio; horLeftIdx[i] = (int)(IET_MAX(pos - 0.5f,0)); horRightIdx[i] = (int)(IET_MIN(pos + 0.5f,sw-1)); horWeight[i] = (long) (fabs(pos - 0.5f - horLeftIdx[i]) * (1<<shift)); } preVerUpIdx = -1; preVerDownIdx = -1; upLinePtr = rowBuf1; downLinePtr = rowBuf2; for(j = 0; j < dh; j++) { float pos = (j + 0.5f) * verScaleRatio; int verUpIdx = (int)(IET_MAX(pos - 0.5f,0)); int verDownIdx = (int)(IET_MIN(pos + 0.5f,sh-1)); long verWeight = (long) (fabs(pos - 0.5f - verUpIdx) * (1<<shift)); if(verUpIdx == preVerUpIdx && verDownIdx == preVerDownIdx) { ; //do nothing } else if(verUpIdx == preVerDownIdx) { IET_SWAP(upLinePtr,downLinePtr,tempPtr); _ieInterpImageBilinear8UC1_Ver3_RowFilter(sdata + sstep*verDownIdx,dw,horLeftIdx,horRightIdx,horWeight,shift); } else { _ieInterpImageBilinear8UC1_Ver3_RowFilter(sdata + sstep*verUpIdx,upLinePtr,shift); _ieInterpImageBilinear8UC1_Ver3_RowFilter(sdata + sstep*verDownIdx,shift); } unsigned char* _ptr = ddata + dstep*j; for(i = 0; i < dw-4; i+=4) { *_ptr++ = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i] + verWeight*downLinePtr[i]) >> (2*shift) ); *_ptr++ = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i+1] + verWeight*downLinePtr[i+1]) >> (2*shift) ); *_ptr++ = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i+2] + verWeight*downLinePtr[i+2]) >> (2*shift) ); *_ptr++ = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i+3] + verWeight*downLinePtr[i+3]) >> (2*shift) ); } for(; i < dw; i++) { *_ptr++ = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i] + verWeight*downLinePtr[i]) >> (2*shift) ); } preVerUpIdx = verUpIdx; preVerDownIdx = verDownIdx; } delete []rowBuf1; delete []rowBuf2; delete []horWeight; delete []horLeftIdx; delete []horRightIdx; } 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – 为什么`before_save`在Rails 4中不起作用
- 如何加载指定路径的Logback.xml
- c# – Reactive Extensions SelectMany包含大对象
- c – 为什么std :: vector erase中需要begin()?
- cocos2d-x 一些需要记住的小知识d
- 通过adb工具查看sqlite3数据库
- c# – 在ASP.NET中的其他AppDomain中运行应用程序
- reactjs – React中事件处理程序的奇怪行为
- ruby-on-rails – 通过elasticsearch(带轮胎)的排行榜排名
- ruby – Chef传递修订变量以部署资源