web-dev-qa-db-ja.com

-allフラグを使用すると、pdfimagesによって生成される画像が異なるのはなぜですか?

pdfimages -allはネイティブ形式のPDFから画像を抽出することを理解しています。

したがって、そのコマンドから抽出されたJPG(損失のある)画像には、-allオプションなしで作成された.ppmおよび.pbmファイルと、右クリックして作成されたPNG(損失のない)ファイルと同じピクセル情報が含まれると予想しました画像をEvinceに保存します。

ただし、ImageMagick compareコマンドを使用すると、JPGファイルに含まれる画像が上記の他のオプションと比較して異なることがわかります。再現するには、このリンクでPDFをダウンロードし( https://fccid.io/document.php?id=2149405 )、pdfimagesおよびpdfimages -allの引数として使用し、 compareの引数として、最初の.ppmファイルと最初の.jpgファイルを使用します。これを行うと、画像の違いを示す赤を含む画像ファイルが生成されます。

わからないことがありますか? pdfimagesは、.ppmおよび.pbmファイルを作成するときにデフォルトでピクセル情報を追加しますか?

5
Orion751

pdfimages -allは、pdfに保存されたexactファイルを返します。

ラウンドトリップを行うことでこれをテストできます:jpg画像から始めて、LaTeXを使用してそれをpdfに追加し、pdfimages -allを使用して抽出し、それを元のものと比較します。 (LaTeXを使用する理由については後で説明します。)

リンクから抽出した最初のjpg画像があり、device.jpgという名前を付けました。 LaTeXを使用してPDFファイルに入れましょう:

$ cat img.tex 
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics[width=5in,keepaspectratio]{device}
\end{document}
$ pdflatex img
[...snip...]
Output written on img.pdf (1 page, 672455 bytes).
Transcript written on img.log.

それでは、pdfimages -allを使用してそれを抽出し、元のものと比較しましょう。

$ pdfimages -all img.pdf img-all
$ cmp device.jpg img-all-000.jpg 
$

抽出されたjpgは、オリジナルとbyte-for-byte同一です。

脚注:LaTeXを使用する理由

上記のテストは、PDF作成者のみを使用して行うことはできません。これは、すべてのPDF作成者が画像をPDFに入れないわけではないためです。たとえば、ImageMagickのconvertを試してみましょう。

$ convert device.jpg device.pdf
$ pdfimages -all device.pdf device-all
$ cmp device.jpg device-all-000.jpg 
device.jpg device-all-000.jpg differ: byte 4, line 1

convertは、pdfに配置する前に画像をより小さなサイズに再サンプリングしました。

$ ls -1s device.jpg device-all-000.jpg 
528 device-all-000.jpg
656 device.jpg

画像の精度は、pdflatexの設計目標の一部でした。他のPDF作成ソフトウェアは、デフォルトで、PDFに配置する前に画像を「最適化」する場合があります。

6
John1024