Image data containers [SOLVED]



  • On 10/02/2017 at 02:43, xxxxxxxx wrote:

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

    ---------
    Hi all,

    could one of the fine folk here please provide an example of how we can set bitmap image data for proper 32bit images? Something like this (but in 32bit data land!) would help:

    // psuedo code
      
    void MyDialog::GetImageData(int width,int height,BaseBitmap* bmp)
    {
        UCHAR *img = gNew UCHAR[width*height*3];
    	
        // set one pixel to grey
        img[7*14 + 36 + 0] = 128; // R
        img[7*14 + 36 + 1] = 128; // G
        img[7*14 + 36 + 2] = 128; // B
      
        for(int h = 0; h < height;)
        {
            bmp->SetPixelCnt(o,h,width,(UCHAR* )img[h * width],COLORBYTES_RGB,COLORMODE_RGB,PIXELCNT_0);
      
            h++;
        }
      
        // free container etc.
    }
    

    Also, could they clarify what data range the image data should be in? E.g. 0.0 - 1.0 or 0 - 4294967295.

    Cheers,

    WP.



  • On 13/02/2017 at 09:00, xxxxxxxx wrote:

    Hello,

    32-bit image data is stored as Float32 data:

      
    AutoAlloc<BaseBitmap> bitmap;  
    if (!bitmap)  
      return false;  
      
    // define bitmap dimensions and bit depth  
    const Int32 width  = 1024;  
    const Int32 height = 1024;  
    const Int32 pixelBytes = COLORBYTES_RGBf; // RGBf format  
    const Int32 pixelBits  = pixelBytes * 8;  
      
    // initialize the BaseBitmap with the given dimensions and bit depth  
    const IMAGERESULT res = bitmap->Init(width, height, pixelBits);  
    if (res != IMAGERESULT_OK)  
      return false;  
      
    // allocate memory for one line  
    const Int32 bufferSize = width * 3;  
    PIX_F*      lineBuffer = NewMemClear(PIX_F, bufferSize);  
    if (!lineBuffer)  
      return false;  
      
    // loop through all lines  
    for (Int32 y = 0; y <= height; ++y)  
    {  
      // shade of red based on the position  
      const Float32 red = Float32(y) / Float32(height);  
      
      Int32 offset = 0;  
      for (Int32 x = 0; x < width; ++x)  
      {  
      // shade of green based on the position  
      const Float32 green = Float32(x) / Float32(width);  
      
      // fill buffer  
      lineBuffer[offset] = red;  
      lineBuffer[offset + 1] = green;  
      lineBuffer[offset + 2] = 0.0;  
      
      offset += 3;  
      }  
      
      // write full line into the bitmap  
      bitmap->SetPixelCnt(0, y, width, (UChar* )lineBuffer, pixelBytes, COLORMODE_RGBf, PIXELCNT_0);  
    }  
      
    // delete line memory  
    DeleteMem(lineBuffer);  
    

    best wishes,
    Sebastian



  • On 14/02/2017 at 02:27, xxxxxxxx wrote:

    Thanks Sebastian - that's got it working 👍

    WP.


Log in to reply