首页 > 家居知识 > 马赛克是怎么移动的?

马赛克是怎么移动的? 2011-05-31

问题补充:

马赛克是怎么移动的?

使用相邻的几个像素同时表现为同一个像素值,不就等于将像素放大了吗?只是如果我们把指定区域中的每一个像素都进行这样的放大处理后,马赛克区域将超出用户最初指定的区域(如果用户指定区域的宽度为w,像素水平放大的比率为ratiox,则这种马赛克处理后的区域宽度将覆盖wxratiox)。如何将马赛克处理后的区域仍然限定在用户指定的区域内呢?笔者的做法是,对指定区域内的像素进行一次亚采样。如图2,假设我们将对图像中的R1区域进行马赛克处理。图2需要进行马赛克处理的区域  假设R1区域的像素排列如图3:图3R1区域的像素示意图  再假设像素的水平放大比率(ratiox)为3,垂直放大比率(ratioy)也为3,则经过马赛克处理后各对应位置像素值分布如图4:图4R1区域经过马赛克处理后的像素示意图  我们看到在R1区域内,水平方向上每3个像素采样1次(P00、P03、P06、P09、P30、P33、P36、P39、P60、P63、P66、P69等都是采样点),垂直方向上每个采样像素行都重复3次(第2、3行复制第1行的内容,第5、6行复制第4行的内容,以此类推);每个采样点像素都被放大到一个3x3的宏块,也就是说,采样点像素被放大了9倍。  图像指定区域马赛克处理的C++实现//图像帧数据指针PBYTEpImage;//获取图像数据//…//指向图像第1行开头的指针PBYTEpImageTopLine=NULL;//图像的跨度(以字节为单位)longimageStride=0;//如果图像数据是以从下往上的扫描顺序存储的,//则图像的第1行应该在pImage数据的倒数第1行;//如果图像数据是以从上往下的扫描顺序存储的,//则图像的第1行就是pImage指的位置if(m_bIsBottomUp){ imageStride=-m_nImageStride; pImageTopLine=pImage+m_nImageStride*(m_nImageHeight-1);}else{ imageStride=m_nImageStride; pImageTopLine=pImage;}//ratioX是水平方向上像素的放大倍数//ratioY是垂直方向上像素的放大倍数//maskStride为进行马赛克处理的区域的宽度(以字节为单位)/*macroWidth和macorHeight有如下计算关系:RECTm_MaskRect;//需要进行马赛克处理的矩形区域(由用户指定)intmaskWidth=m_MaskRect.right-m_MaskRect.left+1;intmaskHeight=m_MaskRect.bottom-m_MaskRect.top+1;macroWidth=maskWidth/m_nRatioX;macroHeight=maskHeight/m_nRatioY;*/intmacroWidth,macroHeight,maskStride,ratioX,ratioY;//马赛克处理过程中://pMaskPixel指向当前像素,//pMaskLine指向当前行,//pMaskNextLine下一行PBYTEpMaskTopLine,pMaskLine,pMaskNextLine,pMaskPixel;//pMaskTopLine指向需要进行马赛克处理的区域的第1行//注:m_nPixelBytes为单个像素占用的字节数pMaskTopLine=pImageTopLine+m_MaskRect.top*imageStride+m_MaskRect.left*m_nPixelBytes;macroWidth=m_nMacroWidth;macroHeight=m_nMacroHeight;maskStride=m_nMaskStride;ratioX=m_nRatioX;ratioY=m_nRatioY;//扫描指定区域的像素,进行马赛克处理…intcycle=0;for(inti=0;i<macroHeight;i++){ //定位需要进行马赛克处理的当前行 pMaskLine=pMaskTopLine+i*ratioY*imageStride; //定位需要进行马赛克处理的当前像素 pMaskPixel=pMaskLine; for(intj=0;j<macroWidth;j++) {  //水平方向上进行像素放大  for(cycle=0;cycle<ratioX-1;cycle++)  {   //将当前像素值复制给右边的下一个像素   memcpy(pMaskPixel+m_nPixelBytes,pMaskPixel,m_nPixelBytes);   //指向下一个像素   pMaskPixel+=m_nPixelBytes;  }  //指向下一个采样像素  pMaskPixel+=m_nPixelBytes; } //垂直方向上进行像素放大 for(cycle=0;cycle<ratioY-1;cycle++) {  //获得马赛克处理区域的下一行指针  pMaskNextLine=pMaskLine+imageStride;  //将马赛克处理区域的当前行(已经完成马赛克处理)复制给下一行  memcpy(pMaskNextLine,pMaskLine,maskStride);  //修改当前行指针,指向下一行  pMaskLine=pMaskNextLine;

相关知识

马赛克是怎么移动的?
瓷砖缝隙如何处理?听听小编是怎么说的吧!
视频中的马赛克是怎样产生的?
国际睡眠日小调查 你家床垫是怎么买的
家纺布艺企业都是怎么经营的?
看看百万别墅是怎么装的 多风格装修(组图)
健康澡是怎么激活的?——探析Mr-Hot助手上门清洗流程
漂亮的家是怎么来的 现代家居创意美图
品味春色家品:设计师你到底是怎么想的!
根据一室一厅平面图 来看看一室一厅是怎么装修的

本文来自 家居装修知识网 马赛克是怎么移动的? https://biud.com.cn/zhidao-view-id-43261.html