C # — цикл через IntPtr?

Вот мой вопрос: Как мне перебрать материал, на который указывает IntPtr в C #?
У меня есть код C #, вызывающий код C ++. Код C ++ возвращает указатель на часть буфера изображения. Интерфейс между C # и C ++ является переменной IntPtr, объявленной в C #
Итак, вот мой код C #:

private IntPtr _maskData;

public void LoadMask(string maskName)
{
_maskData = Marshal.AllocHGlobal(_imgWidth * _imgHeight * 1);
ReadImage(maskName, ref _maskData);
}

[DllImport(@"D:\Projects\ImageStatistics\ImageStatisticsEllipse\Debug\DiskIO.dll", EntryPoint = "ReadImage")]
private static extern int ReadImage([MarshalAs(UnmanagedType.LPWStr)]string path, ref IntPtr outputBuffer);

Вот мой код C ++:

DllExport_ThorDiskIO ReadImage(char *selectedFileName, char* &outputBuffer)
{
TIFF* image;
tsize_t stripSize;
unsigned long imageOffset, result;
int stripMax, stripCount;
unsigned long bufferSize;
wchar_t * path = (wchar_t*)selectedFileName;
bool status;

// Open the TIFF image
if((image = tiffDll->TIFFOpenW(path, "r")) == NULL){
//      logDll->TLTraceEvent(VERBOSE_EVENT,1,L"Could not open incoming image");

}

// Read in the possibly multiple strips
stripSize = tiffDll->TIFFStripSize(image);
stripMax = tiffDll->TIFFNumberOfStrips (image);
imageOffset = 0;

bufferSize = tiffDll->TIFFNumberOfStrips (image) * stripSize;

for (stripCount = 0; stripCount < stripMax; stripCount++)
{
if((result = tiffDll->TIFFReadEncodedStrip (image, stripCount, outputBuffer + imageOffset, stripSize)) == -1)
{
//logDll->TLTraceEvent(VERBOSE_EVENT,1,L"Read error on input strip number");
}
imageOffset += result;
}

// Close the TIFF image
tiffDll->TIFFClose(image);

if(outputBuffer > 0)
{
//logDll->TLTraceEvent(VERBOSE_EVENT,1,L"inside output buffer: TRUE");
status = TRUE;
}
else
{
//logDll->TLTraceEvent(VERBOSE_EVENT,1,L"inside output buffer: FALSE");
status = FALSE;
}
return status;
}

Так что сейчас я думаю, что могу успешно получить IntPtr, но вопрос на самом деле: как мне его использовать? Как мне пройти через каждый пиксель в буфере изображения, что-то вроде (псевдокод):

for (int y = 0; y < imgHeight; y++)
for (int x = 0; x < imgWidth; x++)
{
int pixVal = IntPtr[y * imgWidth + x ];

// do something to process the pixel value here....

}

0

Решение

Это как перебрать изображение, на которое указывает IntPtr (указатель на собственную память)

//assume this actually points to something (not zero!!)
IntPtr pNative = IntPtr.Zero;

//assume these are you image dimensions
int w=640; //width
int h=480; //height
int ch =3; //channels

//image loop
//use unsafe
//this is very fast!!
unsafe
{
for (int r = 0; r < h; r++)
{
byte* pI = (byte*)pNative.ToPointer() + r*w*ch; //pointer to start of row
for (int c = 0; c < w; c++)
{
pI[c * ch]      = 0; //red
pI[c * ch+1]    = 0; //green
pI[c * ch+2]    = 0; //blue

//also equivalent to *(pI + c*ch)  = 0 - i.e. using pointer arythmetic;
}
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]