Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-31 Thread Mattias Gaertner
On Mon, 30 May 2011 23:24:30 +0200 (CEST)
Michael Van Canneyt mich...@freepascal.org wrote:

 
 
 On Mon, 30 May 2011, Felipe Monteiro de Carvalho wrote:
 
  On Mon, May 30, 2011 at 10:16 PM, Marco van de Voort mar...@stack.nl 
  wrote:
http://bugs.freepascal.org/view.php?id=17621
  
  
  Indeed, I was remembering that too =)
  
  And also, I have a program which loads a huge image (20MB) using 
  TPortableNetworkGraphics and it takes minutes to load the image. I have 
  simply supposed
  that it was because of the file system usage, but now I am starting to 
  think that maybe the fcl-image pallete causes the slowness.
  
  So I have to suggest: Is there a convincing reason for having Pallete set 
  to true by default? What do you think about the trivial solution of setting 
  it
  off by default?
 
 It is now off by default.
 
 Committed in revision 17613.

Great. :)

Mattias
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread michael . vancanneyt


Try the following code:

Img:=TFPMemoryImage.Create(0,0);
Img.UsePalette:=False;
Img.loadFromFile(FileList[i]);

That should work much faster. The reason is probably that the default image
created by the reader uses a palette, which is of course dog slow when reading 
large images.


Michael.

On Mon, 30 May 2011, Ben Smith wrote:


Hi,

I wrote this console utility app in 5 minutes. All it is supposed to
do, is iterate over *.jpg images (65 at the moment) in a folder (no
recursive searches), and generate a snipped of HTML that I need to
paste into my wives website.

I first thought my utility app is in some recursive loop or something
because the output didn't appear instantly - like I thought it would.

I added some debug output between the generate HTML. To my surprise
the FPImage code reading a 35Kb jpg file takes +- 8 seconds and a 65KB
file takes +- 30 seconds - on a Quad Core machine! WTF???

Is this normal? Is FPImage really that slow reading small roughly
650x450 pixel jpg images?  Or am I doing something unbelievably
stupid? :-/

The reason I'm reading in the jpg files is so I can get their Width
and Height values. Avg. jpeg file sizes are between 35-45KB, and
largest file size is 65KB.

Here is the relevant code snippet

var
 imgreader: TFPReaderJPEG;
 stream: TFileStream;
 img:TFPCustomImage;



 writeln('processing file: ', filelist[i]);
 stream := TFileStream.Create(filelist[i], fmOpenRead);
 writeln(1);
 imgreader := TFPReaderJPEG.Create;
 writeln(2, FormatDateTime(' hh:mm:ss.zz', Now) + '  (start reading)');
 img := imgreader.ImageRead(stream, nil);
 writeln(3, FormatDateTime(' hh:mm:ss.zz', Now) + '  (done)');




Here is the program output... Note the timestamps between start
reading and done reading (lines marked with '2' and '3').


---[ start ]---
$ ./project1 img/babies/full
Finished search. Found 65 matches
---
div id=thumbnails
table cellspacing=10
tr align=center valign=middel   !--  Row starts  --
td
processing file: img/babies/full/babies.01.jpg
1
2 16:00:30.210  (start reading)
3 16:00:38.338  (done)
img src=img/babies/full/babies.01.jpg alt= id=screen1
class=imglarge onmouseout=reducethumb(1); return false;
onclick=reducethumb(1); return false;
img src=img/babies/thumbs/babies.01.jpg alt= class=imgsmall
id=thumb1 onclick=expandthumb(1, 650, 413);
/td
/tr
tr align=center valign=middel   !--  Row starts  --
td
processing file: img/babies/full/babies.02.jpg
1
2 16:00:38.338  (start reading)
3 16:01:10.447  (done)
img src=img/babies/full/babies.02.jpg alt= id=screen2
class=imglarge onmouseout=reducethumb(2); return false;
onclick=reducethumb(2); return false;
img src=img/babies/thumbs/babies.02.jpg alt= class=imgsmall
id=thumb2 onclick=expandthumb(2, 650, 435);
/td
/tr
tr align=center valign=middel   !--  Row starts  --
td
processing file: img/babies/full/babies.03.jpg
1
2 16:01:10.447  (start reading)
3 16:01:28.859  (done)
img src=img/babies/full/babies.03.jpg alt= id=screen3
class=imglarge onmouseout=reducethumb(3); return false;
onclick=reducethumb(3); return false;
img src=img/babies/thumbs/babies.03.jpg alt= class=imgsmall
id=thumb3 onclick=expandthumb(3, 405, 650);
/td
/tr
tr align=center valign=middel   !--  Row starts  --
td
processing file: img/babies/full/babies.04.jpg
1
2 16:01:28.859  (start reading)

snip
---[ end ]---



--

   Ben.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread Ben Smith
On Mon, May 30, 2011 at 4:16 PM,  Michael wrote:
 snip
 That should work much faster. The reason is probably that the default image


Ah, thanks Michael that did the trick. I knew I had to be doing
something wrong.



-- 

  Ben.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread Tomas Hajny
On Mon, May 30, 2011 16:16, michael.vancann...@wisa.be wrote:

 Try the following code:

 Img:=TFPMemoryImage.Create(0,0);
 Img.UsePalette:=False;
 Img.loadFromFile(FileList[i]);

 That should work much faster. The reason is probably that the default
 image
 created by the reader uses a palette, which is of course dog slow when
 reading
 large images.

Interesting. What is supposed to be a large image? I ask because the
original post mentioned 35 kB and 65 kB (and indirectly also dimensions
around 600x400 if I understand the program output correctly) which I
certainly wouldn't consider as large (and the mentioned time necessary
for reading it surely not appropriate regardless of using palette or not).
I guess that some optimization may be reasonable because such pictures
could be loaded and displayed (including conversion from true colour to
256 colours palette) faster even on a 486 machine...

Tomas



 On Mon, 30 May 2011, Ben Smith wrote:

 Hi,

 I wrote this console utility app in 5 minutes. All it is supposed to
 do, is iterate over *.jpg images (65 at the moment) in a folder (no
 recursive searches), and generate a snipped of HTML that I need to
 paste into my wives website.

 I first thought my utility app is in some recursive loop or something
 because the output didn't appear instantly - like I thought it would.

 I added some debug output between the generate HTML. To my surprise
 the FPImage code reading a 35Kb jpg file takes +- 8 seconds and a 65KB
 file takes +- 30 seconds - on a Quad Core machine! WTF???

 Is this normal? Is FPImage really that slow reading small roughly
 650x450 pixel jpg images?  Or am I doing something unbelievably
 stupid? :-/

 The reason I'm reading in the jpg files is so I can get their Width
 and Height values. Avg. jpeg file sizes are between 35-45KB, and
 largest file size is 65KB.

 Here is the relevant code snippet

 var
  imgreader: TFPReaderJPEG;
  stream: TFileStream;
  img:TFPCustomImage;

 

  writeln('processing file: ', filelist[i]);
  stream := TFileStream.Create(filelist[i], fmOpenRead);
  writeln(1);
  imgreader := TFPReaderJPEG.Create;
  writeln(2, FormatDateTime(' hh:mm:ss.zz', Now) + '  (start reading)');
  img := imgreader.ImageRead(stream, nil);
  writeln(3, FormatDateTime(' hh:mm:ss.zz', Now) + '  (done)');




 Here is the program output... Note the timestamps between start
 reading and done reading (lines marked with '2' and '3').


 ---[ start ]---
 $ ./project1 img/babies/full
 Finished search. Found 65 matches
 ---
 div id=thumbnails
 table cellspacing=10
 tr align=center valign=middel  !--  Row starts  --
 td
 processing file: img/babies/full/babies.01.jpg
 1
 2 16:00:30.210  (start reading)
 3 16:00:38.338  (done)
 img src=img/babies/full/babies.01.jpg alt= id=screen1
 class=imglarge onmouseout=reducethumb(1); return false;
 onclick=reducethumb(1); return false;
 img src=img/babies/thumbs/babies.01.jpg alt= class=imgsmall
 id=thumb1 onclick=expandthumb(1, 650, 413);
 /td
 /tr
 tr align=center valign=middel  !--  Row starts  --
 td
 processing file: img/babies/full/babies.02.jpg
 1
 2 16:00:38.338  (start reading)
 3 16:01:10.447  (done)
 img src=img/babies/full/babies.02.jpg alt= id=screen2
 class=imglarge onmouseout=reducethumb(2); return false;
 onclick=reducethumb(2); return false;
 img src=img/babies/thumbs/babies.02.jpg alt= class=imgsmall
 id=thumb2 onclick=expandthumb(2, 650, 435);
 /td
 /tr
 tr align=center valign=middel  !--  Row starts  --
 td
 processing file: img/babies/full/babies.03.jpg
 1
 2 16:01:10.447  (start reading)
 3 16:01:28.859  (done)
 img src=img/babies/full/babies.03.jpg alt= id=screen3
 class=imglarge onmouseout=reducethumb(3); return false;
 onclick=reducethumb(3); return false;
 img src=img/babies/thumbs/babies.03.jpg alt= class=imgsmall
 id=thumb3 onclick=expandthumb(3, 405, 650);
 /td
 /tr
 tr align=center valign=middel  !--  Row starts  --
 td
 processing file: img/babies/full/babies.04.jpg
 1
 2 16:01:28.859  (start reading)

 snip
 ---[ end ]---


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread michael . vancanneyt



On Mon, 30 May 2011, Tomas Hajny wrote:


On Mon, May 30, 2011 16:16, michael.vancann...@wisa.be wrote:


Try the following code:

Img:=TFPMemoryImage.Create(0,0);
Img.UsePalette:=False;
Img.loadFromFile(FileList[i]);

That should work much faster. The reason is probably that the default
image
created by the reader uses a palette, which is of course dog slow when
reading
large images.


Interesting. What is supposed to be a large image? I ask because the
original post mentioned 35 kB and 65 kB (and indirectly also dimensions
around 600x400 if I understand the program output correctly) which I
certainly wouldn't consider as large (and the mentioned time necessary
for reading it surely not appropriate regardless of using palette or not).
I guess that some optimization may be reasonable because such pictures
could be loaded and displayed (including conversion from true colour to
256 colours palette) faster even on a 486 machine...


It depends on the colors used. The default palette algorithm simply 
allocates a slot per found color in the jpg and returns the index of the
slow. For a picture, this will create a huge palette, in which the search 
for a color is in essence linear, so n^2 lookups.


So, dog slow.

You could obviously speed this up by creating a palette yourself, and 
limiting the number of colors.


Or, best for pictures is  not to use a palette, which is what my solution
entails.

Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread Ben Smith

 Interesting. What is supposed to be a large image? I ask because the
 original post mentioned 35 kB and 65 kB (and indirectly also dimensions
 around 600x400 if I understand the program output correctly) which I

I suppose he was referring to the color palette, and not the
physical image size. I guess that is why The Gimp limits png images to
256 colors when I saved it as Indexed (which then generates a color
palette). So I guess it is a standard issue with Index/Palette
images thus limit your colors, or don't use a palette.

I guess one change in FPImage (depending on how often this occurs
obviously), could be to default to UsePalette = False instead.


-- 

  Ben.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread Mattias Gaertner
 
 

 Tomas Hajny xhaj...@hajny.biz hat am 30. Mai 2011 um 16:50 geschrieben:

  On Mon, May 30, 2011 16:16, michael.vancann...@wisa.be wrote:
  
   Try the following code:
  
   Img:=TFPMemoryImage.Create(0,0);
   Img.UsePalette:=False;
   Img.loadFromFile(FileList[i]);
  
   That should work much faster. The reason is probably that the default
   image
   created by the reader uses a palette, which is of course dog slow when
   reading
   large images.
 
  Interesting. What is supposed to be a large image? I ask because the
  original post mentioned 35 kB and 65 kB (and indirectly also dimensions
  around 600x400 if I understand the program output correctly) which I
  certainly wouldn't consider as large (and the mentioned time necessary
  for reading it surely not appropriate regardless of using palette or not).
  I guess that some optimization may be reasonable because such pictures
  could be loaded and displayed (including conversion from true colour to
  256 colours palette) faster even on a 486 machine...
 Is there any size, where a palette image is fast?

 I think this is a newbie trap and the default for UsePalette should be changed.

 Mattias___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread Mark Morgan Lloyd

michael.vancann...@wisa.be wrote:

Try the following code:

Img:=TFPMemoryImage.Create(0,0);
Img.UsePalette:=False;
Img.loadFromFile(FileList[i]);

That should work much faster. The reason is probably that the default image
created by the reader uses a palette, which is of course dog slow when 
reading large images.


Pardon me for jumping in, but is there an equivalent fix for slow 
operations in a TLazIntfImage?


--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread Jonas Maebe

On 30 May 2011, at 16:59, michael.vancann...@wisa.be wrote:

 It depends on the colors used. The default palette algorithm simply allocates 
 a slot per found color in the jpg and returns the index of the
 slow. For a picture, this will create a huge palette, in which the search for 
 a color is in essence linear, so n^2 lookups.

Isn't it possible to automatically disable the palette automatically for images 
with a bit depth of 16 bits or more? I'm not aware of any image format that 
uses palettes at those bit depths (and even if there are such formats, they are 
at least not common in general use cases).


Jonas___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread Marco van de Voort
In our previous episode, Mattias Gaertner said:
   for reading it surely not appropriate regardless of using palette or not).
   I guess that some optimization may be reasonable because such pictures
   could be loaded and displayed (including conversion from true colour to
   256 colours palette) faster even on a 486 machine...
  Is there any size, where a palette image is fast?
 
  I think this is a newbie trap and the default for UsePalette should be 
 changed.

Not just newbies :-)

http://bugs.freepascal.org/view.php?id=17621

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread Felipe Monteiro de Carvalho
On Mon, May 30, 2011 at 10:16 PM, Marco van de Voort mar...@stack.nlwrote:

 http://bugs.freepascal.org/view.php?id=17621


Indeed, I was remembering that too =)

And also, I have a program which loads a huge image (20MB) using
TPortableNetworkGraphics and it takes minutes to load the image. I have
simply supposed that it was because of the file system usage, but now I am
starting to think that maybe the fcl-image pallete causes the slowness.

So I have to suggest: Is there a convincing reason for having Pallete set to
true by default? What do you think about the trivial solution of setting it
off by default?

-- 
Felipe Monteiro de Carvalho
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread Ben Smith
On Mon, May 30, 2011 at 10:22 PM, Felipe Monteiro de Carvalho wrote:
 So I have to suggest: Is there a convincing reason for having Pallete set to
 true by default? What do you think about the trivial solution of setting it
 off by default?

It seems I have opened a hornets nest. :)  But from the many replies,
it seems everybody expects UsePalette to be False by default (instead
of what it is now True). Maybe a new default should be considered.



-- 

  Ben.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Why is FPImage dog slow in reading jpeg's?

2011-05-30 Thread Michael Van Canneyt



On Mon, 30 May 2011, Felipe Monteiro de Carvalho wrote:


On Mon, May 30, 2011 at 10:16 PM, Marco van de Voort mar...@stack.nl wrote:
  http://bugs.freepascal.org/view.php?id=17621


Indeed, I was remembering that too =)

And also, I have a program which loads a huge image (20MB) using 
TPortableNetworkGraphics and it takes minutes to load the image. I have simply 
supposed
that it was because of the file system usage, but now I am starting to think 
that maybe the fcl-image pallete causes the slowness.

So I have to suggest: Is there a convincing reason for having Pallete set to 
true by default? What do you think about the trivial solution of setting it
off by default?


It is now off by default.

Committed in revision 17613.

Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal