外部ライブラリなしで、jpegsからサムネイル画像を抽出したいと思います。私はサムネイルがファイルのどこで始まりどこで終わるかを知り、単にそれをカットする必要があるので、これはそれほど難しくないことを意味します。私は多くのドキュメント(つまり: http://www.media.mit.edu/pia/Research/deepview/exif.html )を研究し、jpegの分析を試みますが、すべてが明確ではありません。私はバイトを段階的に追跡しようとしましたが、深いところで混乱しました。 jpegファイル内のサムネイルの開始位置と終了位置に関する情報を抽出するための優れたドキュメントや読みやすいソースコードはありますか?
ありがとうございました!
電話またはデジタルカメラで作成されたほとんどのJPEG画像の場合、サムネイル画像(存在する場合)はAPP1マーカー(FFE1)に保存されます。このマーカーセグメントの内部には、メイン画像のEXIF情報と、JPEG圧縮画像として保存されたオプションのサムネイル画像を含むTIFFファイルがあります。 TIFFファイルには通常2つの「ページ」が含まれており、最初のページはEXIF情報で、2番目のページは「古い」TIFFタイプ6形式で保存されたサムネイルです。タイプ6形式は、JPEGファイルがそのままTIFFラッパー内に格納される場合です。最も簡単なコードでサムネイルをJFIFとして抽出する場合は、次の手順を実行する必要があります。
Exiftool は、これをすばやく簡単に実行できます。
exiftool -b -ThumbnailImage my_image.jpg > my_thumbnail.jpg
この問題のはるかに簡単な解決策がありますが、それがどれほど信頼できるかわかりません:3番目のバイトからJPEGファイルの読み取りを開始し、FFD8(JPEG画像マーカーの開始)を検索してから、FFD9(JPEG画像の終了)を検索しますマーカー)。それを抽出して出来上がり、それがあなたのサムネイルです。
簡単なJavaScript実装:
function getThumbnail(file, callback) {
if (file.type == "image/jpeg") {
var reader = new FileReader();
reader.onload = function (e) {
var array = new Uint8Array(e.target.result),
start, end;
for (var i = 2; i < array.length; i++) {
if (array[i] == 0xFF) {
if (!start) {
if (array[i + 1] == 0xD8) {
start = i;
}
} else {
if (array[i + 1] == 0xD9) {
end = i;
break;
}
}
}
}
if (start && end) {
callback(new Blob([array.subarray(start, end)], {type:"image/jpeg"}));
} else {
// TODO scale with canvas
}
}
reader.readAsArrayBuffer(file.slice(0, 50000));
} else if (file.type.indexOf("image/") === 0) {
// TODO scale with canvas
}
}