1、给图片加上边框
定义一个边框厚度(border),让Y从此处开始计算
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define outPutFileName "girl_4.yuv"
int testYuv420Grey(char* fileName, int width, int height,int border)
{
FILE* fp;
FILE* fp1;
unsigned char* readBuf;
readBuf = (unsigned char*)malloc(width * height * 3 / 2);
fp = fopen(fileName, "rb+");
fp1 = fopen(outPutFileName, "wb+");
//读取YUV文件
fread(readBuf, 1, width * height, fp);
//改写Y分量的宽度
for (int j = 0; j < height; j++) {
for (int k = 0; k < width; k++) {
if (k<border || k>(width - border) || j<border || j>(height - border)) {
readBuf[j * width + k] = 255; //边界值
//readBuf[j*w+k]=0;
}
}
}
写入到新的YUV
fwrite(readBuf, 1, width * height * 3 / 2, fp1);
free(readBuf);
fclose(fp);
fclose(fp1);
}
int main()
{
testYuv420Grey("girl_1.yuv", 1280, 720, 30);
return 0;
}
还是有问题,明天去问问大佬。
但单独用Y显示就没问题。
二、自己制作一个灰阶测试图
由于是灰色的测试图,所以需要将U和V设置为128,然后设置一个固定的宽度,将图片的宽度均分即可。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int testYuv420Grey(int width, int height, int min, int max, int barnum, char *jieti)
{
int barwidth; //定义阶梯的宽度
float lum_inc; //定义亮度值
int uv_width, uv_height; //u和v的长宽
FILE* fp;
unsigned int readBuf;
unsigned char *data_y;
unsigned char* data_u;
unsigned char* data_v;
int i = 0, j = 0, k = 0;
uv_width = width / 2;
uv_height = height / 2;
barwidth = width / barnum; //每个阶梯的宽度都等于总宽除阶梯数
lum_inc = ((float)(max - min))/((float)(barnum - 1));
data_y = (unsigned char*)malloc(width * height);
data_u = (unsigned char*)malloc(uv_width * uv_height);
data_v = (unsigned char*)malloc(uv_width * uv_height);
//判断是否成功
if ((fp = fopen(jieti, "wb+")) == NULL)
{
printf("error:can not creadt file\n");
return - 1;
}
//创建数据
//Y
for (j = 0; j < height; j++) {
for (i = 0; i < width; i++) {
k = i / barwidth;
readBuf = min + (char)(k * lum_inc);
data_y[j * width + i] = readBuf;
}
}
//U
for (j = 0; j < uv_height; j++) {
for (i = 0; i < uv_width; i++) {
data_u[j * uv_width + i] = 128;
}
}
//V
for (j = 0; j < uv_height; j++) {
for (i = 0; i < uv_width; i++) {
data_v[j * uv_width + i] = 128;
}
}
//输出是数据
printf("Y, U, V value from picture's left to right:\n");
for (k = 0; k < (width / barwidth); k++) {
readBuf = min + (char)(k * lum_inc);
printf("%d, 128, 128\n", readBuf);
}
fwrite(data_y, width * height, 1, fp);
fwrite(data_u, uv_width * uv_height, 1, fp);
fwrite(data_v, uv_width * uv_height, 1, fp);
free(data_y);
free(data_u);
free(data_v);
fclose(fp);
return 0;
}
int main()
{
testYuv420Grey(1280, 720, 0, 255, 10, "jieti.yuv");
return 0;
}