生成任意文件大小的图像文件

问题描述 投票:0回答:5

对于我正在进行的网络实验,我需要任意大小的图像文件。

我不知道如何创建此类文件。我需要 JPEG、PNG 和 PDF 格式的 5MB、10MB 和 20MB 文件。

在我第一次尝试生成这些文件时,很明显,由于这些格式的压缩方案,不可能(或者至少我不知道如何)仅通过指定空白文件的分辨率来生成任意大小的文件。

有没有一种快速(编程?)方法可以生成这些文件?

编辑:我正在研究创建任意大小的虚拟文件,但如果有一种方法可以创建具有正确内部格式的实际 JPEG、PNG 或 PDF,那就太理想了。

image image-manipulation
5个回答
4
投票

这只是一个建议。不知道是否有效。

也许您可以生成正确尺寸的位图并进行转换?

如果您使位图很难压缩(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();
}

2
投票

文件内部是否需要为 JPEG 格式,或者只是名为 JPEG 的任意二进制文件?如果是后者,请参阅 Stack Overflow 答案:

在 C# 中几秒钟内创建一个巨大的虚拟文件


1
投票

分辨率不会改变像素数量,只会改变像素的显示大小 - 增加分辨率会使显示更大,但不会使文件更大。

如果你制作的 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 并询问我(或打开支持案例并参考此问题。


1
投票

我将从所有这些格式的“巨大”文件开始(超过最大文件大小),然后使用 imagemagick Convert 迭代调整它们的大小,直到找到所需文件大小的具体信息。

可能需要一些尝试和错误(不过可以很容易地编写脚本),但应该做一次性实验。


0
投票

您可以使用以下 Linux 实用程序:

fallocate -l 260KB image.jpg

这适用于 JPEG 文件(和其他文件),因为可以附加这些图像文件,而不会影响图像。

© www.soinside.com 2019 - 2024. All rights reserved.