Universitat Oberta de Catalunya

Manipulación de bitmaps I

La manipulación de los mapas de bits se ha convertido en un campo de trabajo muy interesante en la informática actual. Esta manipulación es posible en 3DStudio en el nivel más bajo mediante la programación con MAXScript. En la siguiente serie de artículos se darán los primeros pasos en el tratamiento de los mapas de bits utilizando unos conocimientos básicos de programación y unas pocas matemáticas, también básicas.

El objeto bitmap

El tratamiento de los mapas de bits se realiza mediante los objetos de la clase Bitmap de MAXScript. Esta clase, como todas las del lenguaje, dispone de sus propios constructores, de sus propiedades y como no, de sus métodos.

Empezaremos viendo uno de los constructores de la clase Bitmap, openBitMap. Este constructor es el encargado de abrir un mapa de bits existente. De esta forma se le tiene que pasar como argumento la ruta del mapa de bits sobre el que se trabajará. La sintaxis quedará de la siguiente forma:

mimapa = openBitMap “C:\\GMMD\\mapa.bmp”

Una observación sobre la sintaxis del constructor:

  • Las barras invertidas en MAXScript se tienen que duplicar cuando representen una ruta a un archivo.

Además el lenguaje dispone de otro constructor que crea un mapa de bits vacío, Bitmap. Este constructor necesita dos parámetros iniciales: la altura y la amplitud del mapa. Por ejemplo, a continuación se crea un mapa de bits de 80 x 80 píxels de la siguiente forma:

mimapa2 = Bitmap 80 80

Una vez visto como se asigna un mapa de bits a una variable del entorno de programación, se verán unas propiedades básicas de la clase Bitmap:

  • el nombre del fichero: filename.
  • la anchura: width.
  • la altura: height.

Si se tiene abierto un Bitmap y asignado a la variable mimapa, se accede a estas propiedades con la siguiente sintaxis:

  • nombremapa = mimapa.filename
  • anchumapa = mimapa.width
  • altumapa = mimapa.height

Ahora las tres nuevas variable almacenan el nombre, la altura y la anchura del Bitmap. Existe una diferencia entre la primera propiedad y las dos siguientes, filename es una propiedad que permite la lectura y la escritura. Esto significa que se puede modificar el nombre del mapa, de hecho la ruta completa. Sin embargo, tanto width como height, son propiedades de solo lectura y por tanto solo se puede acceder a su valor, pero no es posible modificarlo.

Por ejemplo, para asignar un nombre a mimapa2 creado anteriormente se utilizará la siguiente sintaxis:

mimapa2.filename = “C:\\GMMD\\mapa2.bmp”

En este punto del artículo se ha abierto un Bitmap y se han visto tres propiedades de este, pero todavía no se ha visualizado. Para esta función la clase de Bitmap, posee dos métodos:

  • uno para abrir el Bitmap en el buffer de cuadro virtual: display.
  • otro para cerrar este: undisplay.

La sintaxis de los métodos es distinta de la utilizada en las propiedades. En los métodos se escribe primero el método y a continuación el objeto al cual hace referencia:

  • display mimapa
  • undisplay mimapa

Pero no son estos los dos únicos métodos de la clase Bitmap, es posible guardar un Bitmap con el método save, copiarlo en otro Bitmap con copy y, lo que es imprescindible, cerrarlo una vez terminado el trabajo sobre este con el método close.

La sintaxis de estos métodos es la siguiente:

  • save mimapa
  • copy mimapa mimapa2
  • close mimapa

Solo una observación, en el método copy mimapa2 tiene que ser otro Bitmap previamente creado.

Hasta ahora se ha abierto un mapa de bits, cambiado su nombre, visualizado y cerrado, pero todavía no se ha trabajado con los valores del mapa de bits, es decir con los valores de cada píxel. De hecho la manipulación de estos valores es lo que hace tan potente el MAXScript en el tratamiento de los mapas de bits.

Los métodos responsables de esta manipulación de los pixeles son: getPixels y setPixels. De estos dos se va a estudiar en este artículo el primero. Estos métodos facilitan por un lado los valores que caracterizan el color de cada píxel, getPixels, y por otro lado la modificación de estos valores, setPixels. Un primer ejemplo muy simple:

primerpixel = getPixels mimapa [0,0] 1

Aquí primerpixel referencia un vector de objetos de la clase Color. Este objeto Color almacena los valores RGB de cada píxel. Por tanto, es posible acceder y lo que es mas importante, modificar cada valor RGB con las propiedades red, green y blue de la clase Color (normalmente utilizando las abreviaciones r, g y b).

Las coordenadas [0,0] del método getPixels representan el primer píxel de la matriz de Bitmap, de esta forma el comando anterior nos devuelve los valores RGB del píxel superior izquierdo. El segundo parámetro indica el número de pixeles de la fila que queremos leer a partir del [0,0], es decir, getPixels puede devolver todos los valores RGB de una fila de la matriz del Bitmap, pero nunca de dos filas distintas.

siguientespixels = getPixels mimapa [0,0] mimapa.width

Aquí siguientespixels devuelve un vector de objetos del tipo Color, con los valores RGB de cada pixel de la primera fila.

En los siguientes artículos se utilizarán las estructuras de control de flujo disponibles en MAXScript, con estas se realizarán recorridos por el mapa de bits, píxel a píxel. Se tratarán los valores RGB con las propiedades red, green y blue de los pixeles obtenidos con getPixels. Y a continuación se asignarán estos valores modificados al mapa de bits con el método setpixels. La modificación de estos mapas puede tener objetivos muy variados, entre la aplicación de filtros gráficos hasta la encriptación de la imagen.