画像ファイルのdpi値の調べ方を教えてください。
jpeg,bitmap,gifの3種類を使用します、よろしくお願いします。
いくつか方法があると思いますが、固そうなところで GDIPlus の GetHorizontalResolution() と、
GetVerticalResolution() で取得できるのではないでしょうか。
これ以上の情報をお求めなら、環境や、えびさんによるGDIPlusの使用可否等をお知らせ下さい。
あと、前の質問の「自己解決」って気になるんですが、簡単な顛末だけでも追記願えないですか?
Q&A掲示板ですから、どのように解決したのかが重要だと思いますので。
Harryさんありがとうございます。
環境は、Delphi2007/Windows7ですが、GDIPlusは使ったことが無く全く分からないので、まずはそれを調べてみます。
前回の質問に関しては、対処方法を追記しました。
>前回の質問に関しては、対処方法を追記しました。
了解です!
GDIPlusのライブラリが添付されてるのは、どうもDelphi XE2かららしい?ですね。
いきなりハマる可能性のあるポイントだと思いますので、これまた固い(著名な)ライブラリと、
確実な入手先をお知らせしておきます。
gdiplus.zip - progdigy.com - Internet Archive Wayback Machine 2013/03/13
http://web.archive.org/web/20130313000246/http://www.progdigy.com/files/gdiplus.zip
Wayback Machine、それはとても悲しいことです。Henri Gourvestさん…(涙)
>jpeg,bitmap,gifの3種類
gifファイルにdpi情報はありません。
ちょっと気になって調べてみたらGetHorizontalResolution、GetVerticalResolutionは
解像度情報がない場合、デスクトップのdpiを返すようです。
同じファイルでも実行環境によって値が変わります。
Harryさん
ダウンロードしたソースは、私の環境だとコンパイルできなかったのですが、
TmsSoftowareコンポーネントパックにほとんど同じ内容のものがあったので、
そちらで代用しました。
>[DCC エラー] DirectDraw.pas(358): E2154 'IDirectDrawSurface' 型は終了処理が必要です - 構造体の可変部に置くことは許されません
----------
var
GPImage: TGPImage;
GPGraphics: TGPGraphics;
…
GPImage := TGPImage.Create(ファイル名);
GPGraphics := TGPGraphics.Create(GPImage);
これで必要な関数郡を呼び出すことができました、ありがとうございます。
HIROさん、捕捉の情報ありがとうございます。
HIROさん
私もGIFはどーなの?と思ってました。手元のIrfanViewでDPI変更しても実際には変わりません。
えびさん
少し勘違いされてるような…DirectDraw.pasのコンパイルエラー? デモをコンパイルしたのでしょうか。
DirectDrawは使わないです。というか、何のために同梱されてるのか知りません。
GDIPlusで検索するとたくさんサンプルが見つかると思いますが、そこで必要なのは基本的に GDIPOBJ.pas、
GDIPAPI.pas、GDIPUTIL.pas の3つだけです。
それと、TGPGraphicsは不要ですね。下記のコードではTGPImageでなくTGPBitmapにしてみました。
解像度情報がない場合の対策としては、GetFlags()を利用すると良いのかなー、と。
GetHorizontalResolution のように、関数名で検索するとMSDNなどでたくさんヒットします。
そこで関連情報を仕入れると良いです。GDI+に関してはMSDNの情報がほぼそのまま使えますしね。
implementation
{$R *.dfm}
uses
GDIPOBJ,
GDIPAPI; // GetFlags()で使うImageFlags定数(ImageFlagsHasRealDPI ほか)
procedure TForm1.Button1Click(Sender: TObject);
const
mHasRealDPI: array[Boolean] of String =('ウソです!', '本当です。');
var
GPBmp: TGPBitmap;
ResoH, ResoV: Single;
Flags: UINT;
begin
if OpenDialog1.Execute then begin
GPBmp:=TGPBitmap.Create(OpenDialog1.FileName);
try
ResoH:=GPBmp.GetHorizontalResolution();
ResoV:=GPBmp.GetVerticalResolution();
Flags:=GPBmp.GetFlags();
finally
GPBmp.Free;
end;
Memo1.Lines.Add('');
Memo1.Lines.Add(OpenDialog1.FileName);
Memo1.Lines.Add(Format('%g x %g DPI (%s)',
[ResoH, ResoV, mHasRealDPI[(Flags and ImageFlagsHasRealDPI)<>0]]));
end;
end;
ついでに。私が思いついた、いくつかの方法。
・ GDI+ の GetHorizontalResolution()/GetVerticalResolution()
・ OS(というかExplorerのファイルのプロパティ)の機能を使う
・ ImageMagickのidentify -format(ImageMagickObject COM+ もある)
・ 誰かが作った画像処理用DLL?を使わせてもらう
・ 自分で頑張って画像ファイルのバイナリから取得してみる(泥沼に注意)
Harryさん
ダウンロードした版だと、GDIPAPIなどがDirectDrawユニットを参照していて必須になっているようです。
GDIPlus関連が良くわかってないので、とりあえず動かすには?みたいな状態なので、わかり易いドキュメントを探してよく勉強してみます。
>ダウンロードした版だと、GDIPAPIなどがDirectDrawユニットを参照していて必須になっているようです。
おわー、本当ですね。勘違いしていたのは私の方でした。すみません。
>>[DCC エラー] DirectDraw.pas(358): E2154 'IDirectDrawSurface' 型は終了処理が必要です - 構造体の可変部に置くことは許されません
これは、このライブラリが Delphi2007 のまだ存在していない時代に作られたものなので、Delphiのバージョンに
よる振り分けコンパイルが正しく働いていないために発生していますね。
対策としては、プロジェクトオプションの[ディレクトリ/条件]→ 条件・条件定義 に、VER150を入れてやれば
Delphi7用の振り分けでコンパイルしてくれるので、うまく行くと思います。
※誤ってこのVER150をデフォルトの設定にしないようご注意。以後の新規プロジェクトすべてがこの設定になって
しまいます。D6だとダイアログ下部の「デフォルト」チェックボタンです。これにチェックを入れちゃいけません!
新規プロジェクトを作成するごとに毎回条件定義する以外に、ソースに直接手を加えてしまう方法もあります。
こちらの方が確実・正確で、毎回の手間がかからないので良いかもしれません。
その一例をMr.XRAYさんが紹介しています。(これを載せるんだ〜!と言われてる気がしました)
GDI+ API の導入 - サンプルプログラム集 [192_線の端点形状の変更と GDI+] 【Mr.XRAY】
http://mrxray.on.coocan.jp/Delphi/plSamples/192_GDIplusBasic.htm
…ということなので、もし余裕があったらどちらかをチャレンジしてみて下さい。
#こういったコンパイルトラブルは、大抵がほんの少し手を加えるだけで動作させられます。色々なライブラリを
取り扱う上では必須の知識だと思いますので、ぜひマスターしてください。
大事なことを言い忘れていたので追記。
プロジェクトオプションをいじった後は、おそらくそのままでは設定が反映されませんので、
「プロジェクトの再構築」をすることをお忘れなく。
ツイート | ![]() |