C/C++ RGB水平翻转

程序很简单,主要想测试一下对代码进行优化的效果。

先看普通方法写的程序(改进前):

//--------------------------------------------------------

 * 函数名称:
   HorizontalFlip()
 *
 * 功能:
   RGB图像水平翻转操作
 *
 * 参数:
   prgb
  RGB图像指针(24bit)
  iWidth
  源图像宽度(像素数)(输入参数)
   iHeight
  源图像高度(像素数)(输入参数)
 *
 * 返回值:float
   成功返回动态范围,否则返回0.
 *
 * Copyright @ 2011 rights reserved.
//--------------------------------------------------------

bool HorizontalFlip(unsigned char* prgb, int iWidth, int iHeight)
{
 // 输入参数合法性判断
 if(prgb==NULL||iWidth<=0||iHeight<=0)return false;

 

 // 每行图像数据的字节数
 int iLBytes  = (iWidth*24+31)/32*4;

 

 // 临时RGB图像指针
 unsigned char *prgbtmp  = (unsigned char*)malloc(iLBytes*iHeight);


 if(prgbtmp == NULL){
  return false;
 }else{
  memset(prgbtmp , 0 , iLBytes*iHeight);
 }

 

 // 每行
 for(int i = 0; i < iHeight; i++)
 {
  // 每列
  for(int j = 0; j < iWidth; j++)
  {
   memcpy((prgbtmp + iLBytes * (iHeight - 1 - i) + 3*(iWidth - 1 -j)) , (prgb + iLBytes * (iHeight - 1 - i) + 3*j) , 3);
  }
 }
 memcpy(prgb , prgbtmp , iLBytes*iHeight);
 free(prgbtmp);
 return true;
}

 

一位好朋友建议的优化方案:

http://www.cnblogs.com/ubunoon/archive/2011/03/10/common_image_optimization.html

 

程序优化后如下:

//--------------------------------------------------------

* 函数名称:
   OptiHorizontalFlip()
 *
 * 功能:
   RGB图像水平翻转操作[代码经过优化]
 *
 * 参数:
   prgb
  RGB图像指针(24bit)
  iWidth
  源图像宽度(像素数)(输入参数)
   iHeight
  源图像高度(像素数)(输入参数)
 *
 * 返回值:float
   成功返回动态范围,否则返回0.
 *
 * Copyright @ 2011 rights reserved.

//--------------------------------------------------------

bool OptiHorizontalFlip(unsigned char* prgb, int iWidth, int iHeight)
{
 // 输入参数合法性判断
 if(prgb==NULL||iWidth<=0||iHeight<=0)return false;

 

 // 每行图像数据的字节数
 int iLBytes  = (iWidth*24+31)/32*4;

 int itmp = iLBytes*iHeight;

 

 // 临时RGB图像指针
 unsigned char *prgbtmp  = (unsigned char*)malloc(itmp); // itmp = iLBytes*iHeight;
 if(prgbtmp == NULL){
  return false;
 }else{
  memset(prgbtmp , 0 , itmp); // itmp = iLBytes*iHeight;
 }
 
 int temp_start_row = 0;
 int iWidth_1 = iWidth - 1;
 unsigned char* pdst = NULL;
 unsigned char* psrc = NULL;

 

 // 每行
 for(int i = 0; i < iHeight; i++)
 {
  pdst  = prgbtmp + temp_start_row;
  psrc  = prgb + temp_start_row;

  // 每列
  for(int j = 0; j < iWidth; j++)
  {
     memcpy((pdst  + 3*(iWidth_1 -j)) , (psrc + 3*j)  , 3);
  }
  temp_start_row += iLBytes; // 改乘法运算为加法
 }

 memcpy(prgb , prgbtmp , itmp); // itmp = iLBytes*iHeight;
 free(prgbtmp);
 return true;
}

### 回答1: RGB24和YUV2都是视频编码中常用的颜色空间格式,镜像是一种图像处理操作,将图像沿着垂直或水平方向翻转。 在RGB24中,图像使用红绿蓝三色通道来表示,每个像素点由24位数据组成,分别表示红、绿、蓝三种颜色的亮度。要实现RGB24的镜像,可以通过交换图像数据的位置来实现。具体步骤是,首先遍历图像的每一行,然后将每一行的像素点数据进行交换,即将第一个像素点与最后一个像素点交换位置,第二个像素点与倒数第二个像素点交换位置,以此类推,直到中间位置。这样就完成了对图像的水平镜像翻转。 YUV2是一种将彩色信号与亮度信号分离的编码格式,其中Y代表亮度信号,U和V代表色度信号。在YUV2中,每个像素的数据由16位组成,其中8位表示亮度信号Y,另外8位分别表示两个色度信号U和V。要实现YUV2的镜像,需要分别对亮度信号和色度信号进行镜像操作。步骤与RGB24类似,先对亮度信号进行水平镜像翻转,然后对色度信号进行同样的操作。 总结起来,无论是RGB24还是YUV2,要实现镜像操作都可以通过交换像素点的位置来完成。只需要遍历图像的每一行,然后对每一行的像素点数据进行交换即可。这样可以实现图像在垂直或水平方向上的镜像翻转。 ### 回答2: 要将RGB24和YUV2镜像,首先需要了解它们的格式和镜像操作的原理。 RGB24是一种颜色图像的编码格式,它使用24位来表示像素的颜色信息,每个像素由红、绿、蓝三个分量表示。而YUV2则是一种亮度和色度分离的编码格式,其中Y表示亮度分量,U和V分别表示蓝色和红色的色度分量。 针对RGB24的镜像操作,可以通过水平翻转像素的方式实现。即将一行中的像素颜色值反向存储,然后将第一行和最后一行的像素进行交换,第二行和倒数第二行的像素进行交换,以此类推。这样就能达到水平镜像的效果。 对于YUV2的镜像操作,需要分别对Y、U和V三个分量进行镜像。首先对Y分量进行水平镜像操作,然后对U和V分量进行相同的镜像操作。这样就能保持亮度分量不变,同时水平翻转色度分量,从而实现YUV2图像的镜像效果。 总结起来,对于RGB24和YUV2的镜像操作都是通过水平翻转像素的方式实现的。具体实施时,可以根据每个编码格式的规则对每个分量进行处理,最终得到镜像后的图像。 ### 回答3: c rgb24 yuv2是两种不同的颜色编码格式,而镜像是一种图像处理操作,将图像水平或垂直翻转。想要实现c rgb24 yuv2镜像操作,需要先了解这两种格式的特点和对应的算法。 首先,c rgb24是一种24位的RGB颜色编码格式,每个像素由8位的红色、绿色和蓝色分量组成。实现c rgb24镜像操作时,可以通过遍历图像的每一行,将每个像素的位置进行对称交换,即将第一个像素与最后一个像素位置交换,第二个像素与倒数第二个像素位置交换,以此类推,从而实现水平镜像操作。 而yuv2是一种压缩颜色编码格式,与rgb24类似,它也包含了亮度和色度分量。实现yuv2镜像的方法与c rgb24类似,可以通过遍历图像的每一行,在每一行内,将每个亮度和色度分量的位置进行对称交换。 无论是c rgb24还是yuv2镜像操作,都可以通过嵌套循环进行实现,第一个循环遍历图像的每一行,第二个循环遍历每个像素的分量,通过交换对应的位置,实现镜像效果。需要注意的是,在进行像素位置交换时,需要使用一个临时变量来保存交换前的值。 综上所述,c rgb24 yuv2镜像操作是一种通过交换像素位置实现图像翻转的处理方法,具体实现方法可以根据对应的编码格式进行针对性的编写。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值