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
    • Recent
    • Tags
    • Users
    • Login

    saving pngs with BaseBitmap Save

    Scheduled Pinned Locked Moved SDK Help
    2 Posts 0 Posters 188 Views
    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 Offline
      Helper
      last edited by

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 11/07/2011 at 07:35, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   12 
      Platform:   Windows  ;   
      Language(s) :     C++  ;

      ---------
      I'm making a BitmapSaver plugin to save images along with metadata about the scene and it all works fine until alpha channels get involved. I'm just saving the png using the BaseBitmap class and I'm passing the savebits from the BitmapSaverData Save function. When I save an image with an alpha the BitmapSaverData Save function gets called twice, the first time writes a blank image, the second time writes and image with an A_ prefix but gives an "IMAGERESULT_WRONGTYPE" error.

      Here's my code such that it is minus all the metadata writing:

        
      IMAGERESULT PNGMetaSaverData::Save(const Filename &name;, BaseBitmap *bm, BaseContainer *data, SAVEBIT savebits)   
      {   
      IMAGERESULT result;   
      BaseBitmap *bmp = BaseBitmap::Alloc();   
        
      bmp = bm->GetClone();// cinema crashes if I don't use a clone   
        
      result = bmp->Save(name,FILTER_PNG,data,savebits);   
        
      BaseBitmap::Free(bmp);   
      return result;   
      }   
      

      I'm still very new to c++ and I'm learning as I go so it's quite possible I made a stupid c++ mistake.

      - Carter

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

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 02/08/2011 at 10:01, xxxxxxxx wrote:

        I finally got this working so I thought I'd post it in case anyone else ran into the issue. I'm still new to c++ so I apologize if there are any glaring bugs in this.

          
        IMAGERESULT result;   
             BaseBitmap *bmp = BaseBitmap::Alloc();   
             BaseBitmap *alpha;   
          
             LONG bw,bh;   
             UCHAR *line = NULL;   
                
             bw=bm->GetBw();   
             bh=bm->GetBh();   
                
             bmp->Init(bw,bh);   
          
             BaseContainer rdata = GetActiveDocument()->GetActiveRenderData()->GetData();   
             LONG x,y;   
          
             if(savebits & SAVEBIT_ALPHA)   
             {   
                  alpha = bmp->GetInternalChannel();   
                  if(!alpha)alpha = bmp->AddChannel(TRUE,rdata.GetBool(RDATA_STRAIGHTALPHA));   
          
                  // you have to copy the alpha over   
                  for(y=0; y<bh; y++)   
                  {   
                       for(x=0; x<bw; x++)   
                       {   
                             UWORD value = 0;   
                             bm->GetAlphaPixel(bm->GetChannelNum(0),x,y,&value;);   
                             bmp->SetAlphaPixel(alpha,x,y,value);   
                       }   
                  }   
             }// end of alpha check   
          
             // images with straight alpha require color conversion for some reason   
             ColorProfileConvert* converter = ColorProfileConvert::Alloc();   
             converter->PrepareTransform(COLORMODE_RGB,ColorProfile::GetDefaultLinearRGB(),COLORMODE_RGB,ColorProfile::GetDefaultSRGB(),false);   
          
             line = GeAllocType(UCHAR,3*bw);   
             if (!line)   
             {   
                  GeFree(line);   
                  return IMAGERESULT_OUTOFMEMORY;   
             }   
          
             // copy the image   
             for (y=0; y<bh; y++)   
             {   
                  bm->GetPixelCnt(0,y,bw,line,COLORBYTES_RGB,COLORMODE_RGB,PIXELCNT_0,converter);   
                  bmp->SetPixelCnt(0,y,bw,line,COLORBYTES_RGB,COLORMODE_RGB,PIXELCNT_0);   
             }   
          
             GeFree(line);   
             ColorProfileConvert::Free(converter);   
          
             result = bmp->Save(name,FILTER_PNG,data,savebits);   
          
          
             BaseBitmap::Free(bmp);   
          
          
             return result;   
        
        1 Reply Last reply Reply Quote 0
        • First post
          Last post