こちらでは Mac に libjpeg をインストールする手順と libjpeg を用いたプログラムの例を紹介します。
試したOSは下記の通りです。他の環境では試せていませんのでご了承ください。
- macOS HighSierra(バージョン10.13.4)
ダウンロードされるフォルダ違うなどの違いがありますが、LINUX 環境でも手順は参考になると思います。
Contents
libjpeg とは
libjpeg は JPEG 画像ファイルを扱うためのライブラリです。
この libjpeg を利用することで、C言語などのプログラムから簡単に JPEG 画像を読み込んだり、JPEG 画像を作成したりできるようになります。
libjpeg のインストール
それでは libjpeg のインストール方法について解説していきます。
このインストールの基本的な流れは下記になります。
- ダウンロード
- 設定
- ライブラリ生成
- インストール
- インストールの確認
スポンサーリンク
libjpeg のダウンロード
まず libjpeg をダウンロードするためにhttp://www.ijg.org/files/にアクセスしましょう。
上のような画面が表示されると思いますので、最新の.tar.gzファイルをダウンロードします。2018/07/31現在だとv9cが最新のようでした。
このページから JFIF(JPEG の規格の一つ)の仕様書もダウンロードするできます
私が見た時だと「jfif3.pdf」がダウンロードできました
JPEG の仕様も理解したい人は読んでみてください
続いてターミナルでダウンロードしたファイルがあるフォルダにアクセスします。
ターミナルアプリは「アプリケーション」→「ユーティリティ」にあります。
私がダウンロードした .tar ファイルをダウンロードフォルダに保存しましたので下記コマンドでフォルダにアクセスしました。
cd /Users/[私のユーザ名]//Downloads/
続いてダウンロードした .tar.gz ファイルを下記コマンドにより展開します。「jpegsrc.v9c.tar」の部分はダウンロードしてきたファイル名に合わせて変更してください
tar xvzf jpegsrc.v9c.tar
フォルダが作成され、その中に様々なファイルが展開されるはずです。私の場合は「jpeg-9c」というフォルダが作成されました。
展開が完了したら、その作成したフォルダに cd
コマンドで移動しましょう。
libjpeg の設定
続いてそのフォルダで下記コマンドを実行します。これにより libjpeg をあなたの PC にインストールするための設定が行われます。
./configure
このコマンド実行すればターミナル上にメッセージが表示され、1分かからずに処理が完了するはずです。
最後の方のメッセージは下記のような感じでした。良ければご参考に。
checking for objdir... .libs checking if gcc supports -fno-rtti -fno-exceptions... yes checking for gcc option to produce PIC... -fno-common -DPIC checking if gcc PIC flag -fno-common -DPIC works... yes checking if gcc static flag -static works... no checking if gcc supports -c -o file.o... yes checking if gcc supports -c -o file.o... (cached) yes checking whether the gcc linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) supports shared libraries... yes checking dynamic linker characteristics... darwin17.5.0 dyld checking how to hardcode library paths into programs... immediate checking whether stripping libraries is possible... yes checking if libtool supports shared libraries... yes checking whether to build shared libraries... yes checking whether to build static libraries... yes checking libjpeg version number... 12:0:3 checking that generated files are newer than configure... done configure: creating ./config.status config.status: creating Makefile config.status: creating libjpeg.pc config.status: creating jconfig.h config.status: executing depfiles commands config.status: executing libtool commands
libjpeg ライブラリの生成
続いて同じフォルダ内で下記の make
コマンドを実行します。これにより libjpeg ライブラリが生成されます。
make
こちらも1分ほどで処理が完了します。最後の方のメッセージはこんな感じ。
CCLD libjpeg.la CC cjpeg.o CC rdppm.o CC rdgif.o CC rdtarga.o CC rdrle.o CC rdbmp.o CC rdswitch.o CC cdjpeg.o CCLD cjpeg CC djpeg.o CC wrppm.o CC wrgif.o CC wrtarga.o CC wrrle.o CC wrbmp.o CC rdcolmap.o CCLD djpeg CC jpegtran.o CC transupp.o CCLD jpegtran CC rdjpgcom.o CCLD rdjpgcom CC wrjpgcom.o CCLD wrjpgcom
スポンサーリンク
libjpeg のインストール
次に libjpeg をインストールします。次のコマンドによりインストールが行われるはずです。
sudo make install
sudo
をコマンドの前につけると、管理者権限でコマンドを実行を行うことになります。コマンドを実行するとパスワードが求められますので、管理者のパスワード(Macのパスワード)を入力してください。
管理者権限でないとファイルの編集や追加削除の権限がなくてコマンド実行しても失敗しますので注意してください。
インストールはすぐ処理が完了しますね。最後の方のメッセージを念のため載せておきます。
libtool: install: /usr/bin/install -c .libs/libjpeg.a /usr/local/lib/libjpeg.a libtool: install: chmod 644 /usr/local/lib/libjpeg.a libtool: install: ranlib /usr/local/lib/libjpeg.a ./install-sh -c -d '/usr/local/bin' /bin/sh ./libtool --mode=install /usr/bin/install -c cjpeg djpeg jpegtran rdjpgcom wrjpgcom '/usr/local/bin' libtool: install: /usr/bin/install -c .libs/cjpeg /usr/local/bin/cjpeg libtool: install: /usr/bin/install -c .libs/djpeg /usr/local/bin/djpeg libtool: install: /usr/bin/install -c .libs/jpegtran /usr/local/bin/jpegtran libtool: install: /usr/bin/install -c rdjpgcom /usr/local/bin/rdjpgcom libtool: install: /usr/bin/install -c wrjpgcom /usr/local/bin/wrjpgcom /bin/sh /Users/daeu/Downloads/jpeg-9c/install-sh -d /usr/local/include /usr/bin/install -c -m 644 jconfig.h /usr/local/include/jconfig.h ./install-sh -c -d '/usr/local/include' /usr/bin/install -c -m 644 jerror.h jmorecfg.h jpeglib.h '/usr/local/include' ./install-sh -c -d '/usr/local/share/man/man1' /usr/bin/install -c -m 644 cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1 '/usr/local/share/man/man1' ./install-sh -c -d '/usr/local/lib/pkgconfig' /usr/bin/install -c -m 644 libjpeg.pc '/usr/local/lib/pkgconfig'
インストールの確認
最後にインストールされたことを確認しておきましょう。
今まで作成したC言語のプログラムファイルをコンパイルしてやるときに、最後に -ljpeg
オプションを付けてコンパイルしてみてください。下記のような感じです。
-ljpeg
を付けると libjpeg をリンクしてやることが可能になります。これにより自分のプログラムで jpeg 関連の様々な関数が使用可能になります。
gcc japanese.c -o japanese.exe -ljpeg
エラーが表示されずコンパイルが完了すれば、libjpeg のインストールに成功です。
インストールがうまくできていなければ下記のようなメッセージが表示されますので再度手順を確認してみてください。
ld: library not found for -ljpeg clang: error: linker command failed with exit code 1 (use -v to see invocation)
libjpeg を使用したJPEGファイル読み込み・書き込み関数の作成
続いて、インストールした libjpeg を用いて JPEG ファイルを読み込み・書き込みを行う関数の例を紹介していきたいと思います。
スポンサーリンク
ヘッダーファイル
まずは libjpeg に関連するヘッダーをインクルードしたり、必要な構造体の定義、JPEG ファイルを読み込み・書き込みする関数の定義を行うヘッダーファイルを用意します。
下記がそのヘッダーファイルの例になります。
#include <stdio.h>
#include <stdlib.h>
#include "jpeglib.h"
typedef struct{
unsigned char *data;
unsigned int width;
unsigned int height;
unsigned int ch;
} BITMAPDATA_t;
int jpegFileReadDecode(BITMAPDATA_t *, const char*);
int jpegFileEncodeWrite(BITMAPDATA_t *, const char*);
int freeBitmapData(BITMAPDATA_t *);
ポイントを説明していきます。
jpeglib.h
のインクルード
libjpeg が提供する関数の宣言や定数の定義等は jpeglib.h
で行われています。
ですので、libjpeg を利用する場合は jpeglib.h
をインクルードする必要があります。
#include "jpeglib.h"
BITMAP 形式データ構造体の定義
また、下記では BITMAP 形式データの情報格納用構造体 BITMAPDATA_t
を定義しています。
typedef struct{
unsigned char *data;
unsigned int width;
unsigned int height;
unsigned int ch;
} BITMAPDATA_t;
それぞれのメンバの説明は下記のようになります。
data
:PNG をデコードした BITMAP 形式画像データの先頭アドレスwidth
:画像の横幅height
:画像の高さch
:画像の色数(カラーの時は3
、グレーの時は1
)
BITMAP 形式画像データって何?という方は下記ページで説明していますので是非参考にしてください。
画像データの構造・画素・ビットマップデータについて解説上のページでも解説しているように data
のポインタの先は下図のように各ピクセルの RGB 順にデータが並んでいます。
ソースファイル
次は実際に libjpeg が提供している関数を利用して JPEG ファイルを読み込んだり、JPEG ファイルとして保存したりする関数を作成していきます。
#include "myJpeg.h"
int jpegFileReadDecode(BITMAPDATA_t *bitmapData, const char* filename){
struct jpeg_decompress_struct jpeg;
struct jpeg_error_mgr err;
FILE *fi;
int j;
JSAMPLE *tmp;
jpeg.err = jpeg_std_error(&err);
fi = fopen(filename, "rb");
if(fi == NULL){
printf("%sは開けません\n", filename);
return -1;
}
jpeg_create_decompress(&jpeg);
jpeg_stdio_src(&jpeg, fi);
jpeg_read_header(&jpeg, TRUE);
jpeg_start_decompress(&jpeg);
printf("width = %d, height = %d, ch = %d\n", jpeg.output_width, jpeg.output_height, jpeg.out_color_components);
bitmapData->data =
(unsigned char*)malloc(sizeof(unsigned char) * jpeg.output_width * jpeg.output_height * jpeg.out_color_components);
if(bitmapData->data == NULL){
printf("data malloc error\n");
fclose(fi);
jpeg_destroy_decompress(&jpeg);
return -1;
}
for(j = 0; j < jpeg.output_height; j++){
tmp = bitmapData->data + j * jpeg.out_color_components * jpeg.output_width;
jpeg_read_scanlines(&jpeg, &tmp, 1);
}
bitmapData->height = jpeg.output_height;
bitmapData->width = jpeg.output_width;
bitmapData->ch = jpeg.out_color_components;
jpeg_finish_decompress(&jpeg);
jpeg_destroy_decompress(&jpeg);
fclose(fi);
return 0;
}
int jpegFileEncodeWrite(BITMAPDATA_t *bitmapData, const char *filename){
struct jpeg_compress_struct jpeg;
struct jpeg_error_mgr err;
FILE *fo;
JSAMPLE *address;
int j;
jpeg.err = jpeg_std_error(&err);
jpeg_create_compress(&jpeg);
fo = fopen(filename, "wb");
if(fo == NULL){
printf("%sは開けません\n", filename);
jpeg_destroy_compress(&jpeg);
return -1;
}
jpeg_stdio_dest(&jpeg, fo);
jpeg.image_width = bitmapData->width;
jpeg.image_height = bitmapData->height;
jpeg.input_components = bitmapData->ch;
jpeg.in_color_space = JCS_RGB;
jpeg_set_defaults(&jpeg);
jpeg_set_quality(&jpeg, 50, TRUE);
jpeg_start_compress(&jpeg, TRUE);
for (j = 0; j < jpeg.image_height; j++ ) {
address = bitmapData->data + (j * bitmapData->width * bitmapData->ch);
jpeg_write_scanlines(&jpeg, &address, 1);
}
jpeg_finish_compress(&jpeg);
jpeg_destroy_compress(&jpeg);
return 0;
}
int freeBitmapData(BITMAPDATA_t *bitmap){
free(bitmap->data);
return 0;
}
特に JPEG の読み込みを行う jpegFileReadDecode
関数と、JPEG の書き込みを行う jpegFileEncodeWrite
関数の詳細を解説していきます。
JPEG ファイルの読み込みを行う関数
jpegFileReadDecode
関数は JPEG ファイルを読み込む関数になります。
jpegFileReadDecode
の処理の流れは下記の通りです。
- エラーハンドラの設定
- デコーダの初期化
- 読み込む JPEG ファイルの設定
- JPEG のヘッダ読み込み
- デコードの開始
- デコード結果格納用のメモリ確保
- デコードとメモリへのコピー
- 画像情報を
BITMAPDATA_t
へ格納 - デコーダの終了
ここから各処理の詳細を解説していきます。
エラーハンドラの設定
下記でエラーハンドラの設定を行っています。これによりエラー起きた時にエラーの原因を出力してくれるようになります。
jpeg.err = jpeg_std_error(&err);
デコーダの初期化
下記でデコーダの初期化・作成を行います。今後はこのデコーダを利用して、JPEG ファイルのデコードを行うことになります。
jpeg_create_decompress(&jpeg);
読み込む JPEG ファイルの設定
下記で読み込む JPEG ファイルの設定を行います。第2引数の fi
は事前に fopen
でオープンしたファイルポインタになります(fopen
の戻り値)。
jpeg_stdio_src(&jpeg, fi);
JPEG のヘッダの読み込み
続いて JPEG ファイルのヘッダの読み込みを下記で行っています。これにより第1引数の jpeg
に JPEG の情報(画像サイズなど)が格納されます。
jpeg_read_header(&jpeg, TRUE);
デコードの開始
下記ではデコードの開始を libjpeg に指定しています。この後に、後に説明する jpeg_read_scanlines
を実行することで、JPEG ファイルをデコードすることができます。
jpeg_start_decompress(&jpeg);
デコード結果格納用のメモリ確保
下記ではデコードした結果を格納するメモリを malloc(
関数で確保しています。
jpeg.output_width
や jpeg.output_height
、jpeg.out_color_components
は事前に jpeg_read_header
で JPEG のヘッダーから取得した情報(幅・高さ・色数)になります。
bitmapData->data =
(unsigned char*)malloc(sizeof(unsigned char) * jpeg.output_width * jpeg.output_height * jpeg.out_color_components);
デコードとメモリへのコピー
下記では実際に JPEG のデコードを行っています。
jpeg_read_scanlines
では1ラインずつ順々に JPEGファイル がデコードされ、ビットマップデータに変換されます。
デコードする JPEG ファイルは事前に jpeg_stdio_src
で jpeg
に設定したファイルになります。
jpeg_read_scanlines
の第2引数にはデコードしたビットマップデータを格納するアドレスを格納したポインタのアドレスを指定します。
型としてはポインタのポインタになるところに注意です。
下記を JPEG 画像の高さ分繰り返すことで、JPEG 全体のデコードを行っています。
jpeg_read_scanlines
を実行して1ラインデコードする- デコードしたビットマップデータを格納するアドレスを1ライン分ずらす
for(j = 0; j < jpeg.output_height; j++){
tmp = bitmapData->data + j * jpeg.out_color_components * jpeg.output_width;
jpeg_read_scanlines(&jpeg, &tmp, 1);
}
画像情報を BITMAPDATA_t
へ格納
下記で画像の情報(具体的には高さと幅と色数)を BITMAPDATA_t
構造体のメンバに格納しています。
JPEG デコード後のビットマップデータに画像処理などを行う場合は、この情報を用いて処理を実行します。
bitmapData->height = jpeg.output_height;
bitmapData->width = jpeg.output_width;
bitmapData->ch = jpeg.out_color_components;
デコーダの終了
以上で JPEG のデコードは完了していますので、最後に JPEG のデコーダを下記で終了させています。
jpeg_finish_decompress(&jpeg);
jpeg_destroy_decompress(&jpeg);
スポンサーリンク
JPEG ファイルの書き込み(保存)を行う関数
jpegFileEncodeWrite
関数は JPEG ファイルを書き込む(保存する)関数になります。
jpegFileEncodeWrite
関数の処理の流れは下記の通りです。
- エラーハンドラの設定
- エンコーダの作成
- エンコード結果の書き込み先ファイル設定
- ヘッダ情報の設定
- 画質の設定
- エンコード開始
- エンコードとファイル書き込み
- エンコーダの終了
ここから各処理の詳細を解説していきます。
エラーハンドラの設定
下記で JPEG 読み込み時同様にエラーハンドラの設定を行っています。
jpeg.err = jpeg_std_error(&err);
エンコーダの作成
続いて下記でエンコーダを作成しています。今後はこのエンコーダ jpeg
を使って JPEG のエンコードを行なっていきます。
jpeg_create_compress(&jpeg);
エンコード結果の書き込み先ファイル設定
下記ではエンコードした結果を書き込むファイルを設定しています。第2引数 fo
には、その書き込み先となるファイルポインタを指定します(fopen
の戻り値)。
jpeg_stdio_dest(&jpeg, fo);
ヘッダ情報の設定
続いて書き込む JPEG ファイルのヘッダーの情報を設定します。
このページで紹介している関数では、画像の情報は BITMAPDATA_t
構造体に格納するようにしていますので、この構造体のポインタ変数である bitmapData
から画像の情報を参照してヘッダ情報を設定しています。
jpeg.image_width = bitmapData->width;
jpeg.image_height = bitmapData->height;
jpeg.input_components = bitmapData->ch;
jpeg.in_color_space = JCS_RGB;
jpeg_set_defaults(&jpeg);
最後に実行しているjpeg_set_defaults
は、設定されていない残りのヘッダ情報をデフォルト値に設定してくる関数です。
ただし jpeg_set_defaults
関数では、予め設定された in_color_space
に基づいてヘッダ情報を設定するようでしたので、in_color_space
を設定してからこの関数は実行した方が良さそうです。
画質の設定
JPEG では画質を設定することが可能です。
この画質は jpeg_set_quality
の第2引数で指定することが可能です。指定可能な値は 0
から 100
のようで、値が大きい方が画質が良くなるようです。
jpeg_set_quality(&jpeg, 50, TRUE);
エンコード開始
下記では jpeg_start_compress
を実行してエンコードの開始を行います。
これ以降に jpeg_write_scanlines
を実行することで JPEG のエンコードを行うことができます。
jpeg_start_compress(&jpeg, TRUE);
エンコードとファイル書き込み
実際に JPEG をエンコードし、ファイルにそのエンコード結果を書き込んでいるのが下記になります。
第2引数で指定したポインタのポインタに格納されているアドレスのデータが JPEG にエンコードされて jpeg_stdio_dest
で設定したファイルに書き込みが行われます。
これも読み込み時と同様に 1 ラインずつ処理を行わせています。
for (j = 0; j < jpeg.image_height; j++ ) {
address = bitmapData->data + (j * bitmapData->width * bitmapData->ch);
jpeg_write_scanlines(&jpeg, &address, 1);
}
エンコーダの終了
エンコードが完了したら、最後に下記でエンコーダの終了を行います。
jpeg_finish_compress(&jpeg);
jpeg_destroy_compress(&jpeg);
作成した JPEG 読み込み・書き込み関数の使用例
上記で作成した関数の使い方がイメージつくように使用例を書いてみました。
#include "myJpeg.h"
int main(int argc, char *argv[]){
BITMAPDATA_t bitmap;
int i, j, c;
int ave, sum;
char outname[256];
FILE *fo;
if(argc != 2){
printf("ファイル名が指定されていません\n");
return -1;
}
if(jpegFileReadDecode(&bitmap, argv[1]) == -1){
printf("jpegFileReadDecode error\n");
return -1;
}
printf("bitmap->data = %p\n", bitmap.data);
printf("bitmap->width = %d\n", bitmap.width);
printf("bitmap->height = %d\n", bitmap.height);
printf("bitmap->ch = %d\n", bitmap.ch);
#if 0
/* ちゃんと読み込めているか確認する場合はここを有効に */
fo = fopen("testoutput.ppm", "wb");
fprintf(fo, "P6\n#\n%d %d\n255\n", bitmap.width, bitmap.height);
fwrite(bitmap.data, bitmap.height * bitmap.width * 3, 1,fo);
fclose(fo);
#endif
/* グレースケールに変換 */
for(j = 0; j < bitmap.height; j++){
for(i = 0; i < bitmap.width; i++){
sum = 0;
for(c = 0; c < bitmap.ch; c++){
sum += bitmap.data[bitmap.ch * (i + j * bitmap.width) + c];
}
ave = sum / bitmap.ch;
for(c = 0; c < bitmap.ch; c++){
bitmap.data[bitmap.ch * (i + j * bitmap.width) + c] = ave;
}
}
}
sprintf(outname, "%s", "output.jpg");
if(jpegFileEncodeWrite(&bitmap, outname) == -1){
printf("jpegFileEncodeWrite error\n");
freeBitmapData(&bitmap);
return -1;
}
freeBitmapData(&bitmap);
return 0;
}
処理の流れ
この main
関数の処理の流れは下記の通りです。
jpegFileReadDecode
関数を使用して JPEG ファイルの読み込みデコード- 1. でデコードした BITMAP データに対して画像処理
- 2. 画像処理後の BITMAP データを
jpegFileEncodeWrite
関数を使用してエンコード & JPEG ファイルへの書き込み freeBitmapData
関数でメモリ解放して終了
画像処理
2. の画像処理では、1. でデコードした画像をグレースケールに変換しています(単純に RGB の輝度値の平均値を求めているだけ)。
画像処理をいろいろ試す場合はここをいろいろ変更して試してみると良いと思います。
/* グレースケールに変換 */
for(j = 0; j < bitmap.height; j++){
for(i = 0; i < bitmap.width; i++){
sum = 0;
for(c = 0; c < bitmap.ch; c++){
sum += bitmap.data[bitmap.ch * (i + j * bitmap.width) + c];
}
ave = sum / bitmap.ch;
for(c = 0; c < bitmap.ch; c++){
bitmap.data[bitmap.ch * (i + j * bitmap.width) + c] = ave;
}
}
}
コンパイル
このページで紹介するソースコードでは、 JPEG 読み込み用・書き込み用の関数を myJpeg.c
に作成し、それらの関数のプロトタイプ宣言をヘッダーファイルの myJpeg.h
で行っています。
ですので、上記のソースコードで myJpeg.h
のインクルードを行なっています。
違う名前にする場合は変更必要ですのでお気をつけください。
このページで紹介しているファイル名でソースコードファイルを作成している時、下記のコマンドでコンパイルとプログラムの実行が可能です。
gcc main.c -c gcc myJpeg.c -c gcc main.o myJpeg.o -o jpeg.exe -ljpeg ./jpeg.exe test.jpeg
コンパイル時に -ljpeg
を付けて libjpeg にリンクすることを忘れないようにしましょう!
実行結果
引数で読み込みたい JPEG ファイルへのパスを指定して実行すれば、その JPEG ファイルをモノクロ化した JPEG ファイル output.jpg が出力されます。
入力した JPEG と出力結果の JPEG もここに表示しておきます(このファイルであれば動作確認しています)。
・入力JPEG
・出力JPEG
また、ここで載せたソースコードはあくまで一例です。
JPEG ファイルを読み込んでデコードするあたりや JPEG ファイルをエンコードして書き込むあたりはご自身が使いやすいようにカスタマイズしてください。
libjpeg が提供する関数
libjpeg が提供する関数の説明は、libjpeg インストール時にダウンロードしてきたフォルダ内の libjpeg.txt に記載されています。
英語なので読むのは大変かもですが・・・。
このページは libjpeg のインストール方法や使用例の紹介を目的としたページであり、libjpeg のライセンス体系については私も詳しくないのでこのページでは言及していません
libjpeg を使用する方は自己責任で使用してください
例えば商用利用等を行う場合はライセンス体系についてご自分で調査してから使用の可否をご判断ください
スポンサーリンク
XCodeでの libjpeg 使用方法
libjpeg を XCode で使用するためには2つの手順が必要です。
インクルードパスを追加
libjpeg 関連の関数をソースコードで使用するためには、これらの関数が定義されているヘッダーファイルをインクルードする必要があります。そのヘッダーファイルがある場所を XCode のプロジェクトに認識させる必要があります。
上の画像の通りに Header Search Paths に jpeglib.h
の置いてあるパスを追加します。
このページで紹介したインストール方法でインストールした場合は下記にヘッダーが存在すると思います。
/usr/local/include
リンク対象ファイル追加
libjpeg を使用するためにライブラリファイルをリンク対象とする必要があります。
上の画像の通りに Link Binary With Libraries に libjpeg.a
を追加すれば良いです。
このページで紹介したインストール方法でインストールした場合は下記にライブラリファイルが存在すると思います。
/usr/local/lib
ただし、ここにライブラリがあるとファイルの選択時にこの場所が選択できないかもしれません
その場合は「書類フォルダ」等の適当な場所にコピーしておくと良いと思います。ターミナルから下記のコマンドで libjpeg 関連のライブラリファイルがコピーができます。
cp /usrlocal/lib/libjpeg.* [コピー先]
スポンサーリンク
まとめ
このページでは libjpeg のインストール方法とその使い方について解説しました。
JPEG は現状一番普及している画像フォーマットです。ただその JPEG を読み込むプログラムを作ろうと思うとめちゃくちゃ難しいです。
しかし libjpeg を使えば簡単に JPEG の読み込みや作成が出来てしまいます。是非このページを参考にして libjpeg をインストールしてみてください!
私のサイトでは他にも LibTIFF や libpng、libwebp のインストール方法や使い方についても解説していますので、他の画像フォーマットを利用したい方は是非下記のページも読んでみてください。
【C言語】LibTIFFのインストールと使用方法・使用例 【C言語】libpngのインストールと使用方法・使用例 【C言語】libwebpのインストールと使用方法・使用例