Hi,

I can see the point of processing image data with a compiled library. But for just reading out header info, it seems kinda overkill.

I'll look at it in the weekend and make it into a real module for reading values in the header. Compiled python libraries can always be a hassle if it has to work in multiple software packages.

Best Regards
Jimmy Christensen
Developer
Ghost A/S

On 09/08/12 19:18, Michael Garrett wrote:
Not necessarily just the header info, but that would be the most obvious
thing to want to access. So, given that for me at least, OpenEXR
(the third party binding) crashes when used in Nuke, it's good to know
that your script will also do the job. But it would be a lot more
convenient for me if I just had a python module of pre-made functions
for accessing header info and other metadata that Nuke would not
normally display in the ViewMetaData node. Apparently the new PyIlmBase
is more for accessing stored matrices rather than text strings (headers
etc).


On 8 August 2012 22:52, Jimmy Christensen <[email protected]
<mailto:[email protected]>> wrote:

    If you only wish to access the headers I can easily modify the
    script to put them in a dict. Doesn't need to be compiled and is
    easier to modify to your needs.


    Best Regards
    Jimmy Christensen
    Developer
    Ghost A/S

    On 09/08/12 00:35, Michael Garrett wrote:

        Cool - this was something I got working in a shell, and it would
        have
        been really handy directly in Nuke. I'm not sure how to point it to
        Nuke's libraries but someone will...


        On 8 August 2012 14:12, John RA Benson <[email protected]
        <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>> wrote:

             just a side note: if you tried OpenEXR as your third party
             python/exr implementation but it kept crashing nuke, try
             re-compiling it with nuke's libs instead of the standard
        python and
             exr libs. It's pretty handy, works, and is a lot simpler
        than using
             struct.

             exrfile = '/path/to/myexrfile.001.exr'
             exrObj = OpenEXR.InputFile(exrfile)
             exrHeaderDict = exrObj.header()

             'compression' is a key in the exrHeaderDict

             JRAB

             On Aug 8, 2012, at 9:09 PM, Michael Garrett wrote:

                 I just found out that apparently PyIlmBase will not
            allow access
                 to the exr header!! Hmm. Maybe in the future.


                 On 3 August 2012 14:33, Michael Garrett
            <[email protected] <mailto:[email protected]>
                 <mailto:[email protected]
            <mailto:[email protected]>>__> wrote:

                     I just noticed the release of PyIlmBase in OpenEXR
            1.7.1,
                     hopefully this can be folded into the compiled exr
            version
                     that comes with Nuke.

                     Although I can't find any documentation yet, I
            assume that
                     means there is some kind of function included that
            will allow
                     the editing of exr header files and we can just
            import that
                     module straight into Nuke. I had tried out a
            similar function
                     a while back in the third party python/exr
            implementation but
                     I found that the module would crash Nuke on import.

                     Michael


                     On 24 May 2012 19:01, Richard Bobo
            <[email protected] <mailto:[email protected]>
                     <mailto:[email protected]
            <mailto:[email protected]>>> wrote:

                         Oops, forgot to make the menu addCommand be
            "generic"…

                         ...Should probably be something more like:
                         m = menubar.addMenu("Custom")
                         m.addCommand('EXR file compression info - from
            a selected
                         Read node', 'exrCompressionTest()', '^+e')

                         Rich


                         On May 24, 2012, at 9:53 PM, Richard Bobo wrote:

                             Jimmy,

                             It works very well!

                             ...Tomorrow, I'll try it on those
                "renegade" Zip-16 files
                             that were made with the vrimg-->exr script
                and see if it
                             works on those, too...

                             Here's your code with some added bits for
                checking if the
                             user has tried to do something unexpected,
                like not
                             select a node at all, select the wrong type
                of node, or
                             select a Read node that's not reading an
                EXR file, etc…



                
####____________________________________________________________________________
                             #### Function to test EXR file Compression
                scheme...--
                             For init.py file...

                
####____________________________________________________________________________

                             def exrCompressionTest():
                             try:
                             n = nuke.selectedNode()
                             if nuke.selectedNode().Class()!='__Read' or
                             nuke.selectedNode() == "" :
                             nuke.message('No Read node selected.')
                             elif

                
os.path.splitext(nuke.__filename(nuke.selectedNode()))__[-1]!=".exr"
                             :
                             nuke.message('Selected Read is not an EXR')
                             else:
                             filePath = nuke.filename(n, nuke.REPLACE)
                             file = open(filePath, 'rb')
                             compressionTypes = ['RAW', 'RLE', 'ZIP1',
                'ZIP16', 'PIZ',
                             'PXR24', 'B44']
                             compression = 0
                             if struct.unpack("i4", file.read(4))[0] ==
                20000630:
                               versionFlag = struct.unpack("i4",
                file.read(4))
                               loop = True
                               while loop == True:
                               i = 0
                               size = 0
                               headerStart = file.tell()
                               headerName = ""
                               headerType = ""
                               while i <= 50:
                               buffer = file.read(1)
                               if ord(buffer) == 0 and headerName == "":
                               nameSize = file.tell() - headerStart
                               file.seek(0-nameSize, 1)
                               headerName = file.read(nameSize)[0:-1]
                               if len(headerName) == 0:
                               loop = False
                               break
                               elif ord(buffer) == 0 and headerType == "":
                               nameSize = file.tell() - len(headerName)
                - 1 - headerStart
                               file.seek(0-nameSize, 1)
                               headerType = file.read(nameSize)[0:-1]
                               headerSize = struct.unpack("i4",
                file.read(4))[0]
                               if headerName == "compression":
                               compression = file.read(1)
                               else:
                               file.seek(headerSize, 1)
                               break
                               if i == 50 or headerStart > 1024:
                               loop = False
                               i=+1
                             compressMethod =
                (compressionTypes[ord(__compression)])
                             print compressMethod
                             nuke.message('EXR compression is %s'
                %(compressMethod))

                             except ValueError:
                             nuke.message('Please select a Read node...')


                
####____________________________________________________________________________
                             #### -- For menu.py file...

                
####____________________________________________________________________________

                             #### Add function that checks EXR files for
                their
                             compression method...
                             m.addCommand('EXR file compression info -
                from a selected
                             Read node', 'aw.exrCompressionTest()', '^+e')




                             Thanks!
                             Rich


                             Rich Bobo
                             Senior VFX Compositor

                             Mobile: (248) 840-2665
                <tel:%28248%29%20840-2665> <tel:%28248%29%20840-2665>

                             Web: http://richbobo.com/

                             "The nearest way to glory -- a shortcut, as
                it were -- is
                             to strive to be what you wish to be thought
                to be."
                             - Socrates, quoted in Cicero, 44 BC.



                             On May 24, 2012, at 10:15 AM, Jimmy
                Christensen wrote:

                                 Updated. Fixed so that it doesn't just
                    stop after
                                 screenWindowWidth, but actually stops
                    if the header
                                 stops (or larger than 1024).


                    ##############################__###############

                                 import struct

                                 n = nuke.selectedNode()
                                 filePath = nuke.filename(n, nuke.REPLACE)
                                 file = open(filePath, 'rb')

                                 compressionTypes = ['RAW', 'RLE',
                    'ZIP1', 'ZIP16',
                                 'PIZ', 'PXR24', 'B44']

                                 compression = 0
                                 if struct.unpack("i4", file.read(4))[0]
                    == 20000630:
                                    versionFlag = struct.unpack("i4",
                    file.read(4))
                                    loop = True
                                    while loop == True:
                                        i = 0
                                        size = 0
                                        headerStart = file.tell()
                                        headerName = ""
                                        headerType = ""
                                        while i <= 50:
                                            buffer = file.read(1)
                                            if ord(buffer) == 0 and
                    headerName == "":
                                                nameSize = file.tell() -
                    headerStart
                                                file.seek(0-nameSize, 1)
                                                headerName =
                    file.read(nameSize)[0:-1]
                                                if len(headerName) == 0:
                                                    loop = False
                                                    break
                                            elif ord(buffer) == 0 and
                    headerType == "":
                                                nameSize = file.tell() -
                    len(headerName)
                                 - 1 - headerStart
                                                file.seek(0-nameSize, 1)
                                                headerType =
                    file.read(nameSize)[0:-1]
                                                headerSize =
                    struct.unpack("i4",
                                 file.read(4))[0]
                                                if headerName ==
                    "compression":
                                                    compression =
                    file.read(1)
                                                else:
                                                    file.seek(headerSize, 1)
                                                break
                                            if i == 50 or headerStart >
                    1024:
                                                loop = False
                                            i=+1

                                 print(compressionTypes[ord(__compression)])



                    ##############################__###############

                                 Best Regards
                                 Jimmy Christensen
                                 Developer
                                 Ghost A/S


                                 On 24/05/12 16:06, Jimmy Christensen wrote:

                                     I also wanted to pitch in :)

                                     It parses the file instead of just
                        searching. Can be
                                     extended to check
                                     for other stuff. Stops after the
                        first 1024 bytes and
                                     after hitting the
                                     "screenWindowWidth" header.


                        ##############################__###############

                                     import struct

                                     n = nuke.selectedNode()
                                     filePath = nuke.filename(n,
                        nuke.REPLACE)
                                     file = open(filePath, 'rb')

                                     compressionTypes = ['RAW', 'RLE',
                        'ZIP1', 'ZIP16',
                                     'PIZ', 'PXR24', 'B44']

                                     #test = file.read(4)
                                     compression = 0
                                     if struct.unpack("i4",
                        file.read(4))[0] == 20000630:
                                         versionFlag =
                        struct.unpack("i4", file.read(4))
                                         loop = True
                                         while loop == True:
                                             i = 0
                                             size = 0
                                             headerStart = file.tell()
                                             headerName = ""
                                             headerType = ""
                                             while i <= 50:
                                                 buffer = file.read(1)
                                                 if ord(buffer) == 0 and
                        headerName == "":
                                                     nameSize =
                        file.tell() - headerStart

                        file.seek(0-nameSize, 1)
                                                     headerName =
                        file.read(nameSize)[0:-1]
                                                 elif ord(buffer) == 0
                        and headerType == "":
                                                     nameSize =
                        file.tell() -
                                     len(headerName) - 1 - headerStart

                        file.seek(0-nameSize, 1)
                                                     headerType =
                        file.read(nameSize)[0:-1]
                                                     headerSize =
                        struct.unpack("i4",
                                     file.read(4))[0]
                                                     if headerName ==
                        "compression":
                                                         compression =
                        file.read(1)
                                                     else:

                        file.seek(headerSize, 1)
                                                     if headerName ==
                        "screenWindowWidth":
                                                         loop = False
                                                     break
                                                 if i == 50 or
                        headerStart > 1024:
                                                     loop = False
                                                 i=+1


                        print(compressionTypes[ord(__compression)])


                        ##############################__###############

                                     Best Regards
                                     Jimmy Christensen
                                     Developer
                                     Ghost A/S


                                     On 23/05/12 01:28, 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
                                    
<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]
                                    <mailto:[email protected]>
                                    <mailto:[email protected]
                                    <mailto:[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
                                        <tel:%28248%29%20840-2665>
                                        <tel:%28248%29%20840-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].__co.uk 
<mailto:[email protected]>

                                    
<mailto:Nuke-users@support.__thefoundry.co.uk
                                    
<mailto:[email protected]>>,
                                    http://forums.thefoundry.co.__uk/
                                    <http://forums.thefoundry.co.uk/>
                                    
http://support.thefoundry.co.__uk/cgi-bin/mailman/listinfo/__nuke-users
                                    
<http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users>



                                
_________________________________________________
                                             Nuke-users mailing list
                                [email protected].__co.uk
                                <mailto:[email protected]>

                                <mailto:Nuke-users@support.__thefoundry.co.uk
                                <mailto:[email protected]>>,
                                http://forums.thefoundry.co.__uk/
                                <http://forums.thefoundry.co.uk/>
                                
http://support.thefoundry.co.__uk/cgi-bin/mailman/listinfo/__nuke-users
                                
<http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users>



                            _________________________________________________
                                         Nuke-users mailing list
                            [email protected].__co.uk
                            <mailto:[email protected]>

                            <mailto:Nuke-users@support.__thefoundry.co.uk 
<mailto:[email protected]>>,
                            http://forums.thefoundry.co.__uk/
                            <http://forums.thefoundry.co.uk/>
                            
http://support.thefoundry.co.__uk/cgi-bin/mailman/listinfo/__nuke-users
                            
<http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users>



                        _________________________________________________
                                     Nuke-users mailing list
                        [email protected].__co.uk
                        <mailto:[email protected]>

                        <mailto:Nuke-users@support.__thefoundry.co.uk
                        <mailto:[email protected]>>,
                        http://forums.thefoundry.co.__uk/
                        <http://forums.thefoundry.co.uk/>
                        
http://support.thefoundry.co.__uk/cgi-bin/mailman/listinfo/__nuke-users
                        
<http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users>



                    _________________________________________________
                                 Nuke-users mailing list
                    [email protected].__co.uk
                    <mailto:[email protected]>

                    <mailto:Nuke-users@support.__thefoundry.co.uk
                    <mailto:[email protected]>>,
                    http://forums.thefoundry.co.__uk/
                    <http://forums.thefoundry.co.uk/>
                    
http://support.thefoundry.co.__uk/cgi-bin/mailman/listinfo/__nuke-users
                    
<http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users>



                _________________________________________________
                             Nuke-users mailing list
                [email protected].__co.uk
                <mailto:[email protected]>

                <mailto:Nuke-users@support.__thefoundry.co.uk
                <mailto:[email protected]>>,
                http://forums.thefoundry.co.__uk/
                <http://forums.thefoundry.co.uk/>
                
http://support.thefoundry.co.__uk/cgi-bin/mailman/listinfo/__nuke-users
                
<http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users>



                         _________________________________________________
                         Nuke-users mailing list
            [email protected].__co.uk
            <mailto:[email protected]>
                         <mailto:Nuke-users@support.__thefoundry.co.uk
            <mailto:[email protected]>>,

            http://forums.thefoundry.co.__uk/
            <http://forums.thefoundry.co.uk/>
            
http://support.thefoundry.co.__uk/cgi-bin/mailman/listinfo/__nuke-users
            
<http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users>



                 _________________________________________________
                 Nuke-users mailing list
            [email protected].__co.uk
            <mailto:[email protected]>
                 <mailto:Nuke-users@support.__thefoundry.co.uk
            <mailto:[email protected]>>,
            http://forums.thefoundry.co.__uk/
            <http://forums.thefoundry.co.uk/>
            
http://support.thefoundry.co.__uk/cgi-bin/mailman/listinfo/__nuke-users
            
<http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users>



             _________________________________________________
             Nuke-users mailing list
        [email protected].__co.uk
        <mailto:[email protected]>
             <mailto:Nuke-users@support.__thefoundry.co.uk
        <mailto:[email protected]>>,
        http://forums.thefoundry.co.__uk/ <http://forums.thefoundry.co.uk/>
        http://support.thefoundry.co.__uk/cgi-bin/mailman/listinfo/__nuke-users
        <http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users>




        This body part will be downloaded on demand.

    _________________________________________________
    Nuke-users mailing list
    [email protected].__co.uk
    <mailto:[email protected]>,
    http://forums.thefoundry.co.__uk/ <http://forums.thefoundry.co.uk/>
    http://support.thefoundry.co.__uk/cgi-bin/mailman/listinfo/__nuke-users
    <http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users>




This body part will be downloaded on demand.

_______________________________________________
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