我可以创建具有特定字节大小的图像吗?

我可以创建具有特定字节大小的图像吗?

我想创建一个大小正好为 5MB 的图像文件用于测试目的。可以吗?

答案1

正如评论中所建议的,您可以使用图像元数据。jpg 支持 exif 数据。您提到了 php,它可以使用以下方式写入原始 exif 数据iptcembed(). 生成一个足够长的空字节字符串(二进制 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);

答案2

大多数图像格式的实现都会忽略尾随零。因此,将文件填充到所需大小相对简单。(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

答案3

很少有其他答案会计算需要附加多少个尾随零,然后附加。在 Linux 中有这种简单的方法:

truncate -s 5MB image

(假设您需要 5 MB,即 5*1000*1000 字节。对于 5 MiB,即 5*1024*1024 字节,请使用-s 5M)。

如果原始image大小大于指定大小,则多余数据将丢失。如果原始image大小较小,则将添加填充零。如果可能,添加的片段将是稀疏的。

如果由于某种原因你不想要稀疏性,请使用fallocate

fallocate -l 5MB image

(类似,但不完全相同:-l 5MB对于 5 MB,-l 5MiB对于 5 MiB)。

fallocate这种方式只能扩展image。如果文件至少已经这么大,那么它的大小就不会改变(稀疏性可以改变,我就不详细说明了)。

答案4

它必须是某种特定格式吗?例如,BMP 文件可以吗?

未压缩的 BMP 文件就是完全未压缩的。因此,每个像素占用固定的存储空间,因此只需从所需的文件大小反向计算图像的尺寸即可。因此,对于 8 位 BMP,理论上您需要一张 500 万像素的图像才能获得 5 兆字节的文件。

不幸的是,有一些因素使得计算变得有些复杂:

  1. 您必须考虑 BMP 标头的大小。该格式有几种不同的版本,每种版本的标头大小都不同,因此您需要使用图像编辑器进行试验,以确定它生成的标头大小。

  2. 图像的每一行都填充为四个字节的倍数,因此每行可能会有几个多余的字节。

  3. BMP 文件可以压缩、索引,并包含颜色配置文件信息。这些选项很少使用,但它们确实存在。如果您的图形程序使用这些选项,并且您无法关闭它们,那么您的大小计算将变得更加复杂(如果可能的话)。

相关内容