RGB图像数据压缩 放大 裁剪 原理 与实现

一.图像数据压缩 放大 裁剪 原理 与实现

图像数据压缩 放大 裁剪 简单的实现一般可以使用libyuv可以处理,但是如果在一些存储空间比较有限的项目或者只是简单的使用却要移植这些库是非常不方便的。图像数据的缩小 放大 裁剪可以用等比例算法实现,本文先只用RGB图像数据来显示

二.理解RGB彩色图像 ,RGB分量的意义
1.R Red,G  Green,B Blue 每一种颜色在视觉效果上都可以不同比例的 红 蓝 绿 三种颜色来合成
3.彩色图像的一个像素都可由RGB 组成
4.RGB分量:R G B三个颜色是RGB图像的分量,每一个分量的取值范围:0~255,数据类型一般为8位无符号的整型 

                                                         

RGB放大:

特殊的宽度1706放大到1760 高度不变,宽缺少54个像素,可以由前一个像素补上,约为1706/54=32 ,每行32个数值补上一个像素

    char *dstBuf = new char[1760*1280*3];
    int dstH = 0;
    int dstW = 0;
    for(int h=0;h<1280;h++){
        for(int w=0;w<1706;w++){
            dstBuf[((dstW + dstH*1760)*3)]=  rgbBuf[((w+h*width)*3)] ;//r
            dstBuf[((dstW + dstH*1760)*3)+1] = rgbBuf[((w+h*width)*3)+1] ;//g
            dstBuf[((dstW + dstH*1760)*3)+2] = rgbBuf[((w+h*width)*3)+2] ;//b
    
            dstW++;
            if((dstW % 32 == 0) && dstW < 1760){
                
                dstBuf[((dstW + dstH*1760)*3)]=  rgbBuf[((w+h*width)*3)] ;//r
                dstBuf[((dstW + dstH*1760)*3)+1] = rgbBuf[((w+h*width)*3)+1] ;//g
                dstBuf[((dstW + dstH*1760)*3)+2] = rgbBuf[((w+h*width)*3)+2] ;//b
                dstW++;
            }
        }
        dstH++;
        dstW= 0;
        // printf("dstH %d",dstH);
    }
    writeFile(dstBuf,1760*1280*3,"1760x1280.rgb");

效果如下:

RGB缩小:

RGB缩小原理:

按比例压缩,例如1760x1280-->1280x720  w:11|8  h:16|9 ,既宽1760分成每份11个像素取8个像素可凑成1280 高1280分成每份16个像素取9个像素可凑成720

C代码:

    dstH = 0;
    dstW = 0;
    for(int h=0;h<1280;h+=2){
        for(int w=0;w<1760;w++){
            if(w%11 == 0 || w%11 == 2 || w%11 == 3 || w%11 == 4
            || w%11 == 6 || w%11 == 7 || w%11 == 8 || w%11 == 10
            ){
                dstBuf[((dstW + dstH*1280)*3)]=  rgbBuf[((w+h*1760)*3)] ;//r
                dstBuf[((dstW + dstH*1280)*3)+1] = rgbBuf[((w+h*1760)*3)+1] ;//g
                dstBuf[((dstW + dstH*1280)*3)+2] = rgbBuf[((w+h*1760)*3)+2] ;//b
                dstW++;
            }
        }
        dstH++;
        dstW= 0;
        if(h % 16 == 14){
           for(int w=0;w<1760;w++){
            if(w%11 == 0 || w%11 == 2 || w%11 == 3 || w%11 == 4
            || w%11 == 6 || w%11 == 7 || w%11 == 8 || w%11 == 10
            ){
                dstBuf[((dstW + dstH*1280)*3)]=  rgbBuf[((w+h*1760)*3)] ;//r
                dstBuf[((dstW + dstH*1280)*3)+1] = rgbBuf[((w+h*1760)*3)+1] ;//g
                dstBuf[((dstW + dstH*1280)*3)+2] = rgbBuf[((w+h*1760)*3)+2] ;//b
                dstW++;
            }
           }
           dstH++;
        }
        dstW= 0;
    }
    writeFile(dstBuf,1280 *720 *3,"1280x720.rgb");

效果: 

对应的代码在附近链接

YUV相关博文:Yuv数据简介 与压缩处理-CSDN博客

  • 33
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hmbbPdx_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值