Site Tools


Convert Colors to Grayscales

Developer: RhinoScript
Summary: Demonstrates how to convert an RGB color value to grayscale.

Question

I would like to convert all of the layers in a document from color to grayscale. Is there a way I can do this with RhinoScript?

Answer

To convert any color to a grayscale representation of its luminance, first one must obtain the values of its red, green, and blue (RGB) primaries in linear intensity encoding, by gamma expansion. Then, add together 30% of the red value, 59% of the green value, and 11% of the blue value. The resultant number is the desired linear luminance value; it typically needs to be gamma compressed to get back to a conventional grayscale representation.

Example

The following example demonstrates the above algorithm.

Option Explicit
 
Sub ConvertLayersToGrayscale()
 
  ' Declare local variables
  Dim arrLayers, strLayer, lngColor
  Dim nGray, nRed, nGreen, nBlue
 
  ' Turn off screen redrawing (for performance)
  Call Rhino.EnableRedraw(False)
 
  ' Get all of the layers in the document
  arrLayers = Rhino.LayerNames
 
  ' Process each layer one-by-one
  For Each strLayer In arrLayers
 
    ' Get the layer's color
    lngColor = Rhino.LayerColor(strLayer)
 
    ' Get the color's red-green-blue components
    nRed = Rhino.ColorRedValue(lngColor)
    nGreen = Rhino.ColorGreenValue(lngColor)
    nBlue = Rhino.ColorBlueValue(lngColor)
 
    ' Calculate the grayscale based on the NTSC color gamut
    nGray = CByte(nRed * 0.30) + CByte(nGreen * 0.59) + CByte(nBlue * 0.11)
 
    ' Modify the layer's color
    Call Rhino.LayerColor(strlayer, RGB(nGray, nGray, nGray))
 
  Next
 
  ' Turn on screen redrawing
  Call Rhino.EnableRedraw(True)
 
End Sub


developer/scriptsamples/grayscale.txt ยท Last modified: 2010/05/12 by dale