[Lazarus] TPicture.LoadFromStream error

Leonardo M. Ramé l.rame at griensu.com
Fri Nov 5 16:39:28 CET 2010


On 2010-11-05 11:46:01 -0300, Leonardo M. Ramé wrote:
> 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.

-- 
Leonardo M. Ramé
http://leonardorame.blogspot.com




More information about the Lazarus mailing list