Well, I said it was untested. It's just the framework. Here's a version that at least produces a result:

y =. i. 5 10
'height width'=: $y
pixels=: ,y
NB. convert to array, reverse, add bottom/right 0
array =: ({.~ >:@$);.0 (height, width) $ pixels

NB. x is unused,above), y is left,upper-left
NB. Result is Paeth predictor
paeth =: (({~   (i. <./)@:|@:(- +`-/)))@:(}.@,)
NB. x is unused,above), y is left,upper-left
NB. Result is (new pixel total,next upper-left (same as input 'above')
pixels2x2 =: (256 | [ + 2 {. paeth)
NB. y is is a pair of scanlines (current,above)
NB. transpose, then decompress on each 2x2 producing a table of
NB. (uncompressed value,above).  Discard the above part, leaving a list
scanlinepair =: 0 {"1 pixels2x2/\.@,.
NB. Operate on each scanline-pair; reverse and remove added row/col
xformimage =: 1 1&}.;.0 scanlinepair/\. array


To support bpp you would need to keep an nx2 instead of a 2x2 history. Ecch.

Henry Rich

On 9/1/2014 11:04 AM, bill lam wrote:
I assume your code is for backward filter (from paeth to raw).
I tried with test data: y =. i. 5 10
'height width'=. $y
pixels=. ,y

but it ran into error
|index error: scanlinepair
|   xformimage=.1 1&}.;.0     scanlinepair/\.array

Also the bpp meant comparison with bpp byte apart. this bpp can
be 1 to 7 depending on pixel format. so that each of the current
and above line can be reshaped or partition before processing
the 2x2 blocks.


Пн, 01 сен 2014, Henry Rich написал(а):
Untested.  Here is a framework.  It's not pretty, but this
computation is just not parallelizable.

NB. convert to array, reverse, add bottom/right 0
array =. ({.~ >:@$);.0 (height, width) $ pixels

NB. y is 2x2 of (unused,above),:(left,upper-left)
NB. Result is Paeth predictor
paeth =. ({~   (i. <./)@:|@:(- +`-/))@:(}.@,)
NB. y is 2x2 of (new pixel diff,above),:(left,upper-left)
NB. Result is (new pixel total,next upper-left (same as input 'above')
pixels2x2 =. ({. + 2 {. 256 | paeth)
NB. y is is a pair of scanlines (current,above)
NB. transpose, then decompress on each 2x2 producing a table of
NB. (uncompressed value,above).  Discard the above part, leaving a list
scanlinepair =. 0 {"1 pixels2x2/\.@|:
NB. Operate on each scanline-pair; reverse and remove added row/col
xformimage =. 1 1&}.;.0 scanlinepair/\. array


Henry Rich


On 9/1/2014 1:44 AM, bill lam wrote:
Context for discussion, section 6.6 of this png rfc

* http://tools.ietf.org/html/rfc2083

The forward filter seems trivial, but the backward filter seems
tricky to me if not using loop.  Any idea on a loop free
solution?


NB. Paeth Predictor
paeth=: 3 : 0
p=. +/ 1 1 _1 * y
y{~ (i.<./) |p-y
)

forward=: 4 : 0
prev=. 10$ 3 5 8
iy=. i.10
pae=. 256&| iy - paeth"1 ((-x)}.(x#0),iy),.prev,.((-x)}.(x#0),prev)
)

    3 forward''
253 252 250 3 3 3 3 3 3 3
    4 forward''
253 252 250 0 1 0 4 2 0 6

NB. backward ??
NB. 4 backward 4 forward ''

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to