Jpeg图像转yuv 16倍数问题(第一季)
在前些日子,具体的日子已经记不太清了,反正是有这么一天要实现个功能,就是读取一张jpeg图片,要能够转换成yuv420格式。
通过搜索和大家的帮助也似乎找到了这个一个开源库(jpeglib),确实也正常开始使用了。但是使用的过程中存在个问题就是jpge的图像的长度和宽度好像是要16的倍数,否则运行就会出错,但一直找不到问题就这样将就用到今天,不知道大家是否碰到同样的问题有没有更好的解决方法。
奉上一段代码,还请大家指定指定
//解码成yuv 4:2:0 virtual int DecodeJpeg2YUV(unsigned char* pBuffer, int nSize) { //判断是否是jpge格式 if (pBuffer[0] != 0xFF) { return IMAGLIB_FORMAT_ERR; //格式不对 } jpeg_decompress_struct info_; info_.err = jpeg_std_error(&e_); jpeg_create_decompress(&info_); jpeg_mem_src(&info_, pBuffer, nSize); //// 指定图片在内存的地址及大小 jpeg_read_header(&info_, 1); if (0 != info_.image_height%16 || 0 != info_.image_width%16) { jpeg_destroy_decompress(&info_); return IMAGLIB_SIZE_ERR; //图片尺寸不对。 } int n = info_.max_v_samp_factor * info_.min_DCT_scaled_size; if (n != 16) { return -1; //一定要为16,jpeg_read_raw_data 才能正常 } info_.raw_data_out = 1; jpeg_start_decompress(&info_); int nPicHeight = info_.output_height; int nPicWidth = info_.output_width; int nLen = nPicHeight * nPicWidth; m_nWidth = nPicWidth; m_nHeight = nPicHeight; NEW_BUFFER(m_pYbuffer, nLen); NEW_BUFFER(m_pUbuffer, nLen); NEW_BUFFER(m_pVbuffer, nLen); for (int i = 0; i < 3; ++i) { if (NULL != m_pBuffer[i]) { delete [] m_pBuffer[i]; m_pBuffer[i] = new unsigned char*[nLen]; } else { m_pBuffer[i] = new unsigned char*[nLen]; } yuvptr_[i] = m_pBuffer[i]; } unsigned char* row = m_pYbuffer; yuvptr_[0][0] = row; for ( i = 0; i < nPicHeight; ++i, row += nPicWidth) { yuvptr_[0][i] = row; //y 分量空间初始化 } row = m_pUbuffer; for (i = 0; i < nPicHeight; i += 2, row += nPicWidth / 2) { yuvptr_[1][i / 2] = row; //u 分量初始化 } row = m_pVbuffer; for ( i = 0; i < nPicHeight; i += 2, row += nPicWidth / 2) { yuvptr_[2][i / 2] = row; } for ( i = 0; i < info_.output_height; i += n) { jpeg_read_raw_data(&info_, yuvptr_, n); yuvptr_[0] += n; yuvptr_[1] += n/2; yuvptr_[2] += n/2; } jpeg_finish_decompress(&info_); jpeg_destroy_decompress(&info_); return 0; }
经过分析很有可能是以下代码有问题,导致读入的行数不对,因为对jpeg不熟悉目前找不到具体的原因在什么地方?
for ( i = 0; i < info_.output_height; i += n) { jpeg_read_raw_data(&info_, yuvptr_, n); yuvptr_[0] += n; yuvptr_[1] += n/2; yuvptr_[2] += n/2; }
待续(第二季)
)
浙公网安备 33010602011771号