PDF (または PostScript) の画像の「dpi」は、あなたが思っているよりも漠然としています。これは、PDF をさまざまな縮尺でレンダリングできるため、実際の dpi が異なるためです。
ドキュメントに埋め込まれた画像の倍率に関する情報があることは正しいです。これは現在の変換マトリックスですが、単一の値や単一のマトリックスほど単純ではありません。
CTM は座標を理想化された「ユーザー空間」にマッピングします。このユーザー空間は名目上はポイント (1 インチあたり 72) で定義されますが、無限に分割できます。レンダリングに関しては、「ユーザー空間」には「デバイス空間」に適切にスケーリングするためにさらに変換が適用されます。デバイスはおそらく 72 dpi ではないため、変換が必要です。
これについては、PDF リファレンス マニュアル、特に 1.7 リファレンスのセクション 4.2.1 でより完全な説明を見つけることができます。
したがって、画像ディクショナリから宣言された /Width と /Height を取得し、/Matrix を適用して、ユーザー空間での画像の大きさを判断するだけでよいようです。ユーザー空間が事実上 72 dpi であるとすると、画像が何インチにスケーリングされたか、画像に含まれるピクセル数がわかり、単純な除算で必要な答えが得られます。
実際、多くの場合、これは機能します。ただし、あなたの観点からの問題の1つは、マトリックスを連結して現在のスケーリングに影響を与える可能性があり、実際に一般的であるため、画像に適用されたマトリックスを見るだけでは、それに適用されたスケール係数がわかりません。これは、他の何かが CTM を既にスケーリングしている可能性があるためです。さらに、PDF には、ファイルがユーザー空間のデフォルトのスケーリングを変更できるようにする「UserUnit」クラッジが含まれています。
したがって、画像の「dpi」を計算する唯一の方法は、ページの説明を画像がレンダリングされるポイントまで解釈し、そのポイントでの合計スケーリングを計算し、そこから画像がカバーする領域を計算することです。次に、画像の幅と高さが与えられたら、その dpi を計算します。
ついでに、ここに難問があります。同じ画像データを使用して、PDFで同じ画像を複数回描画することは完全に可能です。画像データを含める必要があるのは 1 回だけです。100 x 100 ピクセルの画像を 1 平方インチをカバーするように描画すると、解像度は 100 dpi になります。今度は同じ画像を描きますが、0.5 インチをカバーするように拡大縮小します。レンダリング イメージの解像度は 200 dpi になりました。
では、「画像の dpi」とは何ですか?