/* * djpeg_sample.c: JPEG ライブラリの使用例 * * [2003/12/31] OSHIRO Naoki. jpegsrc.v6b の djpeg.c を元に変更. * */ /* gcc -I/usr/local/include -L/usr/local/lib -o djpeg_sample djpeg_sample.c -ljpeg */ #include #include #include /* JPEG 用インクルード */ #include #include /* PostScript 時の一行あたりの出力データ数のカウント用 */ long total_put_cnt=0; /* 一行の画像データを出力 */ void put_pixel_rows(char *iobuffer, size_t width) { unsigned char *buf; long cnt; /* PostScript では一行毎に rrr..ggg..bbb... と色別の出力を行なう */ buf = iobuffer; for (cnt=0; cnt1) { fname=argv[1]; if ((fd = fopen(fname, "rb"))==NULL) { fprintf(stderr, "%s: No such file '%s'.\n", basename(argv[0]), fname); exit(1); } } /* エラー時の割り当て */ cinfo.err = jpeg_std_error(&jerr); /* JPEG 展開用の初期化: cinfo 構造体に各種情報が入る */ jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, fd); jpeg_read_header(&cinfo, TRUE); /* サムネイル生成用に縮小設定 (num/denom となる) */ #define THUMNAIL_BASE_WIDTH (160) cinfo.scale_num=1; cinfo.scale_denom= (int)(cinfo.image_width/THUMNAIL_BASE_WIDTH); #if 1 /* 展開処理を高速化: djpeg コマンドの -fast オプションに対応 */ cinfo.two_pass_quantize = FALSE; cinfo.dither_mode = JDITHER_ORDERED; if (! cinfo.quantize_colors) /* don't override an earlier -colors */ cinfo.desired_number_of_colors = 216; cinfo.dct_method = JDCT_FASTEST; cinfo.do_fancy_upsampling = FALSE; #endif /* 出力設定に基づいて各種サイズを算出 */ jpeg_calc_output_dimensions(&cinfo); /* 出力画像サイズ */ width=cinfo.output_width; height=cinfo.output_height; /* 展開用バッファの設定: cinfo の alloc_small 関数を使う */ buf_w = sizeof(char)*width*cinfo.out_color_components; iobuffer = (char *) (*cinfo.mem->alloc_small)((j_common_ptr)&cinfo, JPOOL_IMAGE, buf_w); pixrow=(JSAMPROW) iobuffer; samp_buf = & pixrow; /* PostScript ヘッダの出力: 紙面上の見かけ幅はさらに半分で解像度を上げる */ printf("%%!PS-Adobe-2.0 EPSF-2.0\n"); printf("%%%%BoundingBox: 0 0 %d %d\n", width/2, height/2+8); printf("%%%%EndComments\n"); printf("/readstring { currentfile exch readhexstring pop } bind def\n"); printf("/rstr %d string def\n", width); printf("/gstr %d string def\n", width); printf("/bstr %d string def\n", width); printf("%%%%EndProlog\n"); printf("gsave\n"); /* 出力画像の上部にファイル名を付加: BB の height の +8 はこれ用 */ printf("/Courier-Bold findfont 6 scalefont setfont\n"); printf("%d %d moveto (%s) dup stringwidth pop neg 2 div 0 rmoveto show\n", width/4, height/2+2, fname); /* 画像の出力 */ printf("%d %d scale\n", width/2, height/2); printf("%d %d 8\n", width, height); printf("[%d 0 0 -%d 0 %d]\n", width, height, height); printf("{rstr readstring}\n"); printf("{gstr readstring}\n"); printf("{bstr readstring}\n"); printf("true 3 colorimage\n"); /* 展開開始 */ jpeg_start_decompress(&cinfo); /* 展開出力(一行毎) */ while (cinfo.output_scanline < cinfo.output_height) { l_num = jpeg_read_scanlines(&cinfo, samp_buf, 1); put_pixel_rows(iobuffer, buf_w); } /* 展開終了 */ jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); /* PostScript フッタの出力 */ printf("\ngrestore\nshowpage\n"); return 0; }