> the corelib version 
 
This class is now an official part of Flex 3:
mx.graphics.codec.JPEGEncoder.
 
- Gordon

________________________________

From: [email protected] [mailto:[EMAIL PROTECTED] On
Behalf Of Jon Bradley
Sent: Saturday, September 22, 2007 11:03 AM
To: [email protected]
Subject: Re: [flexcoders] JPGEncoder with progress support?



Sure does Doug! Thanks for the tips. 

I'm actually re-writing the corelib version now to make it more
efficient for larger images. Right now encoding a 2k image takes much
longer than I'm happy with. :)

I was doing a bit more research and will be breaking it up into 'chunks'
with progress events, hopefully.

If I get a good result I'll post back the code to the corelib project.

peace,

jon


On Sep 22, 2007, at 1:38 PM, Doug McCune wrote:


        This is doable, but requires a little more work than you
probably think. To do this you would modify JPEGEncoder, if you're using
Moxie take a look at the JPEGEncoder class around line 121. You'll see
this double for loop: 
        
        for (var ypos:int = 0; ypos < height; ypos += 8)
                {
                    for (var xpos:int = 0; xpos < width; xpos += 8)
                    {
                        RGB2YUV(source, xpos, ypos, width, height);
                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT,
YAC_HT);
                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT,
UVAC_HT);
                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT,
UVAC_HT);
                    } 
                }
        
        As far as I can tell that's where the bulk of the processing
happens. What you're going to want to do is add progress events
dispatching in there. But simply dispatching progress events isn't going
to be enough. That would effectively give you notifications for progress
of encoding, but since flash player is single threaded, your display
won't ever have time to update while those for loops are running. 
        
        So you'll need to split the processing up into smaller tasks and
insert idle times between them. You'll want to use the Timer class to
make your code wait for a given period (I've found that even just a few
milliseconds is enough for the display to update). 
        
        I would split up the algorithm to process one row at a time (so
basically that inner for loop gets turned into its own function). Then
have the function that processes a row start a timer once it's
completed, and once that timer completes, then run the function for the
next row and so on until you finish. That was you can dispatch a
progress event for each row and the display will have time to update. 
        
        Hope some of that makes sense.
        
        Doug


 

Reply via email to