{"id":270,"date":"2026-04-09T23:26:10","date_gmt":"2026-04-09T15:26:10","guid":{"rendered":"http:\/\/www.millscience.cn\/?p=270"},"modified":"2026-04-09T23:26:13","modified_gmt":"2026-04-09T15:26:13","slug":"bmp2jpeg","status":"publish","type":"post","link":"https:\/\/www.millscience.cn\/index.php\/bmp2jpeg\/","title":{"rendered":"BMP\u56fe\u7247\u8f6cJPEG\u56fe\u7247"},"content":{"rendered":"\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"\u590d\u5236\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#include &lt;stdio.h>\n#include &lt;setjmp.h>\n#include &lt;sys\/stat.h>\n#include &lt;fcntl.h>\n#include &lt;sys\/mman.h>\n#include &lt;string.h>\n#include &lt;stdlib.h>\n#include &lt;stdint.h>\n#include &lt;\/home\/gec\/software\/installed\/jepg\/include\/jpeglib.h>\n\n\n\/\/ ...(\u4fdd\u6301\u4f60\u7684\u7ed3\u6784\u4f53\u5b9a\u4e49\u4e0d\u53d8)...\n#pragma pack(push, 1) \/\/ \u7981\u7528\u5185\u5b58\u5bf9\u9f50\n\ntypedef struct\n\n{\n    uint16_t bfType;      \/\/ \u6587\u4ef6\u6807\u8bc6\uff0c\u5fc5\u987b\u4e3a \"BM\"\uff080x4D42\uff09\n    uint32_t bfSize;      \/\/ \u6587\u4ef6\u603b\u5927\u5c0f\uff08\u5b57\u8282\uff09\n    uint16_t bfReserved1; \/\/ \u4fdd\u7559\u5b57\u6bb5\uff08\u5fc5\u987b\u4e3a0\uff09\n    uint16_t bfReserved2; \/\/ \u4fdd\u7559\u5b57\u6bb5\uff08\u5fc5\u987b\u4e3a0\uff09\n    uint32_t bfOffBits;   \/\/ \u50cf\u7d20\u6570\u636e\u504f\u79fb\u91cf\uff08\u4ece\u6587\u4ef6\u5934\u5230\u50cf\u7d20\u6570\u636e\u7684\u5b57\u8282\u6570\uff09\n} BITMAPFILEHEADER;\n\n#pragma pack(pop)\n\ntypedef struct\n\n{\n\n    uint32_t biSize;         \/\/ \u672c\u7ed3\u6784\u4f53\u5927\u5c0f\uff08\u901a\u5e38\u4e3a40\uff09\n    int32_t biWidth;         \/\/ \u56fe\u50cf\u5bbd\u5ea6\uff08\u50cf\u7d20\uff09\n    int32_t biHeight;        \/\/ \u56fe\u50cf\u9ad8\u5ea6\uff08\u50cf\u7d20\uff09\uff0c\u6b63\u6570\u8868\u793a\u4ece\u4e0b\u5230\u4e0a\u5b58\u50a8\n    uint16_t biPlanes;       \/\/ \u989c\u8272\u5e73\u9762\u6570\uff08\u5fc5\u987b\u4e3a1\uff09\n    uint16_t biBitCount;     \/\/ \u6bcf\u50cf\u7d20\u4f4d\u6570\uff081\/4\/8\/16\/24\/32\uff09\n    uint32_t biCompression;  \/\/ \u538b\u7f29\u65b9\u5f0f\uff080\u8868\u793a\u4e0d\u538b\u7f29\uff09\n    uint32_t biSizeImage;    \/\/ \u50cf\u7d20\u6570\u636e\u5927\u5c0f\uff08\u5b57\u8282\uff09\uff0c\u538b\u7f29\u65f6\u9700\u586b\u5199\n    int32_t biXPelsPerMeter; \/\/ \u6c34\u5e73\u5206\u8fa8\u7387\uff08\u50cf\u7d20\/\u7c73\uff09\n    int32_t biYPelsPerMeter; \/\/ \u5782\u76f4\u5206\u8fa8\u7387\uff08\u50cf\u7d20\/\u7c73\uff09\n    uint32_t biClrUsed;      \/\/ \u5b9e\u9645\u4f7f\u7528\u7684\u8c03\u8272\u677f\u989c\u8272\u6570\uff080\u8868\u793a\u5168\u90e8\uff09\n    uint32_t biClrImportant; \/\/ \u91cd\u8981\u989c\u8272\u6570\uff080\u8868\u793a\u6240\u6709\u989c\u8272\u5747\u91cd\u8981\uff09\n\n} BITMAPINFOHEADER;\n\n\/*\n * Sample routine for JPEG compression.  We assume that the target file name\n * and a compression quality factor are passed in.\n *\/\n\nGLOBAL(void)\nwrite_JPEG_file (char * filename, int quality, unsigned char *image_buffer, int image_width, int image_height)\n{\n  \/* This struct contains the JPEG compression parameters and pointers to\n   * working space (which is allocated as needed by the JPEG library).\n   * It is possible to have several such structures, representing multiple\n   * compression\/decompression processes, in existence at once.  We refer\n   * to any one struct (and its associated working data) as a \"JPEG object\".\n   *\/\n  struct jpeg_compress_struct cinfo;\n  \/* This struct represents a JPEG error handler.  It is declared separately\n   * because applications often want to supply a specialized error handler\n   * (see the second half of this file for an example).  But here we just\n   * take the easy way out and use the standard error handler, which will\n   * print a message on stderr and call exit() if compression fails.\n   * Note that this struct must live as long as the main JPEG parameter\n   * struct, to avoid dangling-pointer problems.\n   *\/\n  struct jpeg_error_mgr jerr;\n  \/* More stuff *\/\n  FILE * outfile;\t\t\/* target file *\/\n  JSAMPROW row_pointer&#91;1&#93;;\t\/* pointer to JSAMPLE row&#91;s&#93; *\/\n  int row_stride;\t\t\/* physical row width in image buffer *\/\n\n  \/* Step 1: allocate and initialize JPEG compression object *\/\n\n  \/* We have to set up the error handler first, in case the initialization\n   * step fails.  (Unlikely, but it could happen if you are out of memory.)\n   * This routine fills in the contents of struct jerr, and returns jerr's\n   * address which we place into the link field in cinfo.\n   *\/\n  cinfo.err = jpeg_std_error(&amp;jerr);\n  \/* Now we can initialize the JPEG compression object. *\/\n  jpeg_create_compress(&amp;cinfo);\n\n  \/* Step 2: specify data destination (eg, a file) *\/\n  \/* Note: steps 2 and 3 can be done in either order. *\/\n\n  \/* Here we use the library-supplied code to send compressed data to a\n   * stdio stream.  You can also write your own code to do something else.\n   * VERY IMPORTANT: use \"b\" option to fopen() if you are on a machine that\n   * requires it in order to write binary files.\n   *\/\n  if ((outfile = fopen(filename, \"wb\")) == NULL) {\n    fprintf(stderr, \"can't open %s\\n\", filename);\n    exit(1);\n  }\n  jpeg_stdio_dest(&amp;cinfo, outfile);\n\n  \/* Step 3: set parameters for compression *\/\n\n  \/* First we supply a description of the input image.\n   * Four fields of the cinfo struct must be filled in:\n   *\/\n  cinfo.image_width = image_width; \t\/* image width and height, in pixels *\/\n  cinfo.image_height = image_height;\n  cinfo.input_components = 3;\t\t\/* # of color components per pixel *\/\n  cinfo.in_color_space = JCS_RGB; \t\/* colorspace of input image *\/\n  \/* Now use the library's routine to set default compression parameters.\n   * (You must set at least cinfo.in_color_space before calling this,\n   * since the defaults depend on the source color space.)\n   *\/\n  jpeg_set_defaults(&amp;cinfo);\n  \/* Now you can set any non-default parameters you wish to.\n   * Here we just illustrate the use of quality (quantization table) scaling:\n   *\/\n  jpeg_set_quality(&amp;cinfo, quality, TRUE \/* limit to baseline-JPEG values *\/);\n\n  \/* Step 4: Start compressor *\/\n\n  \/* TRUE ensures that we will write a complete interchange-JPEG file.\n   * Pass TRUE unless you are very sure of what you're doing.\n   *\/\n  jpeg_start_compress(&amp;cinfo, TRUE);\n\n  \/* Step 5: while (scan lines remain to be written) *\/\n  \/*           jpeg_write_scanlines(...); *\/\n\n  \/* Here we use the library's state variable cinfo.next_scanline as the\n   * loop counter, so that we don't have to keep track ourselves.\n   * To keep things simple, we pass one scanline per call; you can pass\n   * more if you wish, though.\n   *\/\n  row_stride = image_width * 3;\t\/* JSAMPLEs per row in image_buffer *\/\n\n  while (cinfo.next_scanline &lt; cinfo.image_height) {\n    \/* jpeg_write_scanlines expects an array of pointers to scanlines.\n     * Here the array is only one element long, but you could pass\n     * more than one scanline at a time if that's more convenient.\n     *\/\n    row_pointer&#91;0&#93; = &amp; image_buffer&#91;cinfo.next_scanline * row_stride&#93;;\n    (void) jpeg_write_scanlines(&amp;cinfo, row_pointer, 1);\n  }\n\n\n  jpeg_finish_compress(&amp;cinfo);\n  fclose(outfile);\n  jpeg_destroy_compress(&amp;cinfo);\n}\n\nint main(int argc, const char* argv[])\n{   \n    if(argc != 2)\n    {\n        printf(\"\u7528\u6cd5: %s &lt;bmp\u56fe\u7247\u8def\u5f84> \\n\", argv&#91;0&#93;);\n        return 0;\n    }\n\n    FILE* bmp = fopen(argv&#91;1&#93;, \"rb\");\n    if(bmp == NULL)\n    {\n        printf(\"bmp\u56fe\u7247\u52a0\u8f7d\u5931\u8d25\uff01\\n\");\n        return 0;\n    }\n\n    BITMAPFILEHEADER fileheader;\n    BITMAPINFOHEADER infoheader;\n    fread(&amp;fileheader, 14, 1, bmp);\n    fread(&amp;infoheader, 40, 1, bmp);\n\n    int width = infoheader.biWidth;\n    int height = infoheader.biHeight;\n    \/\/ \u6709\u4e9b\u5c11\u89c1\u7684BMP\u662f\u4ece\u4e0a\u5230\u4e0b\u7684\uff0c\u9ad8\u5ea6\u4e3a\u8d1f\u6570\uff0c\u505a\u4e2a\u7edd\u5bf9\u503c\u4fdd\u62a4\n    if (height &lt; 0) height = -height; \n\n    \/\/ 1. \u8ba1\u7b97 BMP \u6bcf\u884c\u5e26\u8865\u9f50\u7684\u5b9e\u9645\u5b57\u8282\u6570\n    int bmp_row_stride = ((width * 3 + 3) \/ 4) * 4;\n    \/\/ 2. JPEG \u9700\u8981\u7684\u7eaf\u51c0\u884c\u5b57\u8282\u6570\uff08\u65e0\u8865\u9f50\uff09\n    int jpeg_row_stride = width * 3;\n\n    \/\/ \u7533\u8bf7\u4e24\u5757\u5185\u5b58\n    unsigned char* bmp_raw_buf = (unsigned char*)malloc(bmp_row_stride * height);\n    unsigned char* jpeg_rgb_buf = (unsigned char*)malloc(jpeg_row_stride * height);\n\n    if(!bmp_raw_buf || !jpeg_rgb_buf) {\n        printf(\"\u5185\u5b58\u7533\u8bf7\u5931\u8d25\uff01\\n\");\n        return 0;\n    }\n\n    \/\/ \u4e25\u8c28\u70b9\uff1a\u8df3\u8fc7\u53ef\u80fd\u7684\u8c03\u8272\u677f\uff0c\u76f4\u63a5\u4ece\u50cf\u7d20\u504f\u79fb\u91cf\u5f00\u59cb\u8bfb\n    fseek(bmp, fileheader.bfOffBits, SEEK_SET);\n    \/\/ \u4e00\u53e3\u6c14\u628a\u5305\u542b\u5e9f\u5b57\u8282\u7684\u6240\u6709BMP\u6570\u636e\u8bfb\u8fdb raw_buf\n    fread(bmp_raw_buf, 1, bmp_row_stride * height, bmp);\n\n    \/\/ ================= \u5f00\u59cb\u201c\u6e05\u6d17\u201d\u6570\u636e =================\n    for (int y = 0; y &lt; height; y++) \n    {\n        \/\/ JPEG \u7684\u884c\uff1a\u4ece\u4e0a\u5230\u4e0b (0 \u5230 height-1)\n        int jpeg_y = y;\n        \/\/ BMP \u7684\u884c\uff1a\u4ece\u4e0b\u5230\u4e0a (height-1 \u5230 0)\n        int bmp_y = height - 1 - y;\n\n        \/\/ \u7b97\u51fa\u8fd9\u4e24\u884c\u5728\u5404\u81ea\u5185\u5b58\u91cc\u7684\u8d77\u59cb\u5730\u5740\n        unsigned char* jpeg_row = jpeg_rgb_buf + (jpeg_y * jpeg_row_stride);\n        unsigned char* bmp_row  = bmp_raw_buf + (bmp_y * bmp_row_stride);\n\n        \/\/ \u904d\u5386\u8fd9\u4e00\u884c\u7684\u6bcf\u4e00\u4e2a\u50cf\u7d20\uff0c\u505a BGR -> RGB \u7684\u8f6c\u6362\n        for (int x = 0; x &lt; width; x++) \n        {\n            \/\/ jpeg_row \u662f\u76ee\u6807\uff0cbmp_row \u662f\u6e90\n            jpeg_row&#91;x * 3 + 0&#93; = bmp_row&#91;x * 3 + 2&#93;; \/\/ Red   &lt;- \u63d0\u53d6\u6e90\u7684 R\n            jpeg_row&#91;x * 3 + 1&#93; = bmp_row&#91;x * 3 + 1&#93;; \/\/ Green &lt;- \u63d0\u53d6\u6e90\u7684 G\n            jpeg_row&#91;x * 3 + 2&#93; = bmp_row&#91;x * 3 + 0&#93;; \/\/ Blue  &lt;- \u63d0\u53d6\u6e90\u7684 B\n        }\n    }\n    \/\/ ================= \u6d17\u5b8c\u6536\u5de5 =================\n\n    \/\/ \u628a\u7eaf\u51c0\u7684 RGB \u6570\u636e\u5582\u7ed9 libjpeg\n    write_JPEG_file(\"destjpeg.jpeg\", 90, jpeg_rgb_buf, width, height);\n\n    \/\/ \u91ca\u653e\u8d44\u6e90\n    fclose(bmp);\n    free(bmp_raw_buf);\n    free(jpeg_rgb_buf);\n    \n    printf(\"BMP\u8f6cJPEG\u6210\u529f\uff01\\n\");\n\n    return 0;\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;stdio.h&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;setjmp.h&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;sys\/stat.h&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;fcntl.h&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;sys\/mman.h&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;string.h&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;stdlib.h&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;stdint.h&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;\/home\/gec\/software\/installed\/jepg\/include\/jpeglib.h&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ...(\u4fdd\u6301\u4f60\u7684\u7ed3\u6784\u4f53\u5b9a\u4e49\u4e0d\u53d8)...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#pragma<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #9CDCFE\">pack<\/span><span style=\"color: #569CD6\">(<\/span><span style=\"color: #9CDCFE\">push<\/span><span style=\"color: #569CD6\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #569CD6\">) <\/span><span style=\"color: #6A9955\">\/\/ \u7981\u7528\u5185\u5b58\u5bf9\u9f50<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">typedef<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">struct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint16_t<\/span><span style=\"color: #D4D4D4\"> bfType;<\/span><span style=\"color: #6A9955\">      \/\/ \u6587\u4ef6\u6807\u8bc6\uff0c\u5fc5\u987b\u4e3a &quot;BM&quot;\uff080x4D42\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> bfSize;<\/span><span style=\"color: #6A9955\">      \/\/ \u6587\u4ef6\u603b\u5927\u5c0f\uff08\u5b57\u8282\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint16_t<\/span><span style=\"color: #D4D4D4\"> bfReserved1;<\/span><span style=\"color: #6A9955\"> \/\/ \u4fdd\u7559\u5b57\u6bb5\uff08\u5fc5\u987b\u4e3a0\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint16_t<\/span><span style=\"color: #D4D4D4\"> bfReserved2;<\/span><span style=\"color: #6A9955\"> \/\/ \u4fdd\u7559\u5b57\u6bb5\uff08\u5fc5\u987b\u4e3a0\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> bfOffBits;<\/span><span style=\"color: #6A9955\">   \/\/ \u50cf\u7d20\u6570\u636e\u504f\u79fb\u91cf\uff08\u4ece\u6587\u4ef6\u5934\u5230\u50cf\u7d20\u6570\u636e\u7684\u5b57\u8282\u6570\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">} BITMAPFILEHEADER;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#pragma<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #9CDCFE\">pack<\/span><span style=\"color: #569CD6\">(<\/span><span style=\"color: #9CDCFE\">pop<\/span><span style=\"color: #569CD6\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">typedef<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">struct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> biSize;<\/span><span style=\"color: #6A9955\">         \/\/ \u672c\u7ed3\u6784\u4f53\u5927\u5c0f\uff08\u901a\u5e38\u4e3a40\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">int32_t<\/span><span style=\"color: #D4D4D4\"> biWidth;<\/span><span style=\"color: #6A9955\">         \/\/ \u56fe\u50cf\u5bbd\u5ea6\uff08\u50cf\u7d20\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">int32_t<\/span><span style=\"color: #D4D4D4\"> biHeight;<\/span><span style=\"color: #6A9955\">        \/\/ \u56fe\u50cf\u9ad8\u5ea6\uff08\u50cf\u7d20\uff09\uff0c\u6b63\u6570\u8868\u793a\u4ece\u4e0b\u5230\u4e0a\u5b58\u50a8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint16_t<\/span><span style=\"color: #D4D4D4\"> biPlanes;<\/span><span style=\"color: #6A9955\">       \/\/ \u989c\u8272\u5e73\u9762\u6570\uff08\u5fc5\u987b\u4e3a1\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint16_t<\/span><span style=\"color: #D4D4D4\"> biBitCount;<\/span><span style=\"color: #6A9955\">     \/\/ \u6bcf\u50cf\u7d20\u4f4d\u6570\uff081\/4\/8\/16\/24\/32\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> biCompression;<\/span><span style=\"color: #6A9955\">  \/\/ \u538b\u7f29\u65b9\u5f0f\uff080\u8868\u793a\u4e0d\u538b\u7f29\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> biSizeImage;<\/span><span style=\"color: #6A9955\">    \/\/ \u50cf\u7d20\u6570\u636e\u5927\u5c0f\uff08\u5b57\u8282\uff09\uff0c\u538b\u7f29\u65f6\u9700\u586b\u5199<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">int32_t<\/span><span style=\"color: #D4D4D4\"> biXPelsPerMeter;<\/span><span style=\"color: #6A9955\"> \/\/ \u6c34\u5e73\u5206\u8fa8\u7387\uff08\u50cf\u7d20\/\u7c73\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">int32_t<\/span><span style=\"color: #D4D4D4\"> biYPelsPerMeter;<\/span><span style=\"color: #6A9955\"> \/\/ \u5782\u76f4\u5206\u8fa8\u7387\uff08\u50cf\u7d20\/\u7c73\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> biClrUsed;<\/span><span style=\"color: #6A9955\">      \/\/ \u5b9e\u9645\u4f7f\u7528\u7684\u8c03\u8272\u677f\u989c\u8272\u6570\uff080\u8868\u793a\u5168\u90e8\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> biClrImportant;<\/span><span style=\"color: #6A9955\"> \/\/ \u91cd\u8981\u989c\u8272\u6570\uff080\u8868\u793a\u6240\u6709\u989c\u8272\u5747\u91cd\u8981\uff09<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">} BITMAPINFOHEADER;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Sample routine for JPEG compression.  We assume that the target file name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * and a compression quality factor are passed in.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">GLOBAL<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">write_JPEG_file<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #9CDCFE\">filename<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">quality<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">unsigned<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\"> *<\/span><span style=\"color: #9CDCFE\">image_buffer<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">image_width<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">image_height<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* This struct contains the JPEG compression parameters and pointers to<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * working space (which is allocated as needed by the JPEG library).<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * It is possible to have several such structures, representing multiple<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * compression\/decompression processes, in existence at once.  We refer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * to any one struct (and its associated working data) as a &quot;JPEG object&quot;.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">struct<\/span><span style=\"color: #D4D4D4\"> jpeg_compress_struct cinfo;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* This struct represents a JPEG error handler.  It is declared separately<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * because applications often want to supply a specialized error handler<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * (see the second half of this file for an example).  But here we just<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * take the easy way out and use the standard error handler, which will<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * print a message on stderr and call exit() if compression fails.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * Note that this struct must live as long as the main JPEG parameter<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * struct, to avoid dangling-pointer problems.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">struct<\/span><span style=\"color: #D4D4D4\"> jpeg_error_mgr jerr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* More stuff *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  FILE * outfile;<\/span><span style=\"color: #6A9955\">\t\t\/* target file *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  JSAMPROW <\/span><span style=\"color: #9CDCFE\">row_pointer<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">&#93;;<\/span><span style=\"color: #6A9955\">\t\/* pointer to JSAMPLE row&#91;s&#93; *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> row_stride;<\/span><span style=\"color: #6A9955\">\t\t\/* physical row width in image buffer *\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Step 1: allocate and initialize JPEG compression object *\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* We have to set up the error handler first, in case the initialization<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * step fails.  (Unlikely, but it could happen if you are out of memory.)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * This routine fills in the contents of struct jerr, and returns jerr&#39;s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * address which we place into the link field in cinfo.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cinfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">err<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">jpeg_std_error<\/span><span style=\"color: #D4D4D4\">(&amp;jerr);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Now we can initialize the JPEG compression object. *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">jpeg_create_compress<\/span><span style=\"color: #D4D4D4\">(&amp;cinfo);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Step 2: specify data destination (eg, a file) *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Note: steps 2 and 3 can be done in either order. *\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Here we use the library-supplied code to send compressed data to a<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * stdio stream.  You can also write your own code to do something else.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * VERY IMPORTANT: use &quot;b&quot; option to fopen() if you are on a machine that<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * requires it in order to write binary files.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> ((outfile = <\/span><span style=\"color: #DCDCAA\">fopen<\/span><span style=\"color: #D4D4D4\">(filename, <\/span><span style=\"color: #CE9178\">&quot;wb&quot;<\/span><span style=\"color: #D4D4D4\">)) == <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">fprintf<\/span><span style=\"color: #D4D4D4\">(stderr, <\/span><span style=\"color: #CE9178\">&quot;can&#39;t open <\/span><span style=\"color: #9CDCFE\">%s<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">, filename);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">exit<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">jpeg_stdio_dest<\/span><span style=\"color: #D4D4D4\">(&amp;cinfo, outfile);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Step 3: set parameters for compression *\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* First we supply a description of the input image.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * Four fields of the cinfo struct must be filled in:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cinfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">image_width<\/span><span style=\"color: #D4D4D4\"> = image_width;<\/span><span style=\"color: #6A9955\"> \t\/* image width and height, in pixels *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cinfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">image_height<\/span><span style=\"color: #D4D4D4\"> = image_height;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cinfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">input_components<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\">\t\t\/* # of color components per pixel *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cinfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">in_color_space<\/span><span style=\"color: #D4D4D4\"> = JCS_RGB;<\/span><span style=\"color: #6A9955\"> \t\/* colorspace of input image *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Now use the library&#39;s routine to set default compression parameters.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * (You must set at least cinfo.in_color_space before calling this,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * since the defaults depend on the source color space.)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">jpeg_set_defaults<\/span><span style=\"color: #D4D4D4\">(&amp;cinfo);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Now you can set any non-default parameters you wish to.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * Here we just illustrate the use of quality (quantization table) scaling:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">jpeg_set_quality<\/span><span style=\"color: #D4D4D4\">(&amp;cinfo, quality, <\/span><span style=\"color: #569CD6\">TRUE<\/span><span style=\"color: #6A9955\"> \/* limit to baseline-JPEG values *\/<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Step 4: Start compressor *\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* TRUE ensures that we will write a complete interchange-JPEG file.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * Pass TRUE unless you are very sure of what you&#39;re doing.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">jpeg_start_compress<\/span><span style=\"color: #D4D4D4\">(&amp;cinfo, <\/span><span style=\"color: #569CD6\">TRUE<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Step 5: while (scan lines remain to be written) *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/*           jpeg_write_scanlines(...); *\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/* Here we use the library&#39;s state variable cinfo.next_scanline as the<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * loop counter, so that we don&#39;t have to keep track ourselves.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * To keep things simple, we pass one scanline per call; you can pass<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   * more if you wish, though.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">   *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  row_stride = image_width * <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\">\t\/* JSAMPLEs per row in image_buffer *\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">cinfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">next_scanline<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #9CDCFE\">cinfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">image_height<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/* jpeg_write_scanlines expects an array of pointers to scanlines.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">     * Here the array is only one element long, but you could pass<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">     * more than one scanline at a time if that&#39;s more convenient.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">     *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">row_pointer<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#93; = &amp; <\/span><span style=\"color: #9CDCFE\">image_buffer<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #9CDCFE\">cinfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">next_scanline<\/span><span style=\"color: #D4D4D4\"> * row_stride&#93;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    (<\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #DCDCAA\">jpeg_write_scanlines<\/span><span style=\"color: #D4D4D4\">(&amp;cinfo, row_pointer, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">jpeg_finish_compress<\/span><span style=\"color: #D4D4D4\">(&amp;cinfo);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">fclose<\/span><span style=\"color: #D4D4D4\">(outfile);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">jpeg_destroy_compress<\/span><span style=\"color: #D4D4D4\">(&amp;cinfo);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">main<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">argc<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">* <\/span><span style=\"color: #9CDCFE\">argv<\/span><span style=\"color: #569CD6\">[]<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\">(argc != <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">printf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;\u7528\u6cd5: <\/span><span style=\"color: #9CDCFE\">%s<\/span><span style=\"color: #CE9178\"> &lt;bmp\u56fe\u7247\u8def\u5f84&gt; <\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">argv<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#93;);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    FILE* bmp = <\/span><span style=\"color: #DCDCAA\">fopen<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">argv<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">&#93;, <\/span><span style=\"color: #CE9178\">&quot;rb&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\">(bmp == <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">printf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;bmp\u56fe\u7247\u52a0\u8f7d\u5931\u8d25\uff01<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    BITMAPFILEHEADER fileheader;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    BITMAPINFOHEADER infoheader;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">fread<\/span><span style=\"color: #D4D4D4\">(&amp;fileheader, <\/span><span style=\"color: #B5CEA8\">14<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, bmp);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">fread<\/span><span style=\"color: #D4D4D4\">(&amp;infoheader, <\/span><span style=\"color: #B5CEA8\">40<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, bmp);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> width = <\/span><span style=\"color: #9CDCFE\">infoheader<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">biWidth<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> height = <\/span><span style=\"color: #9CDCFE\">infoheader<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">biHeight<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ \u6709\u4e9b\u5c11\u89c1\u7684BMP\u662f\u4ece\u4e0a\u5230\u4e0b\u7684\uff0c\u9ad8\u5ea6\u4e3a\u8d1f\u6570\uff0c\u505a\u4e2a\u7edd\u5bf9\u503c\u4fdd\u62a4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (height &lt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) height = -height; <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 1. \u8ba1\u7b97 BMP \u6bcf\u884c\u5e26\u8865\u9f50\u7684\u5b9e\u9645\u5b57\u8282\u6570<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> bmp_row_stride = ((width * <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) \/ <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">) * <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ 2. JPEG \u9700\u8981\u7684\u7eaf\u51c0\u884c\u5b57\u8282\u6570\uff08\u65e0\u8865\u9f50\uff09<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> jpeg_row_stride = width * <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ \u7533\u8bf7\u4e24\u5757\u5185\u5b58<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">unsigned<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">* bmp_raw_buf = (<\/span><span style=\"color: #569CD6\">unsigned<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">*)<\/span><span style=\"color: #DCDCAA\">malloc<\/span><span style=\"color: #D4D4D4\">(bmp_row_stride * height);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">unsigned<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">* jpeg_rgb_buf = (<\/span><span style=\"color: #569CD6\">unsigned<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">*)<\/span><span style=\"color: #DCDCAA\">malloc<\/span><span style=\"color: #D4D4D4\">(jpeg_row_stride * height);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\">(!bmp_raw_buf || !jpeg_rgb_buf) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">printf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;\u5185\u5b58\u7533\u8bf7\u5931\u8d25\uff01<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ \u4e25\u8c28\u70b9\uff1a\u8df3\u8fc7\u53ef\u80fd\u7684\u8c03\u8272\u677f\uff0c\u76f4\u63a5\u4ece\u50cf\u7d20\u504f\u79fb\u91cf\u5f00\u59cb\u8bfb<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">fseek<\/span><span style=\"color: #D4D4D4\">(bmp, <\/span><span style=\"color: #9CDCFE\">fileheader<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">bfOffBits<\/span><span style=\"color: #D4D4D4\">, SEEK_SET);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ \u4e00\u53e3\u6c14\u628a\u5305\u542b\u5e9f\u5b57\u8282\u7684\u6240\u6709BMP\u6570\u636e\u8bfb\u8fdb raw_buf<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">fread<\/span><span style=\"color: #D4D4D4\">(bmp_raw_buf, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, bmp_row_stride * height, bmp);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ ================= \u5f00\u59cb\u201c\u6e05\u6d17\u201d\u6570\u636e =================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> y = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; y &lt; height; y++) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ JPEG \u7684\u884c\uff1a\u4ece\u4e0a\u5230\u4e0b (0 \u5230 height-1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> jpeg_y = y;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ BMP \u7684\u884c\uff1a\u4ece\u4e0b\u5230\u4e0a (height-1 \u5230 0)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> bmp_y = height - <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\"> - y;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ \u7b97\u51fa\u8fd9\u4e24\u884c\u5728\u5404\u81ea\u5185\u5b58\u91cc\u7684\u8d77\u59cb\u5730\u5740<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">unsigned<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">* jpeg_row = jpeg_rgb_buf + (jpeg_y * jpeg_row_stride);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">unsigned<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">* bmp_row  = bmp_raw_buf + (bmp_y * bmp_row_stride);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ \u904d\u5386\u8fd9\u4e00\u884c\u7684\u6bcf\u4e00\u4e2a\u50cf\u7d20\uff0c\u505a BGR -&gt; RGB \u7684\u8f6c\u6362<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> x = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; x &lt; width; x++) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">\/\/ jpeg_row \u662f\u76ee\u6807\uff0cbmp_row \u662f\u6e90<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">jpeg_row<\/span><span style=\"color: #D4D4D4\">&#91;x * <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#93; = <\/span><span style=\"color: #9CDCFE\">bmp_row<\/span><span style=\"color: #D4D4D4\">&#91;x * <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">&#93;;<\/span><span style=\"color: #6A9955\"> \/\/ Red   &lt;- \u63d0\u53d6\u6e90\u7684 R<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">jpeg_row<\/span><span style=\"color: #D4D4D4\">&#91;x * <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">&#93; = <\/span><span style=\"color: #9CDCFE\">bmp_row<\/span><span style=\"color: #D4D4D4\">&#91;x * <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">&#93;;<\/span><span style=\"color: #6A9955\"> \/\/ Green &lt;- \u63d0\u53d6\u6e90\u7684 G<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">jpeg_row<\/span><span style=\"color: #D4D4D4\">&#91;x * <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">&#93; = <\/span><span style=\"color: #9CDCFE\">bmp_row<\/span><span style=\"color: #D4D4D4\">&#91;x * <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#93;;<\/span><span style=\"color: #6A9955\"> \/\/ Blue  &lt;- \u63d0\u53d6\u6e90\u7684 B<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ ================= \u6d17\u5b8c\u6536\u5de5 =================<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ \u628a\u7eaf\u51c0\u7684 RGB \u6570\u636e\u5582\u7ed9 libjpeg<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">write_JPEG_file<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;destjpeg.jpeg&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">90<\/span><span style=\"color: #D4D4D4\">, jpeg_rgb_buf, width, height);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ \u91ca\u653e\u8d44\u6e90<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">fclose<\/span><span style=\"color: #D4D4D4\">(bmp);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">free<\/span><span style=\"color: #D4D4D4\">(bmp_raw_buf);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">free<\/span><span style=\"color: #D4D4D4\">(jpeg_rgb_buf);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">printf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;BMP\u8f6cJPEG\u6210\u529f\uff01<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":271,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,13],"tags":[],"class_list":["post-270","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-embedded","category-learning"],"_links":{"self":[{"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/posts\/270","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/comments?post=270"}],"version-history":[{"count":1,"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/posts\/270\/revisions"}],"predecessor-version":[{"id":272,"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/posts\/270\/revisions\/272"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/media\/271"}],"wp:attachment":[{"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/media?parent=270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/categories?post=270"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.millscience.cn\/index.php\/wp-json\/wp\/v2\/tags?post=270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}