2016-10-20 6 views
0

Ich habe eine Liste als solcheVernähen Tausende von Bitmaps

List<Bitmap> imgList = new List<Bitmap>();> 

ich brauche durch diese Liste zu blättern, sehr schnell und nähen Sie alle Bilder in einem. Wie so

using (Bitmap b = new Bitmap(imgList[0].Width, imgList[0].Height * imgList.Count, System.Drawing.Imaging.PixelFormat.Format24bppRgb)) 
     { 
      using (Graphics g = Graphics.FromImage(b)) 
      { 
       for (int i=0;i<imgList.Count;i++) 
       { 
        g.DrawImage(imgList[i], 0, i * imgList[i].Height); 
       } 
      } 
      b.Save(fileName, ImageFormat.Bmp); 

     } 
     imgList.Clear() 

Das Problem, das ich in laufende bin ist, dass die Bilder 2000 sind breit und 2 hoch, und es könnte 30.000-100.000 Bilder im Array sein. Wenn ich versuche, eine leere Bitmap dieser Größe zu erstellen, wird ein Parameter gefunden, der nicht gefunden wird. Jede Hilfe wäre sehr geschätzt.

+0

Bei 100k-Bildern, von denen jedes 4k Pixel groß ist, ist das 24bpp-Bild, das Sie erstellen möchten, einfach zu groß. Sehen Sie das für Details: http://stackoverflow.com/questions/6333681/c-sharp-parameter-is-not-valid-creating-new-bitmap – wablab

+0

Was ist die durchschnittliche Größe der Bilder? Wie groß wird das Bild nach der Verarbeitung sein? – Cadburry

+0

http://stackoverflow.com/questions/465172/merging-two-images-in-c-net –

Antwort

1

Die Größe des Speicherblocks, den Sie benötigen, ist 2 x 100,000 x 20,000 x # bytes per pixel, der entweder 12.000.000.000 Byte für 24 Bit pro Pixel und 16.000.000.000 Byte für 32 Bit pro Pixel beträgt. Also mit anderen Worten ~ 12GB oder ~ 16GB. Ein 32-Bit-Adressraum ist einfach zu klein für diese Menge an Speicher, so dass Sie saugt.

Oder tut es?

Da Sie daraus eine Datei erstellen möchten, sollten Sie sich eher mit file limits als mit Ihren eigenen Speichergrenzen befassen. Glücklicherweise beträgt die Größe des Integer-Typs, der für Bildabmessungen in einem BMP verwendet wird, 32 Bit, was bedeutet, dass ein 200.000 x 2.000 Bild vollständig innerhalb dieser Grenzen liegt. Unabhängig davon, ob Sie das Bild im Speicher ablegen oder nicht, können Sie die Datei erstellen.

Dazu müssen Sie eine eigene Version eines BMP-Encoders erstellen. Es ist nicht so schlimm - es schreibt am meisten einen BMP-Header, einen DIB-Header (110 Bytes insgesamt) und dann Rohpixeldaten. Sobald Sie fertig sind, werden Sie es schwer haben, Code zu finden, der es öffnet, aber das ist das Problem eines anderen, oder?

+0

Sie sind um 10, es ist x 2000, nicht x 20000. 1,6 GB ist kein Problem in einem 64-Bit-Prozess, 2 GB ist die harte obere Grenze für eine GDI + -Bitmap. –

+0

Ich würde mit einer Tile TIFF-Datei suchen, da es Apps gibt, die sehr große Bilder von ihnen lesen können. –

+0

TIFF ist in der Tat eine Möglichkeit, da TIFF selbst in Bändern kodieren kann. Das Schreiben eines korrekten TIFF-Codierers ist wesentlich schwieriger und voller Fehler. – plinth