libjpegライブラリを使って、画像を読み込んで、縮小表示したいと考えています。
libjpegを使えば、1/2,1/4,1/8は簡単にできると聞いていますが、やり方がわかりません。
優しい回答をいただけないでしょうか?
ちなみにいかに作ってみたコードを示します。
このコードは1/8に設定していますが、実行しても出力される画像が1/2となってしまいます。
どうすればよいでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <jpeglib.h>
void main()
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE *outfile;
JSAMPARRAY img;
int i, j;
// イメージを保持するメモリ領域の確保と初期化
img = (JSAMPARRAY)malloc( sizeof( JSAMPROW ) * 256 );
for ( i = 0; i < 256; i++ ) {
img[i] = (JSAMPROW)malloc( sizeof( JSAMPLE ) * 3 * 256 );
for ( j = 0; j < 256; j++ ) {
img[i][ j * 3 + 0 ] = i;
img[i][ j * 3 + 1 ] = 0;
img[i][ j * 3 + 2 ] = j;
}
}
// JPEGオブジェクトの初期化
cinfo.err = jpeg_std_error( &jerr );
jpeg_create_compress( &cinfo );
// ファイルを開く
outfile = fopen( "a.jpg", "wb" );
jpeg_stdio_dest( &cinfo, outfile );
// パラメータの設定
cinfo.image_width = 256;
cinfo.image_height = 256;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
// デフォルト値の設定
jpeg_set_defaults( &cinfo );
cinfo.scale_num = 1;
cinfo.scale_denom = 8;
// 圧縮の開始
jpeg_start_compress( &cinfo, TRUE );
// 全イメージデータを出力
jpeg_write_scanlines( &cinfo, img, 256 );
// 圧縮の終了
jpeg_finish_compress( &cinfo );
// JPEGオブジェクトの破棄
jpeg_destroy_compress( &cinfo );
// ファイルを閉じる
fclose( outfile );
// イメージデータを保持するメモリ領域を開放
for ( i = 0; i <256; i++ )
free( img[i] );
free( img );
}
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
私もよく理解してはいないので,以下は参考までに.
scale_num/scale_denomは画像の縮小というより低ビットレート向けの画像圧縮が目的で,必要以上に画質を落とさないよう1/2未満に縮小できないようにしてあるのかもしれません.
下のWebページを見るとscale_num/scale_denomが導入されたのはlibjpeg ver.7です.
http://en.wikipedia.org/wiki/Libjpeg
その参照文献であるITU-T JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced Image(p.11)によれば,
So the low-bitrate compression mode consists of following steps:
(1) choose N = 9…16;
(2) cjpeg (compress jpeg) –scale 8/N (downscale);
(3) djpeg (decompress jpeg) –scale N/8 (upscale).
とあるので,compression時に8/16(つまり1/2)未満にすることは想定していないように見えます.
しかし,試してみるとdecompressionのパラメータに設定するscale_num/scale_denomは1/8サイズに展開できるようです.それを使って画像を読み込むときに縮小するか,あるいは自前で縮小処理を実装するのが良いのではないでしょうか.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- 画像編集・動画編集・音楽編集 jpgが拡張子の画像を探しています 2 2023/04/06 10:03
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- PDF PDFに精通した方に質問。JPEGファイル群を一つのPDFファイルにするときの容量変化について 6 2023/07/23 19:06
- 一眼レフカメラ 「Imaging Edge」を手動起動せず、ARWファイルを最高画質JPEGへ変換する方法は? 2 2022/08/05 11:38
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaScriptで変更した属性の元...
-
複数画像のランダム複数表示(...
-
MFCで画像を表示させているので...
-
error LNK2019 未解決のシンボ...
-
imgボタンにfocusの当て方
-
jQueryで、画像クリック→フェー...
-
OpenCV での画素値の比較について
-
jQuery 複数のfind()
-
セクトボックスの連携の仕方。
-
以下のタグはクリックすると画...
-
画像処理 C言語 元画像の幅...
-
Javaの正規表現でimgタグのalt...
-
画像が表示でnull; this.src
-
MAX関数を使ってからLEFT JOIN...
-
javascriptテキストBOX色を元に...
-
jqueryのsortableで一部ソート...
-
removeEventListenerについて
-
Slick.jsのオプションrtlについて
-
どの<li><a> が押されたか判別...
-
クリックで色変更後に既に変更...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JavaScriptで変更した属性の元...
-
MFCで画像を表示させているので...
-
画像が表示でnull; this.src
-
error LNK2019 未解決のシンボ...
-
Vb.net2005での画像の合成方法
-
onclickで画面が固まる・・・ら...
-
リンク先を動的に変更する
-
(javascript)HTMLで指定した...
-
【OpenCV】二値画像後、白の部...
-
jQuery 複数のfind()
-
ラズパイでno module named zbar
-
外部javascriptの重複を防ぐには
-
条件分岐でキーが入力されてい...
-
かぶらないランダム画像
-
HTMLからimgのsrcのみを正規表...
-
pythonで、tkinterとpillowの組...
-
OpenCV での画素値の比較について
-
imgボタンにfocusの当て方
-
指定したフォルダの画像を一括...
-
OpenCVでサンプルコードを使う...
おすすめ情報