Was ist die maximale Auflösung von C# .NET Bitmap?
Theoretisch sollte es sein 65,535 x 65,535 gegeben, Sie haben genug Speicher, etwa 17 GB.
Jedoch, die Schaffung eines .NET 4.5-Konsole-Anwendung zu testen Sie es aus, wirft es System.ArgumentException: der Parameter ist nicht gültig.
Die Anwendung wurde für die 64-bit-Plattform. Läuft auf 64-bit-Plattform mit 32 GB Speicher. Die maximale Auflösung habe ich in der Lage zu bekommen, ist mit 22.000 x 22,000 Pixel.
Konnte ich nicht finden, keine Dokumentation, die auf dieser.
Und merkwürdiges Verhalten ist, dass selbst bei 22.000 x 22,000 Pixel, funktioniert es nicht immer. Es funktioniert manchmal, und manchmal wirft die Ausnahme. Diese machen mich denken, dass es um zusammenhängende Speicherzuweisung, aber es ist über 30GB freien Speicher.
Hat jemand schon Erfahrung mit dieser? Und wenn ich wollte mit sagen, mit 100.000 x 100.000 pixel Bild und größer, was wäre der beste Weg, neben der Umsetzung meiner eigenen bitmap?
EDIT: Das problem ist nicht .NET die Maximale Größe des Objekts. Dies kann überwunden werden, indem Sie auf die 64-bit-Plattformen, und die Einstellung des gcAllowVeryLargeObjects Flagge in der Anwendung-config. Auf diese Weise kann ich die Anwendung konsumieren über 15 GB Speicher mit einem einzigen Integer-array. Bisher scheint die Antwort zu liegen, die in der zugrunde liegenden Implementierung der GDI+, aber wie bekomme ich es?
- .NET Bitmap mit GDI+ verwendet, siehe dieser Frage für die Diskussion über Einschränkungen stackoverflow.com/questions/2932436/...
- Ich zerlegte den Konstruktor Bitmap(int,int), und es fordert GdipCreateBitmapFromScan0, die müssen einen Fehler-code. Der Konstruktor Bitmap-Karten Fehler-codes die zu verschiedenen .NET Ausnahmen.
- Aus Interesse, warum sagst du 65,535 x 65,535? Für
Image
(dasBitMap
ist eine Unterklasse von), dieWidth
undHeight
Eigenschaftenint
Arten, in der Erwägung, dass Ihre Frage impliziert, Sie sindushort
. - Es scheint sich nicht um eine echte Einschränkung.
new Bitmap(33.488.914, 1)
ist das maximum, das funktioniert für mich in einer einzigen dimension. - 65535 x 65535 ist die maximale jpeg-format beschränkt 256*256
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein GDI+ - Beschränkung von Windows. GDI+ erzeugt eine memory-mapped-Datei anzeigen, für die pixel-Daten des bitmap. Das macht es sehr effizient, bitmaps in der Regel sehr groß und der MMF hilft, um die pixel-Daten aus der Auslagerungsdatei. RAM-Seiten können einfach verworfen werden und erneut aus der Datei gelesen. Auch eher berüchtigt, viele Programmierer haben gesehen, deren Save () - Aufruf fehl mit wonky-Ausnahme, wenn Sie vergessen, entsorgen der alten bitmap.
Windows schränkt, wie groß die Aussicht auf ein MMF werden kann, in anderen Worten, die Menge der Daten in der Datei werden direkt angesprochen, wie dokumentiert in in diesem MSDN-Artikel:
"Größte verfügbare kontinuierlichen block" ist die Beschränkung in 32-bit-Prozess, neigt dazu, zu bewegen sich um ~600 MB, geben oder nehmen. Der 2-GB-limit erreicht wird auf einem 64-bit-Prozess. Technisch GDI+ können umgehen dieses limit durch die Neuzuordnung der Ansicht. Aber es funktioniert nicht, die LockBits () - Methode (auch stark intern verwendet) wäre ineffizient und sehr umständlich zu bedienen.
Verwenden größere bitmaps, die Sie brauchen zu bewegen, um den Nachfolger von GDI+, WIC (Windows Imaging Component). Ausgesetzt in .NET durch das System.Windows.Media.Imaging-namespace.
Sie sind in die maximal zulässige Größe des Objekts innerhalb .net. Abgedeckt wird hier: Sehr große Sammlung .Net bewirkt, dass out-of-memory-AusnahmeEdit: Sie zu sein scheinen, läuft auf eine Einschränkung der GDI-Plus. Hans' Antwort können, bietet Ihnen eine alternative. Wenn Sie Leben können, innerhalb der Grenzen, dann wird meine Antwort können Sie geben einige Hinweise.
Wissen, dass Sie calcuate die größte bitmap, die Sie erstellen können.
Also der folgende code funktioniert einwandfrei:
Aber der folgende Fehler auf:
Wenn Sie speichern möchten, ein Bild mit größeren Abmessungen, die Sie hätten ändern Sie die pixel-format, um eine geringere Anzahl von bpp:
Int32.MaxValue
und macht es da, dass das Objekt limit in .NET und das Objekt limit in GDI+ wäre das Wert.Die maximal zulässige Größe in Byte für die Bitmap-Datei-format-Spezifikation ist 2^32 bytes.
Sie erreichen dieses limit schneller, je nachdem, wie viele bytes pro pixel Sie verwenden.