#define PIC_TOTAL_HEIGHT 384
#define PIC_VALID_HEIGHT 360
bool ReadAbsolutePathFile(const char* pAbsolutePath, const char* pMode, unsigned char* pData/*out*/, long& nLen)
{
if (!pAbsolutePath || !pMode || !pData) {
return false;
}
FILE* pFile = fopen(pAbsolutePath, pMode);
if (pFile) {
fseek(pFile, 0, SEEK_END);
nLen = ftell(pFile);
fseek(pFile, 0, SEEK_SET);
nLen = fread(pData, 1, nLen, pFile);
fclose(pFile);
return true;
}
return false;
}
int main()
{
unsigned char* pData = new unsigned char[1920 * 1080 * 3];
int nWidth = 1920;
int nHeight = 1080;
cv::Mat stNv12_1920x1080(nHeight * 1.5, nWidth, CV_8UC1);
long nLen1920x1080 = 0;
ReadAbsolutePathFile("D:\\ImageToNv12\\1920x1080.yuv", "rb+", pData, nLen1920x1080);
memcpy(stNv12_1920x1080.data, pData, nLen1920x1080);
cv::Mat stNv12_640x360(PIC_VALID_HEIGHT * 1.5f, 640, CV_8UC1);
cv::resize(stNv12_1920x1080, stNv12_640x360, stNv12_640x360.size());//在windows下测试, 发现 resize 函数使用后会将NV12转成NV21了
for (int i = 640 * PIC_VALID_HEIGHT; i < 640 * PIC_VALID_HEIGHT * 3 / 2; i += 2) {//直接将VU分量改成UV分量
int nTemp = stNv12_640x360.data[i];
stNv12_640x360.data[i] = stNv12_640x360.data[i + 1];
stNv12_640x360.data[i + 1] = nTemp;
}
delete[] pData;
pData = NULL;
}
将1920*1080的NV12缩放成640*360大小的NV12