2016-07-09 110 views
-1

我有一個C#程序使用P/Invoke調用現有的C圖像庫DLL。調用Native方法時的最大緩衝區大小

是否有可能緩衝區的大小是有限的,可以有效地編組?

我打電話的功能,我傳遞一個指向INPUTBUFFER,它的大小和OutputBuffer中是這樣的:

cmsDoTransform(xform, inputBitmapBytesRGB, outputBitmapBytesCMYK, TotalPixels); 

雖然這段代碼嘗試,我不停地接收MemoryAccessViolation錯誤?

因此,我開始使用尺寸爲1x1像素,2x2,4x4,8x8,16x16高達64x64的非常小的RGB圖像,並且一切正常,突然間,沒有更多的錯誤消息。不能更快樂。

有信心,我回到了原來的364x288像素RGB測試圖像。那沒有用?返回MemoryAccessViolations?

因此,我將圖像大小從364x288縮小到288x288,直到它以128x128「通過」,最終導致圖像大小爲49,512字節。

因此,上述函數調用中的TotalPixels參數變成了128x128或16,384。它似乎是關於.NET編組將作爲緩衝區大小接受的「最大」數量?那有意義嗎?

在.NET中,有沒有一個上限,我不能在我正在做的卑微的圖像處理中進行上述操作?

+0

確保byte []的索引是ulong而不是整數。 – jdweng

回答

-1

雞蛋在我的臉上...

原來我錯誤地設置了緩衝區大小。

我用這個代碼:

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

當我應該已經使用此代碼:

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); 

我完全錯過這個重要的區別和浪費的天找我的錯誤。我建議開發人員考慮在將來的文檔中添加一些代碼片段...