私は、数時間かけて夜空の写真を一定数撮るデータストレージデバイスを作成しています。写真はすべて撮った直後にダウンロードされます。メモリカードは、一度にすべての写真を保存できる必要があります。
取得されるJPEGは640x480ピクセルで、100枚すべてのメモリカードに十分なスペースがあることが重要です。それでは、640x480 JPEGの最大サイズはどれくらいですか?
私はこれを理解するためにいくつかのテスト写真を撮りました:
複雑さとともにファイルサイズが大きくなることを想定しています。
どのようにしてそれらがどのくらい複雑でどのようなサイズになるかを知らずに、100 640x480 JPEGに対応する十分なスペースをメモリカードに構築するにはどうすればよいですか?これらのキャプチャデバイスの多くを作成している可能性があるため、余分なスペースを無駄にしたくありません。
ここでは、JPEGファイルサイズの上限をお勧めします。より一般的なjpegサイズの説明については、 Ilmari Karonenの回答 を参照してください。
640X480 32ビットビットマップイメージのピクセルストレージスペースは、このように計算できます( this 回答に基づいていますが、Ignacio Vazquez-Abramsのコメントと this 回答に基づいて修正されています) ):
ファイルに圧縮が適用されていないと仮定すると、307,200ピクセル、0.3MPになります。 ハンディルックアップテーブル
各ピクセルに32ビットの情報が含まれている場合、
- 307,200 * 32 = 9,830,400ビットの情報
- 8ビットで除算してバイト値にします
- 9,830,400/8 = 1228800バイト(または1.17 Mb)
これは非圧縮ビットマップのサイズであり、jpegファイルサイズの上限となるはずです(実際には、JPEG形式では compression を使用しているため、特に黒い空がたくさん含まれていると思いますが、夜空の写真を撮っています。質問内の最大のサンプル画像はわずか0.14 MBです)。
ただし、特定の問題に関して言えば、その上限を使用しても、100枚の画像は117 MBにすぎず、128 MBほどのメモリカードを見たことがあるので、久しぶりです。現在利用可能なメモリカードには、ニーズを満たすのに十分な容量があると思います。
どうやら最大のjpegファイルサイズの問題はいくつかの議論の対象です。 これ スタックオーバーフローの回答では、理論上の最大サイズはピクセルあたり20.25バイト、つまり5.9 MBですが、そのサイズのイメージを作成するには、jpeg形式の圧縮スキームを意図的に誤用する必要があるため、非常に可能性が低いです。カメラで撮ったそのようなものを見たことがあるでしょう。
ただ確認するために、 ForeverWintrの分析 を実験的にテストしましょう。
JPEG圧縮(またはany圧縮)の最悪の種類の入力画像は、一様にランダムなRGBノイズであり、理論的には圧縮できません。 netpbm ツールを使用して生成します。
$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772 rnd.png
921615 rnd.ppm
(均一にランダムなRGBノイズ、ロスレスPNG形式、903 kb)
注(2017年3月):この回答を最初に記述して2013年にアップロードし直したとき、上の画像wasはPNG形式であると確信しています(以下のカラーマネジメントに関するコメントもあり、これは残念ながら、ある時点で黙ってJPEGに変換されたように見えるため、ここでの視覚的な比較は役に立たなくなります。
新しいPNGテスト画像を再アップロードしようとしましたが、どうやらimgurで何らかの任意のPNGファイルサイズ制限に達し、JPEGに自動変換されます。この問題を回避する方法があるかどうかはわかりませんが、少なくともLinuxボックスにアクセスできる場合は、いつでも特定のコマンドを再実行して独自のテストイメージを生成できます。いずれの場合も、圧縮品質を直接視覚的に比較できないようにすることを除いて、以下の分析が無効になることはありません。
わかりました。圧縮されていないPPMファイルは640×480×3 = 921,600バイトの長さに加え、最小のPPMヘッダー用に15バイトです。 PNG形式を使用して無損失で圧縮すると、サイズが2157バイト増加するだけで、おそらくPNGヘッダーとメタデータが原因であり、圧縮アルゴリズムで圧縮できないデータを圧縮しようとすると、わずかに非効率になる可能性があります。
(はい、それは4ではなくピクセルあたり3バイトです。PPM形式は、グラフィックファイル形式が取得できるのとほぼ同じくらい簡単ですが、4番目のバイトを保存するのに十分ではありません。ディスク上のピクセルごと。mayアラインメントの理由でメモリ内でそうすることにはいくつかの利点がありますespeciallyアルファチャネルも保存する必要があるが、これらの理由はそうではない場合画像をファイルに書き込むときに適用されます。)
では、JPEGはどうでしょうか。まず、圧縮損失を最小限に抑えてみましょう(品質= 100、クロマサブサンプリングなし、浮動小数点DCT)。残念ながら、 pnmtojpeg
manual は、関連するすべてのオプション(具体的には、-sample
オプションは「ウィザードのオプション」セクションにリストされており、libjpegドキュメントのファイルを参照するだけなので、代わりにGIMPで変換します。結果のファイルは次のようになります。
897249 rnd.jpg
(JPEG圧縮RGBノイズ、品質= 100、クロマサブサンプリングなし、876 kb)
何、どうすればもっと小さくできますか?純粋なノイズは非圧縮性だと言っていませんか?まあ、最高の品質でも、通常のJPEG圧縮はかなりロスレスではありません。 GIMPで画像を再度開いて元の画像と比較すると、一部のピクセルのカラー値が(256のうち)1つまたは2つのステップでシフトしていることがわかります。それらは、JPEG圧縮アルゴリズムが「だまされて」、ここで少し捨てたピクセルで、別の場所では、変化が目立たないと推定されています。実際、肉眼では結果はオリジナルとまったく区別がつかないが、これらの破棄されたビットは、ヘッダーとエンコードのオーバーヘッドを考慮した後でも、ファイルサイズがかなり減少することになる。
これが最高の品質でした。 pnmtojpeg
デフォルト(品質= 75、サブサンプリングが有効)などのより一般的な設定はどうですか?試してみよう:
$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128 rnd2.jpg
(JPEG圧縮RGBノイズ、品質= 75、クロマサブサンプリング、184 kb)
わあ、901から184 kbまで!ただし、これはかなり積極的な圧縮であり、画像をよく比較すると違いがはっきりわかります。そのほとんどは、クロマサブサンプリングによるもので、基本的にはカラー(色相/彩度)データの75%だけを破棄します。サブサンプリングを無効にしてGIMPで試してみると、350,618バイトのファイルが(少なくとも人間の目では)拡大された場合でも、元のファイルにかなり近く見えます。
とにかく、これのすべてのポイントは、夜空の写真がどんなにうるさくても、選択した品質がどんなに高くても、no way 640×480 JPEGしかないことを実証することです。ファイルは900 kbより大幅に大きくなる可能性があります。 (まあ、お使いのカメラがマルチメガバイトのExifカラープロファイルまたはそれに同等の愚かなものを接続していない限り)。そして、より一般的なJPEG圧縮設定を使用している場合、もっともらしいファイルの最大サイズは約200 kb程度になります。 。