画像のdpi値の求め方

解決


えび  2013-07-10 05:36:54  No: 44816

画像ファイルのdpi値の調べ方を教えてください。
jpeg,bitmap,gifの3種類を使用します、よろしくお願いします。


Harry  2013-07-10 08:53:37  No: 44817

いくつか方法があると思いますが、固そうなところで GDIPlus の GetHorizontalResolution() と、
GetVerticalResolution() で取得できるのではないでしょうか。
これ以上の情報をお求めなら、環境や、えびさんによるGDIPlusの使用可否等をお知らせ下さい。

あと、前の質問の「自己解決」って気になるんですが、簡単な顛末だけでも追記願えないですか?
Q&A掲示板ですから、どのように解決したのかが重要だと思いますので。


えび  2013-07-10 09:35:46  No: 44818

Harryさんありがとうございます。
環境は、Delphi2007/Windows7ですが、GDIPlusは使ったことが無く全く分からないので、まずはそれを調べてみます。

前回の質問に関しては、対処方法を追記しました。


Harry  2013-07-10 10:14:09  No: 44819

>前回の質問に関しては、対処方法を追記しました。
了解です!

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さん…(涙)


HIRO  2013-07-10 14:32:14  No: 44820

>jpeg,bitmap,gifの3種類
gifファイルにdpi情報はありません。

ちょっと気になって調べてみたらGetHorizontalResolution、GetVerticalResolutionは
解像度情報がない場合、デスクトップのdpiを返すようです。
同じファイルでも実行環境によって値が変わります。


えび  2013-07-10 20:10:17  No: 44821

Harryさん
ダウンロードしたソースは、私の環境だとコンパイルできなかったのですが、
TmsSoftowareコンポーネントパックにほとんど同じ内容のものがあったので、
そちらで代用しました。
>[DCC エラー] DirectDraw.pas(358): E2154 'IDirectDrawSurface' 型は終了処理が必要です - 構造体の可変部に置くことは許されません

----------
var
  GPImage: TGPImage;
  GPGraphics: TGPGraphics;

GPImage := TGPImage.Create(ファイル名);
GPGraphics := TGPGraphics.Create(GPImage);

これで必要な関数郡を呼び出すことができました、ありがとうございます。

HIROさん、捕捉の情報ありがとうございます。


Harry  2013-07-10 23:15:41  No: 44822

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?を使わせてもらう
・ 自分で頑張って画像ファイルのバイナリから取得してみる(泥沼に注意)


えび  2013-07-11 18:44:13  No: 44823

Harryさん
ダウンロードした版だと、GDIPAPIなどがDirectDrawユニットを参照していて必須になっているようです。

GDIPlus関連が良くわかってないので、とりあえず動かすには?みたいな状態なので、わかり易いドキュメントを探してよく勉強してみます。


Harry  2013-07-12 06:04:18  No: 44824

>ダウンロードした版だと、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

…ということなので、もし余裕があったらどちらかをチャレンジしてみて下さい。

#こういったコンパイルトラブルは、大抵がほんの少し手を加えるだけで動作させられます。色々なライブラリを
取り扱う上では必須の知識だと思いますので、ぜひマスターしてください。


Harry  2013-07-12 06:28:22  No: 44825

大事なことを言い忘れていたので追記。

プロジェクトオプションをいじった後は、おそらくそのままでは設定が反映されませんので、
「プロジェクトの再構築」をすることをお忘れなく。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加