John Doe Asked: 2020-03-25 16:58:05 +0800 CST2020-03-25 16:58:05 +0800 CST 2020-03-25 16:58:05 +0800 CST 我可以创建以字节为单位的特定大小的图像吗? 772 我想创建一个图像文件,所以它正好是 5MB 用于测试目的。可能吗? image-conversion 5 个回答 Voted gnubeard 2020-03-25T17:52:13+08:002020-03-25T17:52:13+08:00 大多数图像格式的实现都会忽略尾随零。因此,将文件填充到所需大小相对简单。(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 Kamil Maciorowski 2020-03-27T13:37:17+08:002020-03-27T13:37:17+08:00 很少有其他答案会计算您需要附加多少尾随零,然后再附加。在 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。如果文件已经至少那么大,那么它的大小不会改变(稀疏度可以改变,我不会详细说明)。 eagle275 2020-03-26T08:02:33+08:002020-03-26T08:02:33+08:00 如果你坚持 Windows - 我建议去 CMD ,找到一个合适的小文件...... >copy /B file1+file1 file2在用合适的文件名替换file1和file2时..您可以使用file2作为源(前2个名称)重复上述复制命令..文件将被二进制连接-因此您会得到一个越来越大的目标文件-直到您满意为止 不如脚本好 - 但它在(windows)框中只需要1个源文件..甚至不一定必须是图像 - 因为上传的mime类型主要由文件决定 -结尾 Best Answer chiliNUT 2020-03-26T09:00:12+08:002020-03-26T09:00:12+08:00 正如评论中所建议的,您可以使用图像元数据。jpg 支持 exif 数据。你提到了 php,它可以用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); HiddenWindshield 2020-03-27T09:54:46+08:002020-03-27T09:54:46+08:00 它必须是任何特定的格式吗?例如,BMP 文件可以吗? 未压缩的 BMP 文件就是这样:完全未压缩。因此,每个像素都会占用固定数量的存储空间,因此只需从您想要的文件大小倒推到图像尺寸即可。因此,对于 8 位 BMP,理论上您需要 5 兆像素的图像才能获得 5 兆字节的文件。 不幸的是,有一些事情会使计算变得有些复杂: 您将不得不考虑 BMP 标头的大小。该格式有几种不同的版本,每个版本都有不同的标题大小,因此您需要尝试使用图像编辑器来确定它产生的标题大小。 图像的每一行都被填充为四个字节的倍数,因此每行可能会有一些额外的字节。 BMP 文件可以被压缩、索引并包含颜色配置文件信息。这些选项很少使用,但它们就在那里。如果您的图形程序使用这些并且您无法关闭它们,那么您的尺寸计算将会变得更加复杂(如果它甚至可能的话)。
大多数图像格式的实现都会忽略尾随零。因此,将文件填充到所需大小相对简单。(5 兆字节是 10240 个块。)
很少有其他答案会计算您需要附加多少尾随零,然后再附加。在 Linux 中有一个简单的方法:
(假设您需要 5 MB,即 5*1000*1000 字节。对于 5 MiB,即 5*1024*1024 字节,请使用
-s 5M
)。如果原来
image
大于指定的大小,那么多余的数据将丢失。如果最初image
较小,则将添加填充零。如果可能,添加的片段将是稀疏的。如果出于任何原因您不想稀疏,请使用
fallocate
:(类似但不完全相同:
-l 5MB
对于 5 MB,-l 5MiB
对于 5 MiB)。fallocate
用这种方式只能扩展image
。如果文件已经至少那么大,那么它的大小不会改变(稀疏度可以改变,我不会详细说明)。如果你坚持 Windows - 我建议去 CMD ,找到一个合适的小文件......
>copy /B file1+file1 file2
在用合适的文件名替换file1和file2时..您可以使用file2作为源(前2个名称)重复上述复制命令..文件将被二进制连接-因此您会得到一个越来越大的目标文件-直到您满意为止不如脚本好 - 但它在(windows)框中只需要1个源文件..甚至不一定必须是图像 - 因为上传的mime类型主要由文件决定 -结尾
正如评论中所建议的,您可以使用图像元数据。jpg 支持 exif 数据。你提到了 php,它可以用
iptcembed()
. 生成足够长的空字节字符串(二进制 0)以填充文件它必须是任何特定的格式吗?例如,BMP 文件可以吗?
未压缩的 BMP 文件就是这样:完全未压缩。因此,每个像素都会占用固定数量的存储空间,因此只需从您想要的文件大小倒推到图像尺寸即可。因此,对于 8 位 BMP,理论上您需要 5 兆像素的图像才能获得 5 兆字节的文件。
不幸的是,有一些事情会使计算变得有些复杂:
您将不得不考虑 BMP 标头的大小。该格式有几种不同的版本,每个版本都有不同的标题大小,因此您需要尝试使用图像编辑器来确定它产生的标题大小。
图像的每一行都被填充为四个字节的倍数,因此每行可能会有一些额外的字节。
BMP 文件可以被压缩、索引并包含颜色配置文件信息。这些选项很少使用,但它们就在那里。如果您的图形程序使用这些并且您无法关闭它们,那么您的尺寸计算将会变得更加复杂(如果它甚至可能的话)。