web-dev-qa-db-ja.com

バイト単位で特定のサイズの画像を作成できますか?

テスト用にちょうど5MBになるようにイメージファイルを作成したいと思います。出来ますか?

8
John Doe

コメントで提案されているように、画像のメタデータを使用できます。 jpgはexifデータをサポートしています。 iptcembed() で生のexifデータを書き込むことができるphpについて説明しました。ファイルを埋め込むのに十分な長さのnullバイト(バイナリ0)の文字列を生成します

<?php
$path = '/path/to/image.jpg';
$size = filesize($path);
$goal = 1024 * 1024 * 5; //5MB
$zeros = str_pad("", $goal - $size, "\0"); // make a string of ($goal - $size) binary 0s
$paddedImage = iptcembed($zeros, $path);
file_put_contents("/path/to/padded-image.jpg", $paddedImage);
4
chiliNUT

画像形式のほとんどの実装では、末尾のゼロは無視されます。したがって、ファイルを目的のサイズに埋め込むのは比較的簡単です。 (5メガバイトは10240ブロックです。)

#! /usr/bin/env bash

print_usage_and_exit(){
  echo "Usage: $0 FILE BLOCKS"
  echo "This script will pad FILE with zeros up to BLOCKS."
  echo "FILE must not already be larger than BLOCKS."
  exit
}
FILE=$1
BLOCKS=$2
if [ -z $FILE ] || [ -z $BLOCKS ] || [ -z "${BLOCKS##*[!0-9]*}" ]; then
  print_usage_and_exit
fi
FILE_SIZE=$(stat $FILE | awk '/Blocks:/ { print $4 }')
SIZE_DIFFERENCE=$(($BLOCKS-$FILE_SIZE))
if [ $SIZE_DIFFERENCE -le 0 ]; then
  print_usage_and_exit
fi
dd if=/dev/zero iflag=append count=$SIZE_DIFFERENCE >> $FILE 2>/dev/null
26
gnubeard

あなたがWindowsを主張するなら-私はCMDに行くことをお勧めします、適切な小さなファイルを見つけてください...

>copy /B file1+file1 file2 file1とfile2を適切なファイル名に置き換えながら..ソースとしてfile2を使用して(最初の2つの名前)コピーコマンドを繰り返すことができます..ファイルはバイナリ連結されるため、サイズが大きくなるターゲットファイルが得られます-になるまで満足

スクリプトほど素敵ではありませんが、(ウィンドウ)ボックスの外で機能します。必要なソースファイルは1つだけです。これは必ずしも画像である必要はありません。アップロードのMIMEタイプは、ほとんどの場合ファイルによって決定されるためです。エンディング

4
eagle275

特定の形式である必要がありますか?たとえば、BMPファイルはどうでしょうか?

圧縮されていないBMP=ファイルは完全に圧縮されていない。つまり、完全に圧縮されていない。したがって、各ピクセルは固定量のストレージを使用するので、ファイルサイズから目的のサイズに逆方向に作業するだけの問題です。したがって、8ビットBMPの場合、理論的には 5メガバイトのファイルを取得するには、5メガピクセルの画像が必要です。

残念ながら、計算がやや​​複雑になることがいくつかあります。

  1. BMPヘッダーのサイズを考慮に入れる必要があります。フォーマットにはいくつかの異なるバージョンがあり、それぞれヘッダーサイズが異なるため、実験する必要があります。画像エディターで、ヘッダーが生成するサイズを把握します。

  2. 画像の各行は4バイトの倍数になるようにパディングされるため、行ごとに数バイト余分になる可能性があります。

  3. BMPファイルは、圧縮、索引付け、カラープロファイル情報を含めることができます。これらのオプションはめったに使用されませんが、そこにあります。グラフィックプログラムがこれらを使用していて、それらをオフにできない場合、サイズの計算ははるかに複雑になります(それが可能な場合でも)。

3

追加する必要がある末尾のゼロの数を計算してから追加する回答はほとんどありません。 Linuxでは、この簡単な方法があります。

truncate -s 5MB image

(これは、5 MB、つまり5 * 1000 * 1000バイトが必要であることを前提としています。5MiB、つまり5 * 1024 * 1024バイトの場合、-s 5M)。

元々imageが指定されたサイズより大きい場合、余分なデータは失われます。元々imageの方が小さい場合は、パディングゼロが追加されます。追加されたフラグメントは、可能であればスパースになります。

何らかの理由でスパース性を望まない場合は、fallocateを使用します。

fallocate -l 5MB image

(同様に、まだ同じではありません:-l 5MB 5 MBの場合、-l 5MiB for 5 MiB)。

この方法で使用されるfallocateは、imageのみを拡張できます。ファイルがすでにそのサイズ以上である場合、ファイルのサイズは変更されません(スパース性は変更される可能性があるため、詳しく説明しません)。

3