Adrian,

FYI...

I tried a few tests this morning and found a special case that fails for the 
"ZIP 16 LINES" type. It throws a "TypeError: ord() expected a character, but 
string of length 0 found". I should say first of all that it worked great on 
*all* of the exr files that were created by Nuke:  ZIP-1, ZIP-16, PIZ, RLE and 
B44. The one that *didn't* work was a ZIP-16 that was created by a VRay 
converter script:
http://www.spot3d.com/vray/help/200R1/tools_vrimg2exr.htm

However, those script-converted files *were* detected as ZIP-16 by your 
previous, more "brute force", script that allocates an arbitrary chunk of 
header data to read. It just so happens that we have a lot of older VRay 
renders that were converted to ZIP-16 with that vrimg to exr conveter script... 
 (8^\  There must be something "non-standard" about the way the files are 
written, but not different enough to prevent Nuke's Read code from using them.

In any case, thanks again for all your efforts, I really appreciate it - and 
I'm sure others do, too!

Rich


On May 22, 2012, at 7:28 PM, Adrian Baltowski wrote:

> Hi
> 
> In fact each channel name in exr can be 31 bytes long, so even 4096 could be 
> too less in some extreme cases. On the other side we don't want to read too 
> much.
> The code below fix this issue: I did small modifications to read actual size 
> of channels list and skip over, no matter how many channels is in the file. I 
> added few comments to clarify.
> 
> 
> ########################
> import struct
> 
> compList = ['None', 'RLE', 'ZIP', 'ZIP 16 lines', 'PIZ', 'PXR24', 'B44', 
> 'B44A']
>       
> n = nuke.selectedNode()
> file = nuke.filename(n, nuke.REPLACE)
> fd = open(file, 'rb')
> # read small portion of data 
> header = fd.read(256)
> 
> # search for channels list tag. Well... in fact we could hardcode this 
> position but I prefer to write it more flexible
> channels = header.find('channels')
> 
> # skip the tags... 
> fd.seek(channels+16)
> 
> # ...and read the actual size of channels list. We know, that it's 4-byte 
> integer
> channelsSize = fd.read(4)
> 
> # Ok, so we know how long (in bytes) is the channels list in our file. And we 
> simply jump over
> fd.seek(struct.unpack('i', channelsSize)[0], 1)
> 
> # Here we are
> position = fd.tell()
> 
> # read next portion of data and search for compression
> header = fd.read(256)
> index = header.find('compression')
> fd.seek(position + index+28)
> comp = ord(fd.read(1))
> print compList[comp]
> 
> 
> ######################################
> 
> 
> 
> Best
> Adrian
> 
> 
> 
> 
>> Nathan,
>> 
>> Thanks for the PDF link to the OpenEXR file layout - I was looking for 
>> something like that!
>> 
>> Rich
>> 
>> On May 22, 2012, at 1:23 PM, Nathan Rusch wrote:
>> 
>>> The compression attribute will be in a different place within the header 
>>> depending on the number of channels in the file (due to the layout of the 
>>> EXR header).
>>> 
>>> Adrian's snippet is simply finding the 'compression' attribute name within 
>>> the header, since that is one of the standard EXR attributes. From there, 
>>> based on known information about the EXR file layout, he can determine 
>>> where the actual compression attribute value is stored.
>>> 
>>> The read size of 1024 is pretty much an arbitrary value; you may need to 
>>> read a larger chunk in order to get far enough into the file to locate the 
>>> compression attribute if your file has a lot of channels. If you know the 
>>> names of all the channels within the file, you could figure out exactly how 
>>> many bytes to read, or even start your read from a predefined offset to 
>>> keep your data buffer as small as possible; otherwise, you'll just need to 
>>> make a safe estimate.
>>> 
>>> Check out this doc for a nice simple example of the structure of an EXR 
>>> file: http://www.openexr.com/openexrfilelayout.pdf
>>> 
>>> Hope this helps.
>>> 
>>> -Nathan
>>> 
>>> 
>>> -----Original Message----- From: Dan Rosen
>>> Sent: Tuesday, May 22, 2012 9:59 AM
>>> To: Nuke user discussion
>>> Subject: Re: [Nuke-users] How to check zip compression type for EXR 
>>> images...?
>>> 
>>> This is great! Can you let us know what index number the datatype is
>>> in? I'm finding it hard to tell.
>>> 
>>> thx
>>> Dan
>>> 
>>> On Mon, May 21, 2012 at 7:30 PM, Richard Bobo <[email protected]> wrote:
>>>> Adrian,
>>>> 
>>>> Brilliant - I'll be making it into a nice little pulldown menu utility
>>>> function! And, looking a bit deeper at your code, of course, so I can learn
>>>> some more Python...  8^)
>>>> 
>>>> Thanks!
>>>> 
>>>> Rich
>>>> 
>>>> Rich Bobo
>>>> Senior VFX Compositor
>>>> 
>>>> Mobile:  (248) 840-2665
>>>> Web:  http://richbobo.com/
>>>> 
>>>> "Man has been endowed with reason, with the power to create, so that he can
>>>> add to what he's been given."
>>>> - Anton Chekhov
>>>> 
>>>> 
>>>> 
>>>> On May 21, 2012, at 6:40 PM, Adrian Baltowski wrote:
>>>> 
>>>> Hi
>>>> With just few lines of code and totally simplified
>>>> 
>>>> **********************************
>>>> compList = ['None', 'RLE', 'ZIP', 'ZIP 16 lines', 'PIZ', 'PXR24', 'B44',
>>>> 'B44A']
>>>> 
>>>> n = nuke.selectedNode()
>>>> file = nuke.filename(n, nuke.REPLACE)
>>>> fd = open(file, 'rb')
>>>> header = fd.read(1024)
>>>> index = header.find('compression')
>>>> comp =ord(header[(index+28):(index+29)])
>>>> print compList[comp]
>>>> 
>>>> ***********************************
>>>> 
>>>> Each exr file MUST have compression info in the header and this info is
>>>> placed just after channels info. It's simple to get actual size of channels
>>>> list but I quickly set 1024 bytes of a headroom.
>>>> 
>>>> Best
>>>> Adrian 
>>> 
>>> _______________________________________________
>>> Nuke-users mailing list
>>> [email protected], http://forums.thefoundry.co.uk/
>>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>> 
>> _______________________________________________
>> Nuke-users mailing list
>> [email protected], http://forums.thefoundry.co.uk/
>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>> 
> 
> _______________________________________________
> Nuke-users mailing list
> [email protected], http://forums.thefoundry.co.uk/
> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users

_______________________________________________
Nuke-users mailing list
[email protected], http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users

Reply via email to