Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    How to use Python to generate a bitmap with layer?

    PYTHON Development
    0
    8
    827
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      On 14/05/2015 at 15:10, xxxxxxxx wrote:

      Hi,

      I try to write an plugin that split a image into a image with layer.
      Each color (material id's) get it own layer.
      The layer are convert to use for alphamaps in c4d material.

      I can initialize a bitmap from a file.
      But it is BaseBitmap.

      I try to use MultipassBitmap.
      Now I can create a new empty layer.

      But I cant set Pixel at the empty layer.

      How can I set pixel to a layer?

        
      import c4d   
      import os   
      from c4d import bitmaps, gui, storage   
        
        
      def main() :   
        
          doc = c4d.documents.GetActiveDocument()   
          op = doc.GetActiveObject()   
          path = storage.LoadDialog(type=c4d.FILESELECTTYPE_IMAGES, title="Please Choose the PolyPaint Image")   
          if not path: return   
        
          # Create and initialize selected image   
          orig = bitmaps.BaseBitmap()   
          if orig.InitWith(path)[0] != c4d.IMAGERESULT_OK:   
              gui.MessageDialog("Cannot load image \"" + path + "\".")   
              return   
        
        
          # Get selected image infos   
          width, height = orig.GetSize()   
          bits = orig.GetBt()   
        
          # Create the copy and initialize it   
          copy = bitmaps.BaseBitmap()   
          copy.Init(width, height, bits)   
          multibmp = bitmaps.MultipassBitmap.AllocWrapper(copy)   
        
          layer_a = multibmp.AddLayer(multibmp.GetLayers(c4d.MPB_GETLAYERS_0),1)   
        
          # ColorPalette Variable vorbereiten   
          ColPal = [0,0]   
          cc = 0 # Zähler auf 0   
          while cc < 512: # ColorPalette 512 Einträge mit 0 füllen   
              ColPal.append(0)   
              cc = cc + 1   
                
          wy = 0   
          while wy < height: # Bildzeilen durchlaufen   
              wx = 0      
              while wx < width: # Bildpunkte der Zeile durchlaufen   
                  readcol = orig.GetPixel(wx,wy) # Pixel als Farb-Vector auslesen   
                  farbanzahl = 6               # In wie viele Farben aufteilen?   
                  farbdivid = 256 * 3 / farbanzahl # Bit + Anzahl Farbkanäle geteilt durch die Farbanzahl = Divisor   
                  # Farbkanäle runter rechnen   
                  r=int(readcol[0]/farbdivid)   
                  g=int(readcol[1]/farbdivid)   
                  b=int(readcol[2]/farbdivid)   
                  # reduzierte Farben in neue Bitmap eintragen   
                  copy.SetPixel(wx,wy,r*farbdivid,g*farbdivid,b*farbdivid)   
                  multibmp.SetPixel(wx,wy,r*farbdivid,g*farbdivid,b*farbdivid)   
                  layer_a.SetPixel(wx,wy,r*farbdivid,g*farbdivid,b*farbdivid)   
                     
                  ColPal[r*g*b] = [r,g,b] # ColorPalette (512 mögliche Farben) mit Wert füllen   
        
                  wx = wx +1 # Zeile +1   
              wy = wy + 1 # Spalte +1   
             
             
             
          bitmaps.ShowBitmap(orig) # Show original   
          bitmaps.ShowBitmap(copy) # Show copied image   
          bitmaps.ShowBitmap(multibmp) # Show copied image   
        
          # Einträge auswerten und anzeigen   
          ccc = 0   
          for element in ColPal:   
             if element > [0,0,0]:   
                  print element   
                  ccc = ccc + 1   
          print ccc   
             
          print layer_a   
          print multibmp   
        
      if __name__=='__main__':   
          main()   
      

      This is my code for loading an image.
      Reduce the colors and write to a new bitmap.
      And I create a multipass bitmap for test to create a layer.

      Maybe, later I want to use OpenCV or PIL library for better convert the image.

      Bernd

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 18/05/2015 at 02:51, xxxxxxxx wrote:

        Hello,

        it seems that a MultipassBitmap layer can only be accessed through GetPixelCnt() / SetPixelCnt(), you you have to setup a ByteSeq:

          
        mp = c4d.bitmaps.MultipassBitmap(200,200,c4d.COLORMODE_RGB)  
          
        newlayer = mp.AddLayer(None,c4d.COLORMODE_RGB)  
        newlayer.SetParameter(c4d.MPBTYPE_NAME,"the new layer")  
          
        sq = c4d.storage.ByteSeq(None, 3)  
          
        for x in xrange(200) :  
             for y in xrange(200) :  
                       
                      # set the pixel to 255/128/0  
                        
                      sq[0] = chr(255)  
                      sq[1] = chr(128)  
                      sq[2] = chr(0)  
                        
                      newlayer.SetPixelCnt(x,y,1,sq.GetOffset(0),3,c4d.COLORMODE_RGB,c4d.PIXELCNT_0)  
          
        saveImagePath = c4d.storage.SaveDialog(c4d.FILESELECTTYPE_IMAGES,"Save as TIFF")  
        mp.Save(saveImagePath,c4d.FILTER_TIF,None,c4d.SAVEBIT_MULTILAYER)  
        

        best wishes,
        Sebastian

        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          On 29/05/2015 at 07:43, xxxxxxxx wrote:

          Hello Bernd,

          was your question answered?

          Best wishes,
          Sebastian

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            On 04/06/2015 at 10:55, xxxxxxxx wrote:

            Hi Sebastian 🙂

            thank you after I try to develope the app I make a pause.
            I have read you answer - very best thanks!!!

            I will try it later 😉
            Today I try another start to develope python script.

            Maybe some days later I will answer the code can help, or not.
            Thank you again, I don't forgot to post it later 😉

            1 Reply Last reply Reply Quote 0
            • H
              Helper
              last edited by

              On 10/06/2015 at 16:52, xxxxxxxx wrote:

              Looks good, but there is a problem:
              if I save as tif it will be very good!!!
              I open in Photoshop and there are the layers i can create now 🙂

              But when I open the mp (bitmap) in the picture viewer it only show one layer!

                
                
              mp = c4d.bitmaps.MultipassBitmap(200,200,c4d.COLORMODE_RGB|c4d.COLORMODE_ALPHA)   
              newlayer = mp.AddLayer(None,c4d.COLORMODE_RGB)   
              newlayer.SetParameter(c4d.MPBTYPE_NAME,"the new layer")   
                     
              sq = c4d.storage.ByteSeq(None, 3)   
                
              for x in xrange(200) :   
                  for y in xrange(200) :   
                               
                  #set the pixel to 255/128/0   
                               
                  sq[0] = chr(255)   
                  sq[1] = chr(128)   
                  sq[2] = chr(0)   
                               
              # write pixel            newlayer.SetPixelCnt(x,y,1,sq.GetOffset(0),3,c4d.COLORMODE_RGB,c4d.PIXELCNT_0)   
                
                
                
              # a second layer   
              newlayerA = mp.AddLayer(None,c4d.COLORMODE_ALPHA)   
              newlayerA.SetParameter(c4d.MPBTYPE_NAME,"the new layer2")   
                     
              sqA = c4d.storage.ByteSeq(None, 3)   
                
              for x in xrange(200) :   
                  for y in xrange(200) :   
                               
                  #set the pixel to 255/128/0   
                               
                  sqA[0] = chr(255)   
                  sqA[1] = chr(128)   
                  sqA[2] = chr(255)   
                               
                          newlayerA.SetPixelCnt(x,y,1,sqA.GetOffset(0),3,c4d.COLORMODE_ALPHA,c4d.PIXELCNT_0)   
                
                     
                     
              saveImagePath = c4d.storage.SaveDialog(c4d.FILESELECTTYPE_IMAGES,"Save as TIFF")   
              mp.Save(saveImagePath,c4d.FILTER_TIF,None,c4d.SAVEBIT_MULTILAYER)   
              bitmaps.ShowBitmap(mp)   
              
              1 Reply Last reply Reply Quote 0
              • H
                Helper
                last edited by

                On 10/06/2015 at 17:05, xxxxxxxx wrote:

                Photoshop:

                Picture Viewer in C4D:

                1 Reply Last reply Reply Quote 0
                • H
                  Helper
                  last edited by

                  On 11/06/2015 at 01:05, xxxxxxxx wrote:

                  Hello,

                  a layer only appears in the Picture Viewer if the MPBTYPE_SHOW parameter is set to true. See also this thread: "Bake texture and MultipassBitMap".

                  Best wishes,
                  Sebastian

                  1 Reply Last reply Reply Quote 0
                  • H
                    Helper
                    last edited by

                    On 11/06/2015 at 03:29, xxxxxxxx wrote:

                    Thank you very much

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post