現在JPEGをサムネイル(カタログ?)表示するものを開発しています。
ある程度形が出来てきた所で、現在使用しているJPEGライブラリに不具合が見つかり、
違うものを探しています。
現在使用している物は http://www.anthemion.co.uk/にあるCImage 1.4
で読込めないJPEGがありました。
このライブラリを少し修正してサムネイル表示用に1/8、1/4、1/2、1/1で読込めるようにしてい
ます。
ここで本題なんですが、サムネイル表示用に小さく読込めるJPEGライブラリってないでしょう
か?
できればVC++で利用できるC++のライブラリ。
あとIJGのライブラリを使って小さく読込める方法があるサイト情報など
それとインテルのJPEGライブラリって無くなったでしょうか?
サイト内を移動していくとIPP3.0ってとこになってしまいます
よろしくお願いします。
>IJGのライブラリを使って小さく読込める方法
ふつうにJPEGをデコードしてそれを小さくすればよいだけでは?
一行ずつデコードしては小さくするようにすれば、
そう面倒なことでもないし、メモリも食いません。
>インテルのJPEGライブラリ
今でもあります。評価版なら今でもダウンロードできるかと。
正規のものは購入になるとおもいます。
レスありがとうございます。
>ふつうにJPEGをデコードしてそれを小さくすればよいだけでは?
勉強不足でJPEGの知識がありません。なのでこれもどうしてよいかわかりません。
現在使用しているCImageではIJGライブラリのexsample.cのread_JPEG_fileを基本にして、
jpeg_decompress_structのscale_num、scale_denomを設定しています。
scale_denomを1,2,4,8にすると小さくなります。
使用方法があっているかどうかわかりませんが、とりあえず小さく読込めています。
またまた問題で
今、CImageのIJGライブラリを最新?の6bに変えてみました
すると、今度はすべてのJPEGでエラーになります。
しかもよくわからないsetjmpなのでどうしていいか困っています。
setjmpの動きがわかりません。ステップ実行していると突然setjmpの行にいきます
解決する方法って有りますか?
何方かアドバイスお願いします
>使用方法があっているかどうかわかりませんが、とりあえず小さく読込めています
読み込んだ後に小さくしてるのでは?
私も過去にIJGのライブラリでjpegビューワを作ったことがあります。
もうすっかり忘れましたがバージョンは6bだったと思います。
それで、アドバイスではないですがたしかIJGからDLしたファイルの中に
example.cというファイルがあったと思います。
http://software.nikkeibp.co.jp/software/download/down00c.html
の2000年3月(2月だったか?)のサンプルの二つを読みながらどうにかこうにか
出来ました。
出来たって言うよりほとんど真似てみました。
ぜんぜんアドバイスじゃなくてすいません。
通りすがりさん、beginnerさんありがとうございました。
違う方法で解決しました
どのように解決したかご教授ください
長くなりますがすみません
vectorにあったNxLibを使用します。このNxLibもIJGライブラリを使用しています。
NxLibをチュートリアルを見て使用できる状態にしてから、
NxLibでしようしているIJGライブラリの一部を変更します。
1.JDAPIMIN.C のdefault_decompress_parms関数内の
cinfo->scale_denom = 1; の値を変数で変更できるようにする
default_decompress_parms (j_decompress_ptr cinfo)を
default_decompress_parms (j_decompress_ptr cinfo, int nScaleDenom)に変更して
cinfo->scale_denom = 1を
cinfo->scale_denom = nScaleDenom;に変更
2.default_decompress_parmsをgrepで検索して、使用している関数すべてを変更
default_decompress_parmsが呼ばれる流れは
jpeg_read_header → jpeg_consume_input → default_decompress_parms なので
JDAPIMIN.C の
jpeg_read_header (j_decompress_ptr cinfo, boolean require_image, int
nScaleDenom)
↑内のretcode = jpeg_consume_input(cinfo, nScaleDenom);
jpeg_consume_input (j_decompress_ptr cinfo, int nScaleDenom)
↑内のdefault_decompress_parms(cinfo, nScaleDenom);
JPEGLIB.H の
EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,
boolean require_image, int nScaleDenom));
EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo, int nScaleDenom));
に変更する。nScaleDenomを渡すだけ
grep検索した時に
#define jpeg_consume_input jConsumeInput
がヒットしますがこれをどう変更してよいかわからないのでそのままです
NxLibのクラスの一部を変更します。
1.NxJPEGImageLoader.cpp のCreateDIBImage内の
jpeg_read_header(&cinfo, TRUE );を
jpeg_read_header(&cinfo, TRUE, 1 );に変更
2.NxJPEGImageLoader.cpp のCreateDIBImageをそっくりコピーして、
CNxDIBImage* CNxJPEGImageLoader::CreateDIBImage(CNxFile& nxfile)を
CNxDIBImage* CNxJPEGImageLoader::CreateDIBImage(CNxFile& nxfile, int
nScaleDenom)に変更
jpeg_read_header(&cinfo, TRUE );を
jpeg_read_header(&cinfo, TRUE, nScaleDenom );に変更
NxJPEGImageLoader.h に
CNxDIBImage* CreateDIBImage(CNxFile& nxfile, int nScaleDenom = 1);を追加
以上を行いバッチビルドをしてライブラリを完成させます。
あとは追加した関数を使用するだけです。
私がやった事は CNxDIBImage を内部に持ったクラスを作成しました。
このクラスにCImageのときに使用した関数のDraw、Stretch、MakeBitmap、を追加して使用し
ています。