24

外部ライブラリを使用せずに、jpegからサムネイル画像を抽出したいのですが。サムネイルがファイルのどこから始まり、どこで終わるかを知り、単純に切り取る必要があるため、これはそれほど難しいことではありません。私は多くのドキュメント(つまり、http://www.media.mit.edu/pia/Research/deepview/exif.html)を研究し、jpegを分析しようとしていますが、すべてが明確であるとは限りません。私はバイトを段階的に追跡しようとしましたが、深く混乱しました。jpegファイル内のサムネイルの開始位置と終了位置に関する情報を抽出するための優れたドキュメントまたは読み取り可能なソースコードはありますか?

ありがとうございました!

4

4 に答える 4

31

Exiftoolは、これをすばやく簡単に行うことができます。

exiftool -b -ThumbnailImage my_image.jpg > my_thumbnail.jpg
于 2016-08-24T14:05:12.803 に答える
18

携帯電話やデジタル カメラで作成されたほとんどの JPEG 画像では、サムネイル画像 (存在する場合) は APP1 マーカー (FFE1) に保存されます。このマーカー セグメント内には、メイン画像の EXIF 情報と、JPEG 圧縮画像として保存されたオプションのサムネイル画像を含む TIFF ファイルがあります。TIFF ファイルには通常 2 つの「ページ」が含まれており、最初のページは EXIF 情報で、2 番目のページは「古い」TIFF タイプ 6 形式で保存されたサムネイルです。タイプ 6 形式は、JPEG ファイルが TIFF ラッパー内にそのまま保存される場合です。可能な限り単純なコードでサムネイルを JFIF として抽出する場合は、次の手順を実行する必要があります。

  1. JFIF および TIFF マーカー/タグに慣れてください。JFIF マーカーは 2 バイトで構成されます。0xFF の後にマーカー タイプ (APP1 の場合は 0xE1) が続きます。これらの 2 バイトの後に、ビッグ エンディアン順に格納された 2 バイト長が続きます。TIFF ファイルについては、Adobe TIFF 6.0 リファレンスを参照してください。
  2. JPEG ファイルで APP1 (FFE1) EXIF マーカーを検索します。複数の APP1 マーカーが存在する可能性があり、APP1 の前に複数のマーカーが存在する可能性があります。
  3. 探している APP1 マーカーには、長さフィールドの直後に「EXIF」という文字が含まれています。
  4. 「II」または「MM」(長さから 6 バイト離れている) を探して、TIFF ファイルで使用されるエンディアンを示します。II = Intel = リトル エンディアン、MM = Motorola = ビッグ エンディアン。
  5. 最初のページのタグをスキップして、画像が保存されている 2 番目の IFD を見つけます。2 番目の「ページ」で、JPEG データを指す 2 つの TIFF タグを探します。タグ 0x201 には JPEG データのオフセット (II/MM に相対的) があり、タグ 0x202 には長さがバイト単位です。
于 2012-04-27T23:50:35.537 に答える
-1

http://en.wikipedia.org/wiki/JPEG_File_Interchange_FormatのJFIF のウィキペディア ページには、JPEG ヘッダーの適切な説明が記載されています (ヘッダーには圧縮されていないラスター イメージとしてサムネイルが含まれています)。これにより、レイアウトのアイデアが得られ、情報を抽出するために必要なコードが得られます。

画像ヘッダーの 16 進ダンプ (リトル エンディアン表示):

sdk@AndroidDev:~$ head -c 48 stfu.jpg |hexdump
0000000 d8ff e0ff 1000 464a 4649 0100 0101 4800
0000010 4800 0000 e1ff 1600 7845 6669 0000 4d4d
0000020 2a00 0000 0800 0000 0000 0000 feff 1700

イメージ マジック (バイト 1,0)、App0 セグメント ヘッダー マジック (バイト 3,2)、ヘッダー長 (5,4) ヘッダー タイプ シグネチャ ("JFIF\0"||"JFXX\0")(バイト 6 ~ 10) 、バージョン (バイト 11、12) 密度単位 (バイト 13)、X 密度 (バイト 15、14)、Y 密度 (バイト 17、16)、サムネイル幅 (バイト 19)、サムネイル高さ (バイト 18)、および残り「Header Length」までがサムネイルデータです。

上記の例から、ヘッダーの長さが 16 バイト (バイト 6、5) で、バージョンが 01.01 (バイト 12、13) であることがわかります。さらに、サムネイルの幅とサムネイルの高さは両方とも 0x00 であるため、画像にはサムネイルが含まれていません。

于 2012-04-27T12:08:54.960 に答える