libjpeg实现YUV转jpeg
生活随笔
收集整理的這篇文章主要介紹了
libjpeg实现YUV转jpeg
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
YUV格式理解
- Y代表亮度信號,UV代表色度信號。
- YUV444色度信號分辨率最高。每一個像素都有對應的色度與亮度。
- 對于YUV411 YUV420 YUV 422這些都是消減了色度。
- YUV422:4個點亮度,就有2個點U和2點V。
- YUY2/YUYV:每個像素都保留了Y分量。四個字節表示2個像素點。如1920x1080圖片的文件大小為1920x1080x2=4M
圖片數據流存儲理解
YUV2數據流順序:?Y0?U0?Y1?V0????Y2?U2?Y3?V2
UYVY數據流順序: U0?Y0?V0?Y1????U2?Y2?V2?Y3
libjpeg庫函數理解
uint32_t yuv420sp_to_jpg(int width, int height, unsigned char *inputYuv,unsigned char *outJpeg) {struct jpeg_compress_struct cinfo;struct jpeg_error_mgr jerr;JSAMPROW row_pointer[1];int i = 0, j = 0;unsigned char *pY, *pU, *pV;unsigned char yuvbuf[width * 3];unsigned long outSize;cinfo.err = jpeg_std_error(&jerr);//用于錯誤信息jpeg_create_compress(&cinfo); //初始化壓縮對象jpeg_mem_dest(&cinfo, &outJpeg, &outSize);cinfo.image_width = width;//設置輸入圖片寬度cinfo.image_height = height;//設置圖片高度cinfo.input_components = 3;cinfo.in_color_space = JCS_YCbCr;//設置輸入圖片的格式,支持RGB/YUV/YCC等等cinfo.dct_method = JDCT_FLOAT;jpeg_set_defaults(&cinfo);//其它參數設置為默認的!jpeg_set_quality(&cinfo, 40, TRUE);//設置轉化圖片質量,范圍0-100jpeg_start_compress(&cinfo, TRUE);pY = inputYuv ;pU = inputYuv +1 ;pV = inputYuv + 3;j = 1;while (cinfo.next_scanline < cinfo.image_height) {int index = 0;for (i = 0; i < width; i += 2){//輸入的YUV圖片格式為標準的YUV444格式,所以需要把YUV420轉化成YUV444.yuvbuf[index++] = *pY;yuvbuf[index++] = *pU;yuvbuf[index++] = *pV;pY += 2;yuvbuf[index++] = *pY;yuvbuf[index++] = *pU;yuvbuf[index++] = *pV;pY += 2;pU += 4;pV += 4;}row_pointer[0] = yuvbuf;(void)jpeg_write_scanlines(&cinfo, row_pointer, 1);//單行圖片轉換壓縮j++;}jpeg_finish_compress(&cinfo);jpeg_destroy_compress(&cinfo);return (uint32_t)outSize; }運行示例
下載示例鏈接(運行環境VS2013):https://download.csdn.net/download/fengweibo112/10971728
運行過后,在工程目錄下可以看到輸出的jpeg圖片。
總結
以上是生活随笔為你收集整理的libjpeg实现YUV转jpeg的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件开发工具【四】 之 软件开发工具的技
- 下一篇: 彻底关闭WINDOWS默认共享的4种方法