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;        
        }

待续(第二季)

 

 

posted on 2013-06-07 12:57  欣客  阅读(1051)  评论(0)    收藏  举报