代码之家  ›  专栏  ›  技术社区  ›  Benjamin Borden

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

  •  4
  • Benjamin Borden  · 技术社区  · 15 年前

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

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

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

    4 回复  |  直到 15 年前
        1
  •  1
  •   Lou Franco    15 年前

    分辨率不会改变像素的数量,只会改变像素的显示大小——提高分辨率会使显示变大,但不会使文件变大。

    如果制作一个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 --只要给它一个JPG的列表就可以了 FileSystemImageSource --代码并没有显示为不会让每个人都感到厌烦,但我很乐意提供给任何想要它的人——只要打电话就可以了 Atalasoft 并为我提问(或打开一个支持案例并引用此问题)。

        2
  •  4
  •   Nifle Hassan Syed    15 年前

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

    如果位图很难压缩(1)?然后,您应该能够将它们转换为非常接近目标大小的jpg和png。

    (1) 我的建议是,这可以通过使位图中的每个像素具有不同的颜色来实现(尽可能)

    编辑:
    这个简单的解决方案可能不适用于jpg,但至少png似乎可以。

    我用c#拼凑了一个小testapp来试用。以下是它的主要内容:

    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();
    }
    
        3
  •  2
  •   Community CDub    7 年前

    文件是否需要内部为JPEG格式,或者只是名为JPEG的任意二进制文件?如果是后者,请参阅此堆栈溢出回答:

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

        4
  •  1
  •   ChristopheD    15 年前

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

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