A maioria das implementações de formatos de imagem ignora os zeros à direita. Portanto, é relativamente simples preencher um arquivo com o tamanho desejado. (5 megabytes são 10240 blocos.)
#! /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
Poucas outras respostas calculam quantos zeros à direita você precisa anexar e, em seguida, acrescentam. No Linux, existe esta maneira simples:
truncate -s 5MB image
(isso pressupõe que você deseja 5 MB, ou seja, 5*1.000*1.000 bytes. Para 5 MiB, ou seja, 5*1.024*1.024 bytes, use -s 5M).
Se originalmente imagefor maior que o tamanho especificado, os dados extras serão perdidos. Se originalmente imagefor menor, zeros de preenchimento serão adicionados. O fragmento adicionado será esparso, se possível.
Se por algum motivo você não quiser dispersão, use fallocate:
fallocate -l 5MB image
(da mesma forma, mas não de forma idêntica: -l 5MBpara 5 MB, -l 5MiBpara 5 MiB).
fallocateusado desta forma só pode estender image. Se o arquivo já for pelo menos tão grande, seu tamanho não mudará (a dispersão pode mudar, não vou elaborar).
se você insistir no Windows - sugiro ir ao CMD, encontrar um arquivo pequeno adequado ...
>copy /B file1+file1 file2ao substituir arquivo1 e arquivo2 por nomes de arquivo adequados .. você pode repetir o referido comando de cópia usando arquivo2 como fonte (primeiros 2 nomes) .. os arquivos serão concatenados em binário - para que você obtenha um arquivo de destino de tamanho crescente - até que esteja satisfeito
não é tão bom quanto um script - mas funciona fora da caixa (janelas) - só precisa de 1 arquivo de origem .. que nem precisa ser necessariamente uma imagem - já que o tipo mime para uploads é determinado principalmente pelo arquivo- final
Conforme sugerido nos comentários, você pode usar os metadados da imagem. jpg suporta dados exif. Você mencionou o php, que pode gravar dados exif brutos com iptcembed(). Gere uma string de bytes nulos (binário 0) longa o suficiente para preencher o arquivo
Tem que ser algum formato específico? Por exemplo, um arquivo BMP serviria?
Arquivos BMP descompactados são exatamente isso: completamente descompactados. Assim, cada pixel ocupa uma quantidade fixa de armazenamento, portanto, é apenas uma questão de retroceder do tamanho do arquivo desejado para as dimensões da imagem. Portanto, para um BMP de 8 bits, em teoria , você precisaria de uma imagem de 5 megapixels para obter um arquivo de 5 megabytes.
Infelizmente, existem algumas coisas que complicam um pouco o cálculo:
Você terá que levar em consideração o tamanho do cabeçalho BMP. Existem várias versões diferentes do formato, cada uma com um tamanho de cabeçalho diferente, portanto, você precisará experimentar seu editor de imagem para descobrir o tamanho do cabeçalho que ele produz.
Cada linha da imagem é preenchida para ser um múltiplo de quatro bytes, então pode haver alguns bytes extras por linha.
Os arquivos BMP podem ser compactados, indexados e ter informações de perfil de cores incluídas. Essas opções raramente são usadas, mas estão por aí. Se o seu programa gráfico os usa e você não pode desativá-los, seu cálculo de tamanho ficará muito mais complicado (se é que é possível).
A maioria das implementações de formatos de imagem ignora os zeros à direita. Portanto, é relativamente simples preencher um arquivo com o tamanho desejado. (5 megabytes são 10240 blocos.)
Poucas outras respostas calculam quantos zeros à direita você precisa anexar e, em seguida, acrescentam. No Linux, existe esta maneira simples:
(isso pressupõe que você deseja 5 MB, ou seja, 5*1.000*1.000 bytes. Para 5 MiB, ou seja, 5*1.024*1.024 bytes, use
-s 5M
).Se originalmente
image
for maior que o tamanho especificado, os dados extras serão perdidos. Se originalmenteimage
for menor, zeros de preenchimento serão adicionados. O fragmento adicionado será esparso, se possível.Se por algum motivo você não quiser dispersão, use
fallocate
:(da mesma forma, mas não de forma idêntica:
-l 5MB
para 5 MB,-l 5MiB
para 5 MiB).fallocate
usado desta forma só pode estenderimage
. Se o arquivo já for pelo menos tão grande, seu tamanho não mudará (a dispersão pode mudar, não vou elaborar).se você insistir no Windows - sugiro ir ao CMD, encontrar um arquivo pequeno adequado ...
>copy /B file1+file1 file2
ao substituir arquivo1 e arquivo2 por nomes de arquivo adequados .. você pode repetir o referido comando de cópia usando arquivo2 como fonte (primeiros 2 nomes) .. os arquivos serão concatenados em binário - para que você obtenha um arquivo de destino de tamanho crescente - até que esteja satisfeitonão é tão bom quanto um script - mas funciona fora da caixa (janelas) - só precisa de 1 arquivo de origem .. que nem precisa ser necessariamente uma imagem - já que o tipo mime para uploads é determinado principalmente pelo arquivo- final
Conforme sugerido nos comentários, você pode usar os metadados da imagem. jpg suporta dados exif. Você mencionou o php, que pode gravar dados exif brutos com
iptcembed()
. Gere uma string de bytes nulos (binário 0) longa o suficiente para preencher o arquivoTem que ser algum formato específico? Por exemplo, um arquivo BMP serviria?
Arquivos BMP descompactados são exatamente isso: completamente descompactados. Assim, cada pixel ocupa uma quantidade fixa de armazenamento, portanto, é apenas uma questão de retroceder do tamanho do arquivo desejado para as dimensões da imagem. Portanto, para um BMP de 8 bits, em teoria , você precisaria de uma imagem de 5 megapixels para obter um arquivo de 5 megabytes.
Infelizmente, existem algumas coisas que complicam um pouco o cálculo:
Você terá que levar em consideração o tamanho do cabeçalho BMP. Existem várias versões diferentes do formato, cada uma com um tamanho de cabeçalho diferente, portanto, você precisará experimentar seu editor de imagem para descobrir o tamanho do cabeçalho que ele produz.
Cada linha da imagem é preenchida para ser um múltiplo de quatro bytes, então pode haver alguns bytes extras por linha.
Os arquivos BMP podem ser compactados, indexados e ter informações de perfil de cores incluídas. Essas opções raramente são usadas, mas estão por aí. Se o seu programa gráfico os usa e você não pode desativá-los, seu cálculo de tamanho ficará muito mais complicado (se é que é possível).