2016-07-09 48 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); 

我完全错过这个重要的区别和浪费的天找我的错误。我建议开发人员考虑在将来的文档中添加一些代码片段...