一.图像数据压缩 放大 裁剪 原理 与实现
图像数据压缩 放大 裁剪 简单的实现一般可以使用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数据简介 与压缩处理-优快云博客