Leonardo M. Ram? wrote 12 lines
Hi, I'm loading PGM files to an TImage.Picture using its LoadFromFile or LoadFromStream methods.
This works well on small to medium sized images, but I'm getting an
"EReadErrorEReadError" exception if I try to load images of 16mb or more.
Does anyone knows how can I workaround this?.
--
Leonardo M. Ram?
http://leonardorame.blogspot.com
--
The problem is in fpreadpnm.pp (fpc/packages/fcl-image), in the method:
procedure TFPReaderPNM.InternalRead(Stream:TStream;Img:TFPCustomImage);
var
Row:Integer;
l: Integer;
begin
ReadHeader(Stream);
Img.SetSize(FWidth,FHeight);
FScanLineSize:=FBitPP*((FWidth+7)shr 3);
GetMem(FScanLine,FScanLineSize);
try
for Row:=0 to img.Height-1 do
begin
ReadScanLine(Row,Stream);
WriteScanLine(Row,Img);
end;
finally
Row := l;
FreeMem(FScanLine);
end;
end;
The ReadScanLine method uses the FScanLineSize to read from a Stream using Stream.ReadBuffer with a size of FScanLineSize, and it seems like in my image, in a specific row (4734 to be clear) it has a different line size than the expected by FScanLineSize.
Maybe the formula used to calculate the scan line size is wrong?.
I can open my image with many viewers like Eye of Gnome, or Gimp without problems.