2009-12-12 91 views
3

對於我正在進行的網絡實驗,我需要任意大小的圖像文件。生成任意文件大小的圖像文件

我迷失在如何創建這樣的文件。我需要JPEG,PNG和PDF格式的5MB,10MB和20MB文件。

在我第一次嘗試生成這些文件時,很明顯,由於這些格式的壓縮方案,通過指定分辨率來生成任意大小的文件是不可能的(或者至少我不知道如何)空白文件。

是否有快速(編程?)的方法,我可以生成這些文件?

編輯:我正在研究創建任意大小的虛擬文件,但是如果有創建具有正確內部格式的實際JPEG,PNG或PDF的方法,那將是理想的。

回答

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中給出一個jpgs列表 - 代碼不會顯示爲不會泄漏任何人,但我很樂意將其提供給任何需要它的人 - 只需請致電Atalasoft並要求我(或打開支持案例並引用此問題)

+0

我希望我可以選擇兩個答案。我回答了這個問題,因爲你揭示了一些潛在的過程,這會使這成爲一個挑戰。雖然,我可能會使用Nifle的代碼作爲掌握這些信息的起點。 – 2009-12-14 14:16:00

2

這些文件是否需要內部爲JPEG格式,或只是名爲JPEG的任意二進制文件?如果是後者,看到這個堆棧溢出的答案:

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

+0

+1這也是我的第一個念頭,只需創建需要的確切大小的二進制文件並將其命名爲.jpg – 2009-12-12 16:38:07

+0

不幸的是,對於我們試圖確定他們如何通過電子郵件旅行,我們預計某些格式可能會自動重新編碼,而其他格式可能不會,所以我們希望它們能成爲有效的內部格式。 – 2009-12-12 16:41:46

1

我會在所有的這些格式了「巨大」的文件開始(超過最大文件大小),然後反覆使用imagemagick convert,直到你找到了調整它們的大小您想要的文件大小的細節。

可能需要一些試驗和錯誤(可以很容易地編寫腳本),但應該做一次性實驗。

3

這只是一個建議。不知道它是否會起作用。

也許你可以生成正確大小的位圖並轉換它們?

如果你使位圖非常難以壓縮(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(); 
} 
+0

我喜歡這答案但是說起來容易做起來難,我希望在這裏有人會想出如何實施你的建議 我曾嘗試嘲笑一個尺寸適當的漸變(在這個過程中使用了32位顏色),但不知道JPEG或PNG壓縮方案的內部結構,我不知道我是否做了足夠好的工作。他們設法將它壓縮了很多。 – 2009-12-12 18:56:52

+0

我很快試過這個。它似乎適用於PNG,但不是jpg。 PNG與位圖幾乎相同,但JPG總是很小 – Nifle 2009-12-12 19:38:31

+0

我希望我能選擇兩個答案。由於他解釋了JPEG壓縮的一些問題,我與Lou Franco一起回答了另一個問題。但我可能會使用此代碼作爲實現的起點,因爲它不依賴於外部SDK。 – 2009-12-14 14:17:32