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

时间:2009-12-12 16:30:31

标签: image image-manipulation

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

我对如何创建这样的文件感到很遗憾。我需要JPEG,PNG和PDF格式的5MB,10MB和20MB文件。

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

是否有一种快速(程序化?)方法可以生成这些文件?

编辑:我正在研究创建任意大小的虚拟文件,但如果有办法创建具有正确内部格式的实际JPEG,PNG或PDF,那将是理想的。

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:2)

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

Creating a Huge Dummy File in a Matter of Seconds in C#

答案 2 :(得分:1)

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

可能需要一些试验和错误(虽然可以轻松编写脚本)但应该进行一次性实验。

答案 3 :(得分: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是最简单的 - 只需使用未压缩的图像制作一个大页面并继续添加页面 - 它会快速变大 - 除非你打开它,否则没有压缩。您可以使用PdfEncoder在DotImage中轻松完成此操作 - 只需在FileSystemImageSource中给出一个jpgs列表 - 代码未显示为不会让所有人感到厌烦,但我很乐意提供它对任何想要它的人 - 只需致电Atalasoft并要求我(或打开支持案例并提及此问题。