2016-07-09 29 views
-1

Ich habe ein C# -Programm Aufruf einer vorhandenen C-Image-Bibliothek DLL mit P/Invoke.Max Buffer Size beim Aufruf von Native-Methoden

Ist es möglich, dass die Größe der Puffer begrenzt ist, als effektiv verwaltet werden kann?

Ich rufe eine Funktion, wo ich einen Zeiger auf ein Inputbuffer übergeben, seine Größe und einem Output wie folgt aus:

cmsDoTransform(xform, inputBitmapBytesRGB, outputBitmapBytesCMYK, TotalPixels); 

Während mit diesem Code zu experimentieren, hielt ich MemoryAccessViolation Fehler zu erhalten?

Also fing ich an, mit wirklich kleinen RGB-Bildern in Größen von 1x1 Pixel, 2x2, 4x4, 8x8, 16x16 bis 64x64 zu arbeiten und alles funktionierte, plötzlich, keine Fehlermeldungen mehr. Könnte nicht glücklicher sein.

Zuversichtlich ging ich zurück zu meinem ursprünglichen RGB-Testbild von 364x288 Pixel. Das hat nicht funktioniert? Zurück zu MemoryAccessViolationen?

Also reduzierte ich die Bildgröße von 364x288 auf 288x288 bis 256x256, bis es bei 128x128 "bestanden", was zu einer Bildgröße von 49.512 Bytes führte.

So wurde der Parameter TotalPixels im obigen Funktionsaufruf 128x128 oder 16.384. Es scheint über die "maximale" Zahl zu sein, die der .NET-Marshaller als Puffergröße akzeptiert. Ist das sinnvoll?

Gibt es in .NET eine Obergrenze, die ich bei den bescheidenen Arten der Bildverarbeitung, die ich mache, nicht überschreiten kann?

+0

Stellen Sie sicher, dass der Index für das Byte [] ein ulong und keine ganze Zahl ist. – jdweng

Antwort

-1

Ei auf meinem Gesicht ...

Es stellt sich heraus, dass ich Puffergrößen falsch einstellen.

ich diesen Code wurde mit:

Byte[] Input = new byte[1024]; 
Byte[] Output = new byte[1024]; 
UInt32 pixels = 1024;  
cmsDoTransform(xform, Input, Output, pixels); 

Wenn ich diesen Code verwendet haben sollte:

Byte[] Input = new byte[1024 x 3]; // To allow for RGB = 3 bytes/pixel 
Byte[] Output = new byte[1024 x 4]; // To allow for CMYK = 4 bytes/pixel 
UInt32 pixels = 1024; // Correct number of pixels 
cmsDoTransform(xform, Input, Output, pixels); 

ich diese wichtige Unterscheidung völlig verfehlt und Tage verschwendet für meinen Fehler suchen. Ich riet dem Entwickler, das Hinzufügen eines Code-Snippets in der Dokumentation für die Zukunft in Betracht zu ziehen ...