我有一个C#程序使用P / Invoke调用现有的C图像库DLL。
缓冲区的大小是否有可能被有效编组?
我正在调用一个函数,我将指针传递给InputBuffer,它的大小和OutputBuffer如下:
cmsDoTransform(xform, inputBitmapBytesRGB, outputBitmapBytesCMYK, TotalPixels);
在尝试使用此代码时,我一直收到MemoryAccessViolation错误?
所以我开始使用尺寸为1x1像素,2x2,4x4,8x8,16x16到64x64的非常小的RGB图像,一切都工作,突然间,没有更多的错误信息。不能幸福。
自信,我回到了我原来的364x288像素的RGB测试图像。那没用?回到MemoryAccessViolations?
所以我将图像尺寸从364x288降低到288x288到256x256,直到它“通过”,在128x128,导致图像大小为49,512字节。
因此,上述函数调用中的TotalPixels参数变为128x128或16,384。它似乎是关于.NET marshaller接受的“最大”数字作为缓冲区大小?这有意义吗?
在.NET中是否存在一个上限,我无法在我正在进行的简单图像处理中超越?
答案 0 :(得分:-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);
我完全错过了这个重要的区别,浪费了几天寻找我的错误。我建议开发人员考虑在将来的文档中添加一些代码片段......