对于我正在进行的网络实验,我需要任意大小的图像文件。
我不知道如何创建此类文件。我需要 JPEG、PNG 和 PDF 格式的 5MB、10MB 和 20MB 文件。
在我第一次尝试生成这些文件时,很明显,由于这些格式的压缩方案,不可能(或者至少我不知道如何)仅通过指定空白文件的分辨率来生成任意大小的文件。
有没有一种快速(编程?)方法可以生成这些文件?
编辑:我正在研究创建任意大小的虚拟文件,但如果有一种方法可以创建具有正确内部格式的实际 JPEG、PNG 或 PDF,那就太理想了。
这只是一个建议。不知道是否有效。
也许您可以生成正确尺寸的位图并进行转换?
如果您使位图很难压缩(1)?然后您应该能够将它们转换为非常接近目标尺寸的 jpg 和 png。
(1)我的建议是,这可以通过使位图中的每个像素具有不同的颜色(尽可能)来实现
编辑:
这个简单的解决方案可能不适用于 jpg,但至少 png 似乎可以工作。
我用 C# 编写了一个小测试应用程序来尝试一下。这是它的核心:
private void make_bitmap(int width, int height)
{
Random random = new Random();
Bitmap B = new Bitmap(width, height);
int redvalue = 0;
int greenvalue = 0;
int bluevalue = 0;
bool pick_random_color = true;
for (int x = 0; x < width; x++)
{
for (int y = 0; y < width; y++)
{
Color col;
if (pick_random_color)
{
col = Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255));
}
else // iterate over all colours repeatedly
{
if (redvalue == 255) { redvalue = 0; greenvalue++; } else { redvalue++; }
if (greenvalue == 256) { greenvalue = 0; bluevalue++; }
if (bluevalue == 256) { redvalue = 0; greenvalue = 0; bluevalue = 0; }
col = Color.FromArgb(redvalue, greenvalue, bluevalue);
}
B.SetPixel(x, y, col);
}
}
B.Save("image.bmp");
B.Save("image.jpg", ImageFormat.Jpeg);
B.Save("image.png", ImageFormat.Png);
B.Dispose();
}
文件内部是否需要为 JPEG 格式,或者只是名为 JPEG 的任意二进制文件?如果是后者,请参阅 Stack Overflow 答案:
分辨率不会改变像素数量,只会改变像素的显示大小 - 增加分辨率会使显示更大,但不会使文件更大。
如果你制作的 JPEG 一遍又一遍地重复相同的信息,它会变得更大——压缩是在 8x8 单元的基础上——如果你有更多的单元,你就会有更多的数据。 要使它们更大,请将质量设置为 100 进行编码。另一件事是,JPEG 在单元格的基础上去除亮度,因此色调变化的压缩效果比亮度变化的压缩效果更差。
我使用我公司的产品DotImage,用此代码创建了一个 10mb 的 jpg。 您可以下载一个 eval 并尝试一下,或者对您的图像 SDK 执行相同的操作。
using System;
using System.Drawing;
using Atalasoft.Imaging;
using Atalasoft.Imaging.Codec;
using Atalasoft.Imaging.Drawing;
namespace MakeLargeImage
{
class Program
{
static void Main(string[] args)
{
AtalaImage img = new AtalaImage(1000, 8000, PixelFormat.Pixel24bppBgr);
Canvas c = new Canvas(img);
for (int block = 0; block < img.Height; block += 1000)
{
for (int line = 0; line < 1000; line += 4)
{
int y = block + line;
c.DrawLine(new Point(0, y), new Point(img.Width, block), new AtalaPen(Color.Yellow));
c.DrawLine(new Point(0, y + 1), new Point(img.Width, y + 1), new AtalaPen(Color.Red));
c.DrawLine(new Point(0, y + 2), new Point(img.Width, y + 2), new AtalaPen(Color.Green));
c.DrawLine(new Point(0, block), new Point(img.Width, y + 3), new AtalaPen(Color.Blue));
}
}
JpegEncoder jpeg = new JpegEncoder(100);
img.Save("10mb.jpg", jpeg, null);
}
}
}
如果图像像素尺寸变大,JPEG 文件也会变大。 您还可以添加元数据,但很难获得仅包含元数据的大文件,因为存在一些大小限制。
PDF是最简单的——只需用未压缩的图像制作一个大页面并不断添加页面——它会很快变大——除非你打开它,否则没有压缩。 您可以在 DotImage 中使用
PdfEncoder
轻松完成此操作 - 只需在 FileSystemImageSource
中提供 jpg 列表即可 - 代码未显示,以免让所有人感到厌烦,但我很乐意将其提供给任何想要的人它 - 只需致电 Atalasoft 并询问我(或打开支持案例并参考此问题。
我将从所有这些格式的“巨大”文件开始(超过最大文件大小),然后使用 imagemagick Convert 迭代调整它们的大小,直到找到所需文件大小的具体信息。
可能需要一些尝试和错误(不过可以很容易地编写脚本),但应该做一次性实验。
您可以使用以下 Linux 实用程序:
fallocate -l 260KB image.jpg
这适用于 JPEG 文件(和其他文件),因为可以附加这些图像文件,而不会影响图像。