<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:΢ÈíÑźÚ
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
Hi all, I'm using vtkImageStencil to create ROIs on an image. The vtkImageStencilData::Add() works well for me, but vtkImageStencilData::Subtract() will cause my program to crash form time to time.<br>By looking at the source code, the program crashes in vtkImageStencil.cxx line 194 where "tmpPtr" becomes invalid and (outSpanEndPtr - outPtr) becomes negative. I'm not sure whether vtkImageStencilData::Subtract() causes this problem or it's sth. else. Can anyone give some suggestions? <br>Lewes.<br>//////////////////////////<br>Environment: VC2009, WinXP, VTK5.8<br>crash point:<br>//----------------------------------------------------------------------------<br>template <class T><br>void vtkImageStencilExecute(vtkImageStencil *self,<br> vtkImageData *inData, T *,<br> vtkImageData *inData2, T *,<br> vtkImageData *outData, T *,<br> int outExt[6], int id,<br> vtkInformation *outInfo)<br>{<br> vtkImageStencilData *stencil = self->GetStencil();<br><br> vtkImageIterator<T> inIter(inData, outExt);<br> vtkImageStencilIterator<T> outIter(outData, stencil, outExt, self, id);<br><br> int numscalars = outData->GetNumberOfScalarComponents();<br><br> // whether to reverse the stencil<br> bool reverseStencil = (self->GetReverseStencil() != 0);<br><br> // if no background image is provided in inData2<br> if (inData2 == 0)<br> {<br> // set color for area outside of input volume extent<br> T *background;<br> vtkAllocBackground(self, background, outInfo);<br><br> T *inPtr = inIter.BeginSpan();<br> T *inSpanEndPtr = inIter.EndSpan();<br> while (!outIter.IsAtEnd())<br> {<br> T* outPtr = outIter.BeginSpan();<br> T* outSpanEndPtr = outIter.EndSpan();<br><br> T *tmpPtr = inPtr;<br> int tmpInc = numscalars;<br> if (!(outIter.IsInStencil() ^ reverseStencil))<br> {<br> tmpPtr = background;<br> tmpInc = 0;<br> }<br><br> // move inPtr forward by the span size<br> inPtr += (outSpanEndPtr - outPtr);<br><br> while (outPtr != outSpanEndPtr)<br> {<br> // CopyPixel increments outPtr but not tmpPtr<br> vtkCopyPixel(outPtr, tmpPtr, numscalars); // crashes here<br> tmpPtr += tmpInc;<br> }<br><br> outIter.NextSpan();<br><br> // this occurs at the end of a full row<br> if (inPtr == inSpanEndPtr)<br> {<br> inIter.NextSpan();<br> inPtr = inIter.BeginSpan();<br> inSpanEndPtr = inIter.EndSpan();<br> }<br> }<br><br> vtkFreeBackground(self, background);<br> }<br><br> // if a background image is given in inData2<br> else<br> {<br> vtkImageIterator<T> inIter2(inData2, outExt);<br><br> T *inPtr = inIter.BeginSpan();<br> T *inPtr2 = inIter2.BeginSpan();<br> T *inSpanEndPtr = inIter.EndSpan();<br> while (!outIter.IsAtEnd())<br> {<br> T* outPtr = outIter.BeginSpan();<br> T* outSpanEndPtr = outIter.EndSpan();<br><br> T *tmpPtr = inPtr;<br> if (!(outIter.IsInStencil() ^ reverseStencil))<br> {<br> tmpPtr = inPtr2;<br> }<br><br> // move inPtr forward by the span size<br> inPtr += (outSpanEndPtr - outPtr);<br> inPtr2 += (outSpanEndPtr - outPtr);<br><br> while (outPtr != outSpanEndPtr)<br> {<br> // CopyPixel increments outPtr but not tmpPtr<br> vtkCopyPixel(outPtr, tmpPtr, numscalars);<br> tmpPtr += numscalars;<br> }<br><br> outIter.NextSpan();<br><br> // this occurs at the end of a full row<br> if (inPtr == inSpanEndPtr)<br> {<br> inIter.NextSpan();<br> inIter2.NextSpan();<br> inPtr = inIter.BeginSpan();<br> inPtr2 = inIter2.BeginSpan();<br> inSpanEndPtr = inIter.EndSpan();<br> }<br> }<br> }<br>}<br><br>                                            </div></body>
</html>