
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
libjpegライブラリの使い方につ...
-
html内にスライドショーを複数設置
-
Javascriptで指定した日付と時...
-
Nivo Sliderのエフェクトについて
-
Excel VBAに翻訳して頂けません...
-
window.openで値の渡し方を教え...
-
-UWSC:IEで自動クリック-
-
MAX関数を使ってからLEFT JOIN...
-
Dreamweaverで正規表現
-
Javascriptで現在のページ番号...
-
img 上の任意の座標範囲の色を...
-
リンクで違うページの指定箇所...
-
画像を切り替えランダム表示
-
指定字数以降隠す
-
positionのrelativeとabsolute...
-
Ctrl+F(検索)の窓を出したいの...
-
【HTML、VBScript】HTAでのイベ...
-
スライドショー「Skitter」をカ...
-
JSPでの画像ファイル表示
-
c++std::string型をTCHARに変換...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JavaScriptで変更した属性の元...
-
画像が表示でnull; this.src
-
javascriptでのパスについて
-
pythonの構文の基本事項について
-
MFCで画像を表示させているので...
-
pythonのpygameでキャラクター...
-
Vb.net2005での画像の合成方法
-
nodejsの画像表示は特別なこと...
-
セグメンテーション違反なって...
-
HTMLからimgのsrcのみを正規表...
-
error LNK2019 未解決のシンボ...
-
エクセル スクレイピングについて
-
ラズパイでno module named zbar
-
jQuery 複数のfind()
-
OpenCV での画素値の比較について
-
外部javascriptの重複を防ぐには
-
jqueryのimgpreviewというプラ...
-
jQueryで画像がちゃんとプリロ...
-
imageクラスからiconクラスに変...
-
html内にスライドショーを複数設置
おすすめ情報