libjpegとturbo libjpegの使用

2580 ワード

LibJpegは一般的なオープンソースライブラリとして多くの紹介があります.
特筆すべきは、以前のバージョンではメモリ内のJpeg画像を符号化するインタフェースがなく、Jpeg_を使用していたことだ.stdio_srcとjpeg_stdio_destは、どちらもFileクラスオブジェクトに対して直接操作され、メモリ内の画像のステップをスキップします.一部の記事では、LibJpegにメモリ画像の復号インタフェースを追加する方法について説明していますが、メモリ画像の符号化インタフェースを追加した人はいません.元のjpegを直接stdio_destは、対メモリのRGB画像の符号化インタフェースを上書きし、メモリのjpeg画像として出力する.
ヘッダファイルとスタティックライブラリはCSDNリポジトリにアップロードされ、ソースコードもアップロードされている(メモリ内のJpeg画像コーデックインタフェースのLibJpegを追加する)ので、自分でコンパイルして使用できます.
しかし、その後のturbo libjpegはこの問題を解決し(上にアップロードされたコードの価値も大きくない)、私は新しいバージョンのLibJpegがすでにこの問題を改善したかどうかを見に行かなかった.
turbo libjpegの価値はSIMD命令セットを用いて符号化プロセスを加速させることである.公式サイトの紹介では、あるケースでは元の0.3前後から0.1に下がり、時間は元の1/3にすぎず、私の工事では元のLibJpegの半分程度に時間が減ったということです.その使用は以前のLibJpegと全く同じで、一部の機能を追加しただけで、完全に直接置き換えることができて、使用するのは便利です.
以下のコードは、LibJpegを符号化する方法であり、Turbo LibJpegの使用方法でもある(jpeg_mem_srcとjpeg_mem_dstの使用のみを区別する):
復号時の空間は内部で割り当てられていることに注意してください.これはメモリ空間を正確に割り当てることができ、無駄にならないからです.
しかし、符号化の際、空間は外部から割り当てる必要があります.正確な符号化後の空間の大きさは知られていないので、もちろん符号化前と同じ大きさの空間を完全に割り当てることができます.これは十分で、あまり大きな空間の浪費をもたらすことはありません.
turbo libjpegは公式サイトでダウンロードでき、現在の最新バージョンは1.3.1.
typedef unsigned char BYTE;
bool ReadJPEG( 
			  /*IN*/BYTE *src, int srcLen, 
			  /*OUT*/BYTE **_dst, int *dstLen, int *width, int *height, int *depth 
			  )
{
	// 【  】dst       
	//  JPEG       
	struct jpeg_decompress_struct cinfo;

	//  JPEG       
	struct jpeg_error_mgr jerr;

	cinfo.err=jpeg_std_error(&jerr);
	jpeg_create_decompress(&cinfo);

	jpeg_mem_src(&cinfo,src,srcLen);
	jpeg_read_header(&cinfo,TRUE);

	jpeg_start_decompress(&cinfo);
	(*width) = cinfo.output_width;
	(*height) = cinfo.output_height;
	(*depth) = cinfo.num_components;
	(*dstLen) = (*width)*(*height)*(*depth);
	BYTE *dst = new BYTE[*dstLen];

	JSAMPROW row_pointer[1];

	while (cinfo.output_scanline