{"id":74,"date":"2017-01-15T20:17:20","date_gmt":"2017-01-15T12:17:20","guid":{"rendered":"http:\/\/kogasa.moe\/?p=74"},"modified":"2018-04-29T13:31:16","modified_gmt":"2018-04-29T05:31:16","slug":"jpeglib%e4%bd%bf%e7%94%a8","status":"publish","type":"post","link":"https:\/\/flandre-scarlet.moe\/blog\/74\/","title":{"rendered":"jpeglib\u7684\u4f7f\u7528(\u4f7f\u7528VS2010\u7f16\u8bd1)"},"content":{"rendered":"<p>1\u3001\u7f16\u8bd1\u73af\u5883\u7684\u5b89\u88c5<br \/>\n\u3000\u30001.1 \u89e3\u538b\u4ece<a href=\"http:\/\/www.ijg.org\" target=\"_blank\" rel=\"noopener\">www.ijg.org<\/a>\u4e0a\u4e0b\u8f7d\u7684\u6e90\u7801\uff0c\u5b89\u88c5VS2010\u3002<br \/>\n\u3000\u30001.2 \u5728\u6253\u5f00cmd\u5b9a\u4f4d\u5230\u89e3\u538b\u540e\u7684jpeg\u5e93\u76ee\u5f55\u4e2d\uff0c\u5e76\u6267\u884c NMAKE \/f makefile.vc  setup-v10 \u3002\uff08\u5728install.txt\u7684&#8221;HINTS FOR SPECIFIC SYSTEMS&#8221;\u4e00\u8282\u4e2d\uff09\u6b64\u64cd\u4f5c\u5c06\u751f\u6210\uff08\u5176\u5b9e\u662f\u91cd\u547d\u540d\uff09vs2010\u7684\u4e00\u7cfb\u5217\u5de5\u7a0b\u6587\u4ef6\u3002\uff08\u63d0\u793anmake\u4e0d\u662f\u6709\u6548\u547d\u4ee4\u7684\u8bdd\u5219\u4fee\u8981\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\u7684path\u5e76\u91cd\u542fcmd\uff09<br \/>\n<!--more--><\/p>\n<p>\u3000\u3000\u3000\u3000\u64cd\u4f5c\u6548\u679c\u5982\u4e0b\uff1a<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren jconfig.vc jconfig.h<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makejsln.v10 jpeg.sln<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makeasln.v10 apps.sln<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makejvcx.v10 jpeg.vcxproj<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makejfil.v10 jpeg.vcxproj.filters<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makecvcx.v10 cjpeg.vcxproj<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makecfil.v10 cjpeg.vcxproj.filters<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makedvcx.v10 djpeg.vcxproj<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makedfil.v10 djpeg.vcxproj.filters<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren maketvcx.v10 jpegtran.vcxproj<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren maketfil.v10 jpegtran.vcxproj.filters<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makervcx.v10 rdjpgcom.vcxproj<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makerfil.v10 rdjpgcom.vcxproj.filters<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makewvcx.v10 wrjpgcom.vcxproj<br \/>\n\u3000\u3000\u3000\u3000\u3000\u3000ren makewfil.v10 wrjpgcom.vcxproj.filters<br \/>\n\u3000\u30001.3 \u8fd0\u884cvs2010\u6253\u5f00jpeg.sln\u5373\u53ef\u8fdb\u884c\u7f16\u8bd1\u751f\u6210\u3002<br \/>\n\u3000\u30001.4 \u5982\u679c\u81ea\u5df1\u7684\u7a0b\u5e8f\u662f\u7528\u522b\u7684\u7f16\u8bd1\u5668\u7248\u672c\u751f\u6210\u7684\uff0c\u5219\u5c06jpeg\u7684\u9879\u76ee\u6587\u4ef6\u5347\u7ea7\u81f3\u5bf9\u5e94\u7248\u672c\uff0c\u5e76\u4fee\u6539\u9879\u76ee\u5c5e\u6027\u4e2d&#8221;\u5e73\u53f0\u5de5\u5177\u96c6&#8221;\u4f7f\u5176\u4e0e\u4f60\u7684\u7a0b\u5e8f\u4fdd\u6301\u4e00\u81f4\u5373\u53ef\u3002<br \/>\n\u3000\u30001.5 \u7f16\u8bd1\u5982\u679c\u51fa\u73b0\u578b\u5982 < \u9ed8\u8ba4\u5e93\u201clibcmt.lib\u201d\u4e0e\u5176\u4ed6\u5e93\u7684\u4f7f\u7528\u51b2\u7a81\uff1b\u8bf7\u4f7f\u7528 \/NODEFAULTLIB:library > \u7684\u9519\u8bef\u63d0\u793a\u65f6\uff0c\u8bf4\u660e\u4f60\u7684\u7a0b\u5e8f\u548clib\u5e93\u4f7f\u7528\u7684\u8fd0\u884c\u65f6\u5e93\u4e0d\u540c\uff0c\u6700\u597d\u662f\u4f7f\u7528\u540c\u6837\u7684\u8fd0\u884c\u5e93\u94fe\u63a5\u65b9\u5f0f\uff08\/MT \/MTd \/MD \/MDd\uff09\uff0c\u6216\u8005\u6839\u636e\u63d0\u793a\u6dfb\u52a0\u5bf9\u5e94\u7684\u5ffd\u7565\u9879\uff08\u914d\u7f6e\u5c5e\u6027=>\u94fe\u63a5\u5668=>\u8f93\u5165=>\u5ffd\u7565\u7279\u5b9a\u5e93, \u5e93\u540d\u52a0\u53cc\u5f15\u53f7\uff0c\u7528\u9017\u53f7\u9694\u5f00\uff09<\/p>\n<p>2\u3001\u89e3\u538bjpeg\u56fe\u50cf<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">    \/\/ \u4ee5\u4e0b\u4ee3\u7801\u7701\u7565\u9519\u8bef\u5904\u7406\r\n\r\n    struct jpeg_decompress_struct cinfo;\r\n    \/\/ \u81ea\u5b9a\u4e49\u7684jpeg\u9519\u8bef\u5904\u7406\u5668\uff0c\u8981\u786e\u4fdd\u5b83\u7684\u5b58\u6d3b\u671f\u8d2f\u7a7f\u6574\u4e2a\u56fe\u50cf\u5904\u7406\u8fc7\u7a0b\r\n    struct my_error_mgr\r\n    \/*{\r\n     *    struct jpeg_error_mgr pub;\r\n     *    jmp_buf setjmp_buffer;\r\n     *}\r\n     *\/\r\n    jerr;\r\n\r\n    FILE * infile;\t\t\/\/ \u6e90\u6587\u4ef6\u5bf9\u8c61\r\n    JSAMPARRAY buffer;\t\t\/\/ \u884c\u8f93\u51fa\u7f13\u51b2\u533a\r\n    int row_stride;\t\t\/\/ \u56fe\u50cf\u6bcf\u884c\u7684\u5b57\u8282\u6570\r\n\r\n    fopen_s(&amp;infile, _filename, &quot;rb&quot;);\r\n\r\n    \/\/ \u521d\u59cb\u5316jpeg\u89e3\u538b\u5bf9\u8c61\u5e76\u8bbe\u7f6e\u9519\u8bef\u5904\u7406\u4f8b\u7a0b\r\n    cinfo.err = jpeg_std_error(&amp;jerr.pub);\r\n    jerr.pub.error_exit = my_error_exit;    \/\/ \u81ea\u5b9a\u4e49\u7684\u9519\u8bef\u5904\u7406\u4f8b\u7a0b void my_error_exit(j_common_ptr cinfo);\r\n    \r\n    \/\/ \u8bbe\u7f6e\u9519\u8bef\u5904\u7406\u8fd4\u56de\u70b9\r\n    if (setjmp(jerr.setjmp_buffer))\r\n    {\r\n        fprintf(stderr, &quot;\u8bfb\u53d6\u5931\u8d25\\r\\n&quot;);\r\n        jpeg_destroy_decompress(&amp;cinfo);\r\n        return;\r\n    }\r\n\r\n    jpeg_create_decompress(&amp;cinfo);\r\n\r\n    \/\/ \u8bbe\u7f6e\u8f93\u5165\u6570\u636e\u6765\u6e90\r\n    jpeg_stdio_src(&amp;cinfo, infile);\r\n\r\n    \/\/ \u4f7f\u7528jpeg_read_header()\u8bfb\u53d6jpeg\u6587\u4ef6\u57fa\u672c\u6570\u636e\r\n    \/\/ \u5728\u8c03\u7528jpeg_read_header()\u540e\u76f4\u5230\u8c03\u7528jpeg_finish_decompress()\u4e4b\u524d\u90fd\u4e0d\u5e94\u66f4\u6539\u8f93\u5165\u6587\u4ef6\uff0c\r\n    \/\/ \u5982\u679c\u8981\u6279\u91cf\u5904\u7406\u6587\u4ef6\u7684\u8bdd\u5e94\u8be5\u91cd\u590djpeg_read_header() \u5230 jpeg_finish_decompress() \u4e4b\u95f4\u7684\u64cd\u4f5c\r\n    jpeg_read_header(&amp;cinfo, TRUE);\r\n    \r\n    \/\/ \u50a8\u5b58\u6587\u4ef6\u5bbd\u9ad8\u7b49\u6570\u636e\r\n    \/\/ \u5982\u679c\u53ea\u662f\u60f3\u83b7\u53d6\u6587\u4ef6\u7684\u5c3a\u5bf8\u7b49\u57fa\u672c\u4fe1\u606f\uff0c\u8fd9\u4e2a\u65f6\u5019\u518d\u8c03\u7528jpeg_destroy()\u9500\u6bc1jpeg\u5bf9\u8c61\u6216\u7528jpeg_abort()\u91cd\u7f6ejpeg\u5bf9\u8c61\u7684\u72b6\u6001\r\n    image_color  = cinfo.out_color_space;\r\n    image_height = cinfo.image_height;\r\n    image_width  = cinfo.image_width;\r\n    image_buffer = new JSAMPLE&#x5B;cinfo.image_width * cinfo.image_height * cinfo.num_components];\r\n\r\n    \/\/\r\n    \/\/ \u53ef\u9009\u64cd\u4f5c\uff1a\u8bbe\u7f6e\u5176\u4ed6\u89e3\u538b\u53c2\u6570\r\n    \/\/\r\n\r\n    \/\/ \u89e3\u538b\r\n    \/\/ \u56e0\u4e3astdio\u662f\u540c\u6b65\u7684\u6240\u4ee5\u53ef\u4ee5\u5ffd\u7565\u8fd4\u56de\u503c(\u540c\u4e0ajpeg_read_hreader()\u4e5f\u662f)\r\n    jpeg_start_decompress(&amp;cinfo);\r\n\r\n    \/\/ \u6bcf\u884c\u7684\u5b57\u8282\u6570\r\n    row_stride = cinfo.output_width * cinfo.output_components;\r\n\r\n#if 1\r\n    buffer = (*cinfo.mem-&gt;alloc_sarray)\r\n        ((j_common_ptr) &amp;cinfo, JPOOL_IMAGE, row_stride, 1);\r\n\r\n    \/\/ \u5e93\u91cc\u63d0\u4f9b\u4e86\u8bb0\u5f55\u56fe\u7247\u8bfb\u53d6\u72b6\u6001\u7684\u53d8\u91cfoutput_scanline\r\n    while (cinfo.output_scanline &lt; cinfo.output_height) {\r\n        \/\/ \u4e5f\u53ef\u4e00\u6b21\u8bfb\u53d6\u591a\u884c\r\n        jpeg_read_scanlines(&amp;cinfo, buffer, 1);\r\n        \/\/ \u56e0\u4e3a\u8bfb\u53d6\u540eoutput_scanline\u5df2\u7ecf\u589e\u52a0\u4e86\u6240\u4ee5\u51cf1\r\n        memcpy(image_buffer + (cinfo.output_scanline-1) * row_stride, buffer&#x5B;0], row_stride);\r\n    }\r\n#else\r\n    \/\/ \u6216\u8005\u76f4\u63a5\u8bfb\u53d6\u5230\u76ee\u6807\u7f13\u51b2\u533a\uff0c\u4e0d\u8fc7\u8fd9\u6837\u9700\u8981\u4e00\u4e2a\u76ee\u6807\u7f13\u51b2\u533a\u7684\u884c\u9996\u5730\u5740\u6570\u7ec4\u6765\u8f85\u52a9\r\n    JSAMPARRAY row_arr = new JSAMPROW&#x5B;image_height];\r\n    for (int i = 0; i &lt; image_height; ++i)\r\n        row_arr&#x5B;i] = (JSAMPROW)(image_buffer + i * row_stride);\r\n    while (cinfo.output_scanline &lt; cinfo.output_height)\r\n        (void)jpeg_read_scanlines(&amp;cinfo, &amp;row_arr&#x5B;cinfo.output_scanline], 1);\r\n    delete&#x5B;] row_arr;\r\n#endif\r\n\r\n    \r\n    \/\/ \u7ed3\u675f\u89e3\u7801\uff0c\u540c\u7406\u56e0\u4e3a\u662fstdio\u7684\u64cd\u4f5c\u662f\u540c\u6b65\u7684\uff0c\u4e0d\u7528\u7406\u4f1a\u8fd4\u56de\u503c\r\n    jpeg_finish_decompress(&amp;cinfo);\r\n\r\n\r\n    \/\/ \u91ca\u653e\u8d44\u6e90\r\n    jpeg_destroy_decompress(&amp;cinfo);\r\n    fclose(infile);\r\n\r\n    \/\/ \u6700\u540e\u53ef\u4ee5\u68c0\u67e5 jerr.pub.num \u7684\u503c\u662f\u5426\u975e0\u6765\u786e\u8ba4\u662f\u5426\u6709\u6570\u636e\u635f\u574f\u7684\u8b66\u544a\u4ea7\u751f\r\n\u3000\r\n<\/pre>\n<p>\u3000<br \/>\n3\u3001\u538b\u7f29jpeg\u56fe\u50cf<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">    \/\/ \u4ee5\u4e0b\u4ee3\u7801\u7701\u7565\u9519\u8bef\u5904\u7406\r\n\r\n    struct jpeg_compress_struct cinfo;\r\n    \/\/ \u81ea\u5b9a\u4e49\u9519\u8bef\u5904\u7406\u7ed3\u6784\uff0c\u540c\u4e0a\r\n    struct jpeg_error_mgr jerr;\r\n\r\n    FILE * outfile;\t\t\/\/ \u8f93\u51fa\u6587\u4ef6\u5bf9\u8c61\r\n    JSAMPROW row_pointer&#x5B;1];\t\/\/ JSAMPLE row&#x5B;s] \u6307\u9488\r\n    int row_stride;\t\t\/\/ \u56fe\u50cf\u7f13\u51b2\u533a\u6bcf\u884c\u7684\u5b57\u8282\u6570\r\n\r\n\r\n    \/\/ \u521d\u59cb\u5316jpeg\u538b\u7f29\u5bf9\u8c61\r\n    cinfo.err = jpeg_std_error(&amp;jerr);\r\n    jpeg_create_compress(&amp;cinfo);\r\n\r\n    \/\/ \u521d\u59cb\u5316\u8f93\u51fa\u6587\u4ef6\u5bf9\u8c61\r\n    fopen_s(&amp;outfile, filename, &quot;wb&quot;);\r\n    jpeg_stdio_dest(&amp;cinfo, outfile);\r\n\r\n    \/\/ \u8bbe\u7f6e\u538b\u7f29\u53c2\u6570\r\n    \/\/ \u4e0b\u5217\u56db\u4e2a\u6210\u5458\u7684\u503c\u5fc5\u987b\u8bbe\u7f6e\r\n    cinfo.image_width = image_width;\r\n    cinfo.image_height = image_height;\r\n    cinfo.input_components = 3;         \/\/ \u6bcf\u4e2a\u50cf\u7d20\u7684\u989c\u8272\u6570\r\n    cinfo.in_color_space = JCS_RGB; \t\/\/ \u8f93\u5165\u56fe\u50cf\u7684\u989c\u8272\u7a7a\u95f4\r\n\r\n    jpeg_set_defaults(&amp;cinfo);          \/\/ \u8c03\u7528\u524d\u8981\u5148\u8bbe\u7f6e\u597d cinfo.in_color_space\r\n    \r\n    \/\/ \u8bbe\u7f6e\u5176\u4ed6\u975e\u9ed8\u8ba4\u53c2\u6570...\r\n    jpeg_set_quality(&amp;cinfo, _quality, TRUE);    \/\/ baseline-JPEG\r\n\r\n    \/\/ \u5f00\u59cb\u538b\u7f29\r\n    jpeg_start_compress(&amp;cinfo, TRUE);    \/\/ TRUE\u8868\u793a\u5199\u5165\u6240\u6709\u6570\u636e\u6d41\uff0cFALSE\u7684\u60c5\u51b5\u8be6\u89c1\u6587\u6863\u4e2d\u7684\r\n                                          \/\/ Abbreviated datastreams and multiple images \u90e8\u5206\r\n                                          \/\/ \u4e00\u822c\u60c5\u51b5\u4e0b\u7528TRUE\u5373\u53ef\r\n\r\n    \/\/ \u6309\u884c\u5199\u5165\r\n    row_stride = image_width * 3;\t\/\/ RGB\r\n\r\n    while (cinfo.next_scanline &lt; cinfo.image_height) {\r\n        row_pointer&#x5B;0] = &amp;image_buffer&#x5B;cinfo.next_scanline * row_stride];\r\n        jpeg_write_scanlines(&amp;cinfo, row_pointer, 1);\r\n    }\r\n\r\n    \/\/ \u7ed3\u675f\u5904\u7406\r\n    jpeg_finish_compress(&amp;cinfo);\r\n    fclose(outfile);\r\n\r\n    jpeg_destroy_compress(&amp;cinfo);\r\n\u3000\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>1\u3001\u7f16\u8bd1\u73af\u5883\u7684\u5b89\u88c5 \u3000\u30001.1 \u89e3\u538b\u4ecewww.ijg.org\u4e0a\u4e0b\u8f7d\u7684\u6e90\u7801\uff0c\u5b89\u88c5VS2010\u3002 \u3000\u30001.2 \u5728\u6253&#8230; <\/p>\n<div class=\"read-more navbutton\"><a href=\"https:\/\/flandre-scarlet.moe\/blog\/74\/\">\u9605\u8bfb\u66f4\u591a<i class=\"fa fa-angle-double-right\"><\/i><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-74","post","type-post","status-publish","format-standard","hentry","category-image-processing"],"_links":{"self":[{"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/posts\/74","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/comments?post=74"}],"version-history":[{"count":0,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/posts\/74\/revisions"}],"wp:attachment":[{"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/media?parent=74"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/categories?post=74"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flandre-scarlet.moe\/blog\/wp-json\/wp\/v2\/tags?post=74"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}