{"id":913,"date":"2022-11-30T15:02:24","date_gmt":"2022-11-30T07:02:24","guid":{"rendered":"https:\/\/swordofmorning.com\/?p=913"},"modified":"2025-10-09T13:55:19","modified_gmt":"2025-10-09T05:55:19","slug":"linux-media-03-save-as-jpeg-and-png","status":"publish","type":"post","link":"https:\/\/swordofmorning.com\/index.php\/2022\/11\/30\/linux-media-03-save-as-jpeg-and-png\/","title":{"rendered":"Linux Media 03 Save as JPEG and PNG"},"content":{"rendered":"<p><div class=\"has-toc have-toc\"><\/div><\/p>\n<p>&emsp;&emsp;Here is an example of how to save pic as JPEG or PNG via libjpeg or libpng.<\/p>\n<h2>\u00a71 JPEG<\/h2>\n<pre><code class=\"language-c\">int imgwrp_jpeg_quality = 100;\n\nint YUYV_to_JPG(uint8_t* yuvData, int imgWidth, int imgHeight)\n{\n    int retval = 0;\n\n    \/* ===== open file ===== *\/\n    FILE* fp;\n    fp = fopen(&quot;img.jpg&quot;, &quot;wb&quot;);\n    if (!fp)\n    {\n        retval = 1;\n        perror(&quot;RGB24_to_JPG(): open file&quot;);\n        goto out_return;\n    }\n\n    \/* ===== jpg init ===== *\/\n    JSAMPROW row_pointer[1];\n    struct jpeg_compress_struct cinfo;\n    struct jpeg_error_mgr jerr;\n\n    cinfo.err = jpeg_std_error(&amp;jerr);  \/\/ init error info first\n    jpeg_create_compress(&amp;cinfo);\n    jpeg_stdio_dest(&amp;cinfo, fp);\n\n    \/* ===== img setting ===== *\/\n    cinfo.image_width = imgWidth;\n    cinfo.image_height = imgHeight;\n    cinfo.input_components = 3;         \/\/ color components for each pixel\n    cinfo.in_color_space = JCS_YCbCr;\n\n    jpeg_set_defaults(&amp;cinfo);\n    jpeg_set_quality(&amp;cinfo, imgwrp_jpeg_quality, FALSE);\n    jpeg_start_compress(&amp;cinfo, TRUE);\n\n    \/* ===== write data ===== *\/\n    uint8_t* buf = (uint8_t*)malloc(sizeof(uint8_t) * imgWidth * 3);\n    while (cinfo.next_scanline &lt; cinfo.image_height) \n    { \n        for (int i = 0; i &lt; cinfo.image_width; i += 2) \n        { \n            buf[i*3] = yuvData[i*2]; \n            buf[i*3+1] = yuvData[i*2+1]; \n            buf[i*3+2] = yuvData[i*2+3]; \n            buf[i*3+3] = yuvData[i*2+2]; \n            buf[i*3+4] = yuvData[i*2+1]; \n            buf[i*3+5] = yuvData[i*2+3]; \n        } \n        row_pointer[0] = buf; \n        yuvData += imgWidth * 2; \n        jpeg_write_scanlines(&amp;cinfo, row_pointer, 1); \n    }\n    jpeg_finish_compress(&amp;cinfo);\n    jpeg_destroy_compress(&amp;cinfo);\n    free(buf);\n\nout_close_fp:\n    if (fp) fclose(fp);\n\nout_return:\n    return retval;\n}<\/code><\/pre>\n<h2>\u00a72 PNG<\/h2>\n<pre><code class=\"language-c\">int RGB24_to_PNG(uint8_t* rgbData, int imgWidth, int imgHeight)\n{\n    int retval = 0;\n\n    \/* ===== open file ===== *\/\n    FILE* fp;\n    fp = fopen(&quot;img.png&quot;, &quot;wb&quot;);\n    if (!fp)\n    {\n        retval = 1;\n        perror(&quot;RGB24_to_PNG(): open file&quot;);\n        goto out_return;\n    }\n\n    \/* ===== png struct ===== *\/\n    png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\n    png_infop info_ptr = png_create_info_struct(png_ptr);\n    if (!png_ptr || !info_ptr)\n    {\n        retval = 2;\n        perror(&quot;RGB24_to_PNG(): png init&quot;);\n        goto out_close_fp;\n    }\n\n    \/* ===== io init ===== *\/\n    png_init_io(png_ptr, fp);\n    png_set_IHDR(png_ptr, info_ptr, imgWidth, imgHeight, 8, PNG_COLOR_TYPE_RGB,\n                PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);\n    png_write_info(png_ptr, info_ptr);\n    png_set_packing(png_ptr);\n\n    \/* ===== write data ===== *\/\n    uint8_t* rowData = (uint8_t*)malloc(sizeof(uint8_t) * imgWidth * 3);\n    int rgbIdx = 0;\n    \/\/ for i rows\n    for (int i = 0; i &lt; imgHeight; ++i)\n    {\n        \/\/ copy each row data\n        for (int j = 0; j &lt; imgWidth; ++j)\n        {\n            rowData[j * 3 + 0] = rgbData[rgbIdx++];\n            rowData[j * 3 + 1] = rgbData[rgbIdx++];\n            rowData[j * 3 + 2] = rgbData[rgbIdx++];\n        }\n        \/\/ write row\n        png_write_row(png_ptr, rowData);\n    }\n    png_write_end(png_ptr, info_ptr);\n\nout_free:\n    if (rowData) free(rowData);\n    png_destroy_write_struct(&amp;png_ptr, &amp;info_ptr);\n\nout_close_fp:\n    if (fp) fclose(fp);\n\nout_return:\n    return retval;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>&emsp;&emsp;Here is an example of how to save pic as JPEG or PNG  &#8230;<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[54],"tags":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/913"}],"collection":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/comments?post=913"}],"version-history":[{"count":1,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/913\/revisions"}],"predecessor-version":[{"id":914,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/913\/revisions\/914"}],"wp:attachment":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/media?parent=913"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/categories?post=913"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/tags?post=913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}