Terrific, Adrian! I'm happy you had a chance to make it more accurate! 
Hopefully, I'll have a chance tomorrow to give it a try.  ...Reminds me of the 
"old days" when I used tape handling commands on an 8mm Exabyte tape drive to 
find headers and file markers to read specific frames from tape! (Yes, I'm old. 
 ;^)  LOL  )


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 <richb...@mac.com> 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
>>> Nuke-users@support.thefoundry.co.uk, http://forums.thefoundry.co.uk/
>>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>> 
>> _______________________________________________
>> Nuke-users mailing list
>> Nuke-users@support.thefoundry.co.uk, http://forums.thefoundry.co.uk/
>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>> 
> 
> _______________________________________________
> Nuke-users mailing list
> Nuke-users@support.thefoundry.co.uk, http://forums.thefoundry.co.uk/
> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users

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

Reply via email to