bitmap.GetPixel / SetPixel

On 10/08/2017 at 09:41, xxxxxxxx wrote:

I'm confused from the documentation:

How do you get/set the pixel value of a GRAYSCALE image (i.e. one created with a color mode of c4d.COLORBYTES_GRAYf).

bitmap.GetPixel(x,y) returns a tuple of R, G, B, not a float
bitmap.SetPixel(x,y,r,g,b) doesn't allow for providing a float

Are there float versions of Get/SetPixel?

On 10/08/2017 at 10:22, xxxxxxxx wrote:

A grayscale is basicly a vector with the 3 same component.

You can decompose a color where each component can be understand as a value from 0 to 255 (where 0 red is no red and 255 red is full red for exemple) so if you want to convert them in color space of c4d (c4d oftenly use vector from 0 for no color and 1 for the full color) so with those functions you can have everything you need

import c4d
  
def rgb_to_vector(data) :
    rgbv = c4d.Vector(data[0], data[1], data[2])
    return rgbv ^ c4d.Vector(1.0 / 255.0)
  
def vector_to_rgb(vector) :
    return vector ^ c4d.Vector(255.0)
  
def main() :
    vector = rgb_to_vector(bmp.GetPixel(0,0))
    print vector
    rgb = vector_to_rgb(vector)
    print rgb
  
if __name__=='__main__':
    main()

Hope it make more sense

On 10/08/2017 at 12:27, xxxxxxxx wrote:

So, I guess what you're basically saying is that r, g, b for Set and GetPixel will accept/return floats :).
Problem is: The documentation clearly states that the three color components are INT with values from 0-255 (so basically a BYTE type). Assuming all of these are the same for gray values, you would basically end up with a maximum number of 256 gray values. This is obviously NOT correct...

On 10/08/2017 at 12:48, xxxxxxxx wrote:

Originally posted by xxxxxxxx

So, I guess what you're basically saying is that r, g, b for Set and GetPixel will accept/return floats :).

I never told that but I agree I should be more clear.

I provided you functions to convert vector returned from 99% of color returned by c4d. Wich are normalized vector. But GetPixel/SetPixel didn't fit this rules. They return raw RGB data wich are as you said 3 INT with a range from 0 to 255 and where thoses 3 INT correspond in the respectif order to the Red channel, green one and blue one.

This method (to use 0/255 range for each channel) is oftently used for describe color. And yes you only get 256gray value and that end's up with a 8bit picture. If you want to deal with more than 8bit picture I suggest you to read https://github.com/PluginCafe/cinema4d_py_sdk/blob/master/scripts/Copy32BitImage.py wich basicly use SetPixelCnt for setting pixel.

On 10/08/2017 at 12:58, xxxxxxxx wrote:

Ah, thx! Good pointer with the SetPixelCnt. I'll give it a shot.

On 11/08/2017 at 08:08, xxxxxxxx wrote:

Hi,

the C++ docs have a manual about BaseBitmap, maybe the code snippet on Pixel Data might help future readers of this thread.