博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jpeg图像转yuv 16倍数问题(第二季)
阅读量:4946 次
发布时间:2019-06-11

本文共 3904 字,大约阅读时间需要 13 分钟。

  第一季中说到可能是jpeg_read_raw_data 中当图片的长度和宽度不是16的倍数会导致问题,这个问题对我来说要找到问题有点难度!

那能不能换个策略呢,在网上搜索看到不少的人用while (info_.output_scanline < info_.output_height)来控制读取数据,那应该可以尝试下:

基本思路是当图片的长度和宽度转换成4的倍数,采取多取像素原则(导致看到的图像边缘是红色或者别的颜色),基本上大多数尺寸的图片都可以读取。

在大量的测试过程中,发现个致命的问题:

  在释放 image_one[ci][bi]时会崩溃,经排除是jpeg_read_raw_data(&info_, image_one, (JDIMENSION)16) 导致数组越界,估计还是有的地方没有考虑到,

但是因为都这个库不熟悉又不知道怎么处理但好处是比以前的代码简洁易懂,可是不释放运行过久将导致内存崩溃。

  又是一个摆在眼前需要解决的问题? 不知道大家有没有碰到类似的问题。

  奉上代码

  (待续:第三季)

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);   //// 指定图片在内存的地址及大小            // Get all compression parameters.        jpeg_read_header(&info_, 1);                     // Configure the decompressors for raw data output.        info_.raw_data_out = TRUE;                  jpeg_start_decompress(&info_);                       int nPicHeight = 0;        int nPicWidth  = 0;            //因为行的获取要4的倍数,可以修改值为4的倍数        if (0 != info_.output_width % 4)        {             nPicWidth  = info_.output_width/16*16 + 16;        }        else        {            nPicWidth = info_.output_width;         }        if (0 != info_.output_height % 4)        {            nPicHeight  = info_.output_height/16*16 + 16;        }        else        {            nPicHeight = info_.output_height;         }        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);                    //分配内存获取数据        int yx, yr,ci,bi;        int yrowmcu = 0;        JSAMPIMAGE image_one = (JSAMPIMAGE)malloc(3 * sizeof(JSAMPARRAY));            for (ci = 0; ci < 3; ci++)        {            image_one[ci] = (JSAMPARRAY)malloc(16 * sizeof(JSAMPROW));                    for (bi = 0; bi < 16; bi++)            {                //image_one[ci][bi] = (JSAMPROW)malloc(info_.output_width * sizeof(JSAMPLE));                image_one[ci][bi] = (JSAMPROW)malloc(m_nWidth * sizeof(JSAMPLE));            }        }                    int nReadHeight = 0, yc = 0;        int numfields = 1;        while (info_.output_scanline < info_.output_height)        {            //读取数据            jpeg_read_raw_data(&info_, image_one, (JDIMENSION)16);            for (yr = 0; yr < 16; nReadHeight+=numfields, yr++)                    {                int xd =  nReadHeight*nPicWidth;                //防止超过长度读取。                if ((nReadHeight) >= info_.output_height)                {                    continue;                }                 for (yx = 0; yx < info_.output_width; yx++)                 {                     m_pYbuffer[xd++] = image_one[0][yr][yx];                 }                            }                                     for (yr = 0; yr < 8;  yr++, yc += numfields)             {                if (yc >= info_.output_height/2)                {                    continue;                }                int xd = yc * nPicWidth / 2;                 for (yx = 0; yx < info_.output_width / 2; yx++, xd++)                 {                    m_pUbuffer[xd] = image_one[1][yr][yx];                    m_pVbuffer[xd] = image_one[2][yr][yx];                 }             }        }        for (ci = 0; ci < 3; ci++)        {             for (bi = 0; bi < 16; bi++)             {                 free(image_one[ci][bi]);             }                        free(image_one[ci]);                    }        free(image_one);        jpeg_finish_decompress(&info_);         jpeg_destroy_decompress(&info_);         return 0;        }

 

转载于:https://www.cnblogs.com/ugly927846/archive/2013/06/08/3127226.html

你可能感兴趣的文章
利用CMake管理QT5.5+VTK6.3+ITK4.8+Opencv3.0工程
查看>>
使用WinDbg分析.dump文件找出CPU占用与内存占用的问题根源
查看>>
Django搭建fastdfs错误
查看>>
mockito简单教程
查看>>
hive小tips(各种解析)
查看>>
pyspider 示例二 升级完整版绕过懒加载,直接读取图片
查看>>
win7 64位 python启动报错:无法启动此程序,因为计算机中丢失api-ms-win-crt-process-l1-1-0.dll...
查看>>
1.7动态输入详解
查看>>
call(),apply(),bind()区别?
查看>>
【转】最通用的分页存储过程SqlServer
查看>>
K8S 日志收集(三):ES 集群安装
查看>>
使用DirectDraw直接显示YUV视频数据 分类: windows...
查看>>
jquery笔记
查看>>
Thinkphp+ajaxFileUpload实现异步图片传输
查看>>
maven run 配置jre VM arguments配置 (转)
查看>>
近一周学习之-----vue学习快乐之旅(1)
查看>>
一个半路转行的初级程序员
查看>>
Vue项目如何关闭Eslint检测
查看>>
Java中的接口(interface)
查看>>
PHP图片裁剪类
查看>>