Você está na página 1de 21

Captulo 9

Descubriendo las Posibilidades

Resumen del captulo


El propsito de este captulo es ms ambiciosa que la mayora. A pesar de que IDL es una lenguaje de programacin, es imposible de encontrar en cualquier parte documentacin IDL oficial de cmo escribir un programa IDL. No pretendo sugerir que hay una sola manera correcta. Pero cualquiera que haya mirado por encima del hombro de tantos programadores de IDL como se sabe definitivamente hay una diferencia entre un buen programa IDL y uno que no es tan bueno. Como alguien que pasa mucho tiempo con personas que estn tratando de aprender IDL, por primera vez, veo un montn de programas not_so_good. Estoy convencido de que el problema es la falta de informacin. La mayora de las personas que usan IDL son, despus de todo, los cientficos, no los informticos. Ellos son brillantes y estn tratando de conseguir su trabajo. Ellos no estn tratando de escribir programas de ordenador elegantes. Pero, aun as... Si se siguiera slo un par de sencillos principios, sus programas seran mucho mejor y mucho ms tiles para ellos. Este captulo es un intento de especificar lo que estos principios podran ser, mientras que al mismo tiempo se muestra cmo montar y utilizar muchas de las tcnicas que se han discutido en este libro. La tarea que me he impuesto es mostrar cmo escribir un programa de razonable complejidad para mostrar grficas que se puede utilizar desde la lnea de comandos de IDL. Pero yo quiero escribir este programa de tal manera que la salida se puede visualizar en una ventana de grficos redimensionable, imprimirse directamente desde la lnea de comandos de IDL, o hecho en un Archivo PostScript con poco o ningn esfuerzo. El programa debe utilizar colores de una inteligente manera que no depende de la profundidad visual o color de estado de descomposicin y salida, por ltimo, debe ser simple para aadir una interfaz grfica de usuario para su programa, de modo que pueda ser utilizado por alguien no familiarizado con ella. La mayora de los programadores saben que la mejor manera de aprender a programar es mediante la comprensin del cdigo que se ha escrito por otros. Pero la mayora de las veces esto es una tarea de enormes proporciones, dado la general falta de documentacin en el cdigo y la ausencia de un mentor que puede explicar los elementos desconocidos del cdigo para usted. Mi propsito aqu no es slo para mostrarle cmo escribir un programa, sino para explicar por qu el programa est escrito en esa manera particular. La escritura de programas siempre implica hacer decisiones. Las decisiones que hacemos juegan un papel fundamental en la utilidad de este programa para nosotros, y lo fcil es mantener y ampliar el programa a travs del tiempo. En otras palabras, podemos hacer tiles ambas y las opciones non_helpful. Al final del captulo, usted debe ser bueno en su manera para comprender la distincin.

El Programa de Histolmage
El programa que quiero escribir se llamar HistoImage. Es muy simple. Ser mostrar una imagen con los ejes alrededor. Por encima de la imagen ser una barra de colores que se indicar los valores de la imagen. Y por encima de la barra de colores aparecer un histograma de los valores de los pxeles de la imagen. En otras palabras, el histograma muestra el nmero de pxeles en la imagen correspondiete a un valor de la imagen en particular. Usted ve una ilustracin de cmo el programa

aparecer en la Figura 94. La lista completa del cdigo fuente del programa se puede encontrar en la pgina 409 "Programa HistoImage". Y el archivo histoimage.pro esta entre los archivos de programa que ha descargado para su uso con este libro.

Figura 94: El programa HistoImage consta de histograma, una barra de colores, y una imagen rodeado de ejes.

Escribiendo la Declaracin de Definicin de Procedimiento


El programa HistoImage ser un procedimiento, para empezar por definir la declaracin de definicin de procedimiento. Aqu es donde todos los parmetros de posicin y las palabras clave son declarados. Una regla de oro para los parmetros es que cualquier parmetro requerido para el programa a ejecutar ser un parmetro de posicin, y todo lo dems parmetros sern palabras claves. Esto significa, por supuesto, que se tendr que definir valores por defecto para todos los parmetros mediante palabras clave. Tambin significa que rara vez se tienen en cuenta todos los parmetros claves que se necesitar cuando empiece la codificacin del programa. La mayora de las veces empiezo con algunas obvias y aadir otras cuando los necesite. Yo trato de dar a los usuarios mis programas con la mayor flexibilidad posible. En particular, me gusta darles tanto controlar lo que pueda sobre cmo las cosas se van a ver, ya que los usuarios casi siempre tienen un sentido de la esttica diferente que yo. As que casi siempre tienen palabras claves que permitir al usuario elegir colores.

Aqu est lo que la declaracin de definicin de procedimiento se parecer a:

PRO HistoImage, $ imagen, $ AxisColorName = axisColorName, $ BackColorName = backcolorName, $ Binsize = binsize, $ ColorTable=colortable, $ DataColorName = datacolorName, $ Depurar = debug, $ _Extra=extra, $ ImageColors=imagecolors, $ Max_Value=max_value, $ NoLoadCT=noloadct, $ XScale=xscale, $ YScale=yscale

El primer y nico parmetro posicional, imagen, son los datos de la imagen que se pasarn en el programa. Voy a tener que comprobar si se trata de un array 2D, ya que no tiene mucho sentido para calcular el histograma de una imagen 24_bit o 3D, pero lo har retrasar esto por un momento. Vers tres nombres "colores" en la lista de palabras clave: AxisColorName, BackColorName, y DataColorName. Estos sern los nombres de los colores a utilizar para los ejes y otras anotaciones, los antecedentes y los datos, respectivamente. Voy a usar nombres de los colores de estos, porque uno de mis objetivos para el programa es utilizar colores que sean independientes del estado de descomposicin del color o la profundidad de la pantalla. S que el programa GetColor. Que figura en el apartado en la pgina 87 "Obtencin de dispositivos independientes de Colores" tiene la capacidad de darme un color tal cual si le pregunto por uno de los 16 colores que conocen por sus nombres. Al permitir que el usuario seleccione sus colores propios, les doy un poco de control sobre cmo se ven las cosas en la pantalla. Tambin le permito al usuario especificar el nmero ndice de la tabla de colores con la palabra clave Colortable. Los datos de las imgenes se pueden ampliar en ndices cargados por la tabla de colores. Los Colores de las imgenes casi siempre presentan un dilema para m. Por un lado, tengo muchas ganas de ajustar los colores de la imagen de forma correcta, especialmente si estoy llamando este programa desde la Lnea de comandos de IDL. Pero por otro lado, a menudo prefiero que la manipulacin del color sea hecho fuera del cdigo del programa. Por ejemplo, en el programa de colores de imagen widget que son a menudo controladas por una herramienta cambiadora de color como XLoadCT o XColors. Carga una tabla de colores dentro de un programa de visualizacin de grficos a menudo interfieren con los colores que estn siendo manipulados en otros lugares. Me comprometo en este programa mediante la definicin de dos parmetros clave adicionales: NoLoadCT y ImageColors. NoLoadCT ser un indicador de que si se establece evitar que el programa se cargue la tabla de colores especificada por la palabra clave ColorTable. Es decir, voy a tener una manera de convertir la tabla de colores cargados desde fuera del programa, si esto es lo que yo quiero hacer. ImageColors ser una palabra de salida que me permita aprender desde fuera del programa la cantidad de colores deben ampliarse a los datos de la imagen. Esta informacin es esencial si voy a manejar los colores fuera del programa. (Aqu voy a cargar los colores de la imagen a partir de un vector ndice de color 0. Si no fuera el caso, tambin puede definir una palabra clave, por ejemplo BottomIndex, que indicara la parte inferior de los ndices de color de la imagen.) La palabra clave BinSize es una palabra clave que usa el comando Histogram. Usar el comando Histogram dentro de este programa para calcular el histograma y es posible que quiera el usuario ser capaz de configurar las propiedades de este comando. Tenga en cuenta que no proporciono todas las palabras clave que estn disponibles para Histogram, slo aquellos usuarios que quieran especficamente usuario manipularlo. Del mismo modo, la palabra clave es una

palabra clave Max_Value es una palabra clave del comando Plot y que a menudo se encuentran utilidad en los histogramas, por lo defino aqu. Es muy posible (sobre todo con el comando Plot) querer manipular las palabras claves Histogran, Plot o TVImage que no se definen aqu. Por ejemplo, puede querer diferentes ejes de anotaciones o marcas. Por esta razn, incluir una palabra clave _Extra, para tomar ventaja de la herencia de palabras claves, que se describe en el "Pasando Palabras Claves No Definidas de la Herencia de Palabras Clave" en la pgina 216. Hay dos palabras claves, XScaIe y YScale, que se utilizarn para definir el rango y escala de los ejes que rodean la imagen. Estas palabras claves de entrada sern matrices de dos elementos que definen la extensin mnima y mxima de los ejes. Por ltimo, hay una palabra clave Debug, que tengo la intencin de utilizar en la parte del controlador de errores del cdigo para forzar un rastreo del lugar donde se produjo el error. Normalmente a m no me gusta escribir errores en la ventana de registro de comandos a menos que el usuario solicite expresamente lo contrario. Utilizando una palabra clave Debug me da una manera fcil de depurar mi cdigo, sin que los usuarios no familiarizados se aterroricen con aterradoras largas lneas de texto de error.

Escribir el cdigo de control de errores


El siguiente paso para escribir un programa consiste en agregar un cdigo de control de errores. Como yo no tengo un montn de pensamiento para los tipos de errores que pueden ocurrir en el programa, y como yo s que los usuarios podrn descubrir los errores que no anticip, de todos modos, voy a escribir un propsito general para manejar el error de captura. (El controlador de errores Catch se describe en "La declaracin de capturas de control" en la pgina 230.). Puedes utilizar el programa ERROR_MESSAGE, que es uno de los programas que ha descargado para su uso con este libro y se describe en la pgina 234, porque quiero aprovechar su naturaleza de dispositivo independiente. ERROR_MESSAGE utiliza Dinlog_Message para informar del error si se est ejecutando en una salida del dispositivo compatible con widgets y Messages si el dispositivo no es compatible con widgets. ERROR_MESSAGE tambin puede proporcionar una buena informacin del rastreo de errores si es necesario. El cdigo es el siguiente:
Catch, theError if theError NE 0 then begin Catch, /Cancel ok = ERROR_MESSAGE(!Error_State.Msg + 'Returning ...', $ traceback = Keyword_Set(debug)) RETURN ENDIF

Tenga en cuenta que cancelo el controlador de errores de captura como el primer paso en la parte de control de errores del cdigo. Hago esto porque hago muchos errores de escritura durante el desarrollo y tienen a veces errores en mi cdigo de gestin de errores. Esto har que IDL haga un bucle infinito. Llame a esto una buena programacin defensiva si no puede pensar en una ms suave explicacin. Tenga en cuenta que estoy aadiendo un poco ms de informacin (la cadena de retorno) respecto al normal mensaje de error. Slo quiero que el usuario sepa lo que estoy haciendo con el error. Y fjense que la palabra clave Traceback est configurado para Error_Message slo si el usuario establece la palabra clave Debug cuando l o ella llaman

al programa HistoImage. Puesto que la palabra clave Debug o bien puede estar encendido o apagado, puse su valor con Keyword_Set, que slo devuelve un 0 1.

Comprobacin de los parmetros de posicin y de palabras claves


Inmediatamente despus de que el cdigo de control de errores, va el cdigo que comprueba todo los parmetros obligatorios y opcionales. La comprobacin resulta esencial (por lo menos para los parmetros de entrada) porque usted va a utilizar las variables en algn lugar del cdigo para seguir y no es posible usar variables no definidas en las expresiones IDL. (Mtodos para el control de parmetros de posicin y la palabra clave se discuten en "Escribiendo procedimientos en IDL" en la pgina 209.)

Comprobacin de la imagen de parmetro posicional


He mencionado antes que mi regla de oro es que cualquier parametro requerido es un parmetro de posicin, y cualquier parmetro opcional es un parmetro clave. Yo no puedo hacer mucho en un programa que calcula el histograma de una imagen y la muestra por encima de la imagen sin imagen. Por lo tanto, image debe ser el parmetro posicional requerido por el argumento. Pero yo nunca he sido una persona que se preocupaba mucho por reglas arbitrarias, y yo voy a elegir romper esto de inmediato por ser un poco ms amable con el usuario y que le permite a este parmetro posicional ser un parmetro opcional. Por qu? Porque no creo que los usuarios deben ser penalizados con demasiada dureza si no saben cmo utilizar un programa. Mi trabajo consiste en explicar a ellos. As que voy a seleccionar y utilizar una imagen para ellos. Si quieren otra imagen, se puede leer la documentacin del programa (quien escribi esto, no lo hizo) para ver cmo utilizar su propia imagen. El cdigo se ver as:
IF N_Element(image) EQ 0 THEN image=LoadData(7)

Tenga en cuenta que he usado N_Elemens para comprobar el parmetro de la imagen, en lugar de N_Params, se podra haber esperado que utilice un parmetro posicional. Hay que recordar que N_Elemens me dice si el parmetro imagen es definida o no, mientras que N_Params me cuenta el nmero de parmetros posicionales del procedimiento de llamada. (Consulte "Definicin de Parmetros opcionales u posicionales obligatorios "en la pgina 212 para obtener ms informacin.)Algunos usuarios inexpertos estn seguros de llamar al rograma HistoImage con un solo parmetro de posicin que es una variable no definida. Mediante el uso de N_Elements te informo de esta eventualidad. Si no se proporciona un parmetro de imagen, simplemente cargar los datos de elevacin mundiales establecidos con el programa LoadData que ha descargado para su uso con este libro. Ahora que tengo un parmetro de imagen, voy a comprobar para asegurarse de que es un array 2D, ya que es tambin un requisito para los datos del histograma para que tenga sentido. Puedo usar el comando Size con la palabra clave N_Dimensions configurado para determinar el nmero de dimensiones de la imagen. (Tenga en cuenta que la palabra clave N_Dirnensions para el comando Size es bastantemente reciente a la Introduccin del lenguaje de programacin IDL. Si est utilizando una versin de IDL posterior a IDL 5.2, se puede obtener la misma informacin del comando Size directamente. Ver su ayuda On_Line para ms detalles).
ndim = size(image,/N_Dimensions) if ndim NE 2 then $

Message,'2D Variable imagen requerida.',/NoName

El comando message ser un error, que ser manejada por mi Catch manejo de errores de cdigo. Tenga en cuenta que la palabra clave NoName se establece para evitar ERROR_MESSAGE que informe el nombre del programa de dos veces.

Comprobacin de parmetros de palabra claves


Ahora estoy listo para comprobar los parmetros de palabras claves opcionales. Reviso las dos palabras clave, BinSize y MAX_VALUE Estoy pensando en usar el histograma de la imagen en primer lugar. Espero la mayor parte de las imgenes utilizadas en este programa ser de bytes de datos, pero no se puede confiar en l para ser el caso. Tampoco quiero restringir al usuario los datos de imagen de bytes. Pero yo no quiero que el histograma se muestre en bytes, por ejemplo, datos flotantes de imagen en el mismo lugar. Por lo tanto, voy a usar 128 contenedores al menos que el usuario me diga algo diferente. Esto me dar una buen parecido grafico casi siempre. Voy a tener que calcular el tamao del bin apropiadamente para esto. El cdigo se ver as:
IF N_elementos(binsize) EQ 0 then begin range = Max(image) - Min(image) binsize = 2.0>(rango / 128.0) ENDIF IF N_Elementos(max_value) EQ 0 THEN max_value = 5000.0

El tamao de bin o biene ser 2, o ser el rango de datos de imagen dividido por 128, si esta ltima cifra es mayor. Estoy haciendo la suposicin aqu que yo no voy a tener datos de imagen de punto flotante, que oscila de 0,0 a 1,0, por ejemplo. Mi programa se ver mal con esos datos, pero las posibilidades parecen tan baja de este acontecimiento que estoy dispuesto a correr el riesgo. Y, de todos modos, si el usuario tienen datos de imagen de esa manera, que siempre podra especificar un tamao del bin adecuado para la visualizacin del histograma. Observe el uso del IDL "mayor que" (>). Este operador devuelve el mayor de los dos valores que se comparan. Tenga en cuenta, tambin, los parntesis alrededor del valor que quiere comparar a la derecha del operador. Sin los parntesis, 2.0 se comparara con el registro, y luego el valor that se divide por 128. No es lo que yo quiero para todos! Esto sucede debido a que el mayor operador tiene el mismo orden de precedencia como el operador de divisin. Este es un tipo comn de error en los programas de IDL. Otro error comn se produce dentro de los parntesis. Fjate que he hecho el nmero 128.0 un nmero de punto flotante mediante la adicin de un punto decimal en el nmero. Es posible caer fcilmente en el error de escribir este nmero como un nmero entero (por ejemplo, 128). Entonces, un byte o que los datos de imagen sean enteros, se divide un valor entero (el rango) por otro valor entero. Esto puede fcilmente darle un tamao bin coherente de 0. Un grave error. La palabra clave Max_Value se le asigna un valor de 5,000, un valor que funciona con la mayor parte de los datos de imagen de ejemplos se establece con la distribucion IDL. A continuacin, puede poner a prueba los valores de palabra clave XScaIe y YScale. Si stos no se suministran,utilizen las dimensiones de la imagen para los valores de la escala. Tambin voy aprobar para asegurarme que los valores de sean dos conjuntos de elementos. Si no es as, voy a difundir los mensajes de error. El cdigo se ver as:
S = Size(image,/Dimensions) IF N_Elements(xscale) EQ 0 THEN xscale = [0, S[0]]

IF N_Elements(xscale) NE 2 THEN $ Message,'XSCALE must be 2-elementos array', /noname IF N_Elements(ysca1e) EQ 0 THEN yscale = [0, S[1]] IF N_Elements(ysca1e) NE 2 THEN $ Message, 'YSCALE must be 2-elementos array', /noname

Fjese una nueva palabra clave para el comando Size aqu: Dimensions. A diferencia de la palabra clave N_Dimensions, devuelve el tamao con el nmero de dimensiones de su argumento, la palabra clave Dimensions devuelve un vector que contiene el tamao de cada una de sus dimensiones. En otras palabras, con una serie de imgenes 2D, voy a tener una matriz de dos elementos de tamao X y tamao Y para la imagen, respectivamente. Por ltimo, puedo comprobar la palabra clave Color. Porque quiero escribir un dispositivo de estado de descomposicin con cdigos independientes, voy a utilizar el programa de GetColor para especificar los colores de dibujo. (GetColor se discute en " Obtencin de Dispositivos Independientes de Colores "en la pgina 87.) GetColor" sabe "los nombres de los 16 colores de dibujo que utiliza con frecuencia y puede obtener esos colores para m de una forma independiente del dispositivo. (Puede fcilmente aadir ms colores a GetColor) revise las palabras clave como esto:
IF N_Elements(dataCo1orName) EQ 0 THEN $ dataColorName = 'Red' IF N_Elements(axisColorName) EQ 0 THEN $ axisColorName = 'Navy' IF N_Elements(backcolorName) EQ 0 THEN $ backcolorName = 'White'

Pude comprobar para asegurarse de que los nombres de los colores aprobados en el programa son las variables de cadena, pero GetColor va a hacer de todos modos. Y s que va a regresar al llamado del programa que lo llam. Por lo tanto, voy a ser capaz de atrapar a ese error en mi controlador de errores cuando se trata de volver de GetColor: Por lo tanto, no hay necesidad de comprobar si hay posibles errores aqu. Tenga en cuenta que yo hago el color de fondo blanco de forma predeterminada. Esto no es, sin duda necesario, y ms a menudo que no me gusta tener un color de fondo carbn o gris. Elijo blanco aqu, porque a veces es ms fcil de visualizar los resultados que va a parecer cuando hago un archivo PostScript desde este programa. Recuerde que usted puede tener cualquier color de fondo que le guste en PostScript, por mientras es de color blanco. (Este problema se discute en "Problema: Los dispositivos PostScript uso de fondo y Trazado de colores de forma diferente "en la pgina 189.) Lo ms importante es que necesito alguna manera de cambiar los colores de los dibujos, porque es casi seguro que tengo que cambiarlos al enviar el resultado a un Impresor de PostScript. Al hacer que los colores por defecto adecuados para la impresin en un archivo impresin PostScript, ahora no tendr que preocuparse acerca de cmo restablecer los colores. Voy a llamar al programa HistoImage para dibujar los grficos en sus colores por defecto cuando quiero hacer un archivo Postscript. Si el usuario no proporciona un nmero de ndice de la tabla de colores, elijo tabla de colores 4.
IF N_Elements(colortab1e) EQ 0 THEN colortable = 4 colortable = 0> colortable <40

Tenga en cuenta que slo hay 41 tablas de colores suministrados con IDL (aunque los usuarios podran modificar este nmero, por cierto). Aqu puede ver un poco de la comprobacin para forzar la tabla de colores valores entre un nmero entre 0 y 40.

En IDL el operadores mayor que y menor que se utilizan para forzar el rango correcto de los nmeros. (En otras palabras, 0 es comparado con tabla de colores y el valor ms grande es el de retorno. Entonces que valor se compara con 40 y el ms pequeo de los dos valores es devuelto en la variable de la tabla de colores.) Este tipo de comprobacin de errores proactivo puede evitar problemas ms adelante. A continuacin, le ofreceremos la palabra clave ImageColors con un valor. Tenga en cuenta que voy a usar tres colores de dibujo en este programa. Prefiero cargar mis colores dibujo en la parte superior de la tabla de colores, aunque otras personas prefieren para cargarlos en la parte inferior de la tabla de colores. No importa mucho donde se los carga, siempre y cuando usted sabe lo que est haciendo al manipular la tabla de colores. Pero si bien me gusta cargar colores de dibujo en la parte superior de la tabla de colores, no me gusta utilizar el nmero de ndice de la parte superior de la tabla de colores. La razn por la que no lo es que muy a menudo este ndice, se utiliza para la Variable del sistema !P.Color. Y muchos programas estn escritos asumiendo este color que va a ser blanco o negro. No me gusta romper estos programas, si puedo evitarlo. As que dejo este ndice solo. Cmo cargo mis tres colores de dibujo y el cuarto ndice de la parte superior. Esto significa que los ndices de color que tengo para los rangos de visualizacin de imgenes son desde 0 hasta el quinto ndice a partir de la parte superior de la tabla de colores. Esto es -4 colores en total !D.Table_Size . Esto es lo que Asigno la palabra clave ImageColors como valor en el programa.
imagecolors =!D.Table_Size -4

Tenga en cuenta que no tengo que comprobar la palabra clave output. Si el usuario desea que el valor de l o ella puede ser recuperado con palabras claves. Si ellos no quieren que el valor, bueno. Esto no le cuesta mucho para asignarlo a una variable. (Y yo necesito el valor ms adelante en el programa de todos modos) No hay necesidad de usar algo como Arg_Present en este caso:
IF Arg_Present(imageco1ors) THEN $ imagecolors =!D.Table_Size -4

Esto es un exceso y los resultados en la variable imagecolors slo estn definiendo si el usuario aprueba en una referencia de variables con la palabra clave. La construccin ms simple es mucho ms fcil de escribir y creo que hace que el programa sea ms fcil de leer, tambin. Recuerde que la variable imagecolors est diseado para ayudar a alguien fuera del programa de control de los colores de la imagen. No tengo ninguna necesidad en este momento, pero puedo usarlo ms tarde y quiero estar preparado para la eventualidad.

Cargando los colores del programa


Los tres colores de dibujo van a ser cargado a partir de la cuarto ndice en la parte superior de la tabla de colores. Yo siempre uso !DTableSize para indicar el tamao de la tabla de colores. Entonces !DTableSize es el ndice ms alto en la tabla de colores. El cdigo es el siguiente:
axiscolor = GetColor(axisColorName,!D.Table_Size-2) Datacolor = GetColor(dataColorName,!D.Table_Size-3) backcolor = GetColor(backcolorName,!D.Table_Size-4)

Las variables BackColor, dataColor, y axisColor ahora contienen el correcto nmero de ndice de color para la carga del color apropiados (si el dispositivo de descomposicin est apagado o si este es un dispositivo de 8 bits), o un valor de 24 bits que se pueden descomponer en el color

adecuados (Si este dispositivo de descomposicin est encendido). En cualquier caso, no tiene que preocuparse en absoluto sobre el estado actual de descomposicin del color de los grficos con estos colores. Los colores correctos van a aparecer de forma casi automtica. A continuacin se carga los colores para los datos de la imagen. Yo slo hago esto si la variable de la palabra clave NoLoadCT no se ha establecido.
IF NOT Keyword_Set(noloadct) THEN $ LoadCT, colortable, NColors=imagecolors, /Silent

Ntese que uso la palabra clave Silent al comando LondCT. Realmente no me gusta el mensaje informativo LondCT que imprime en la ventana de registro de comandos cada vez que se carga una tabla de colores. Esta palabra clave suprime el mensaje. Tenga en cuenta, tambin, que puedo restringir, con la palabra clave NColors, el nmero de colores cargados en los ndices utilizados por la imagen. Quiero tener cuidado de no sobre grabar los colores de dibujo que acabo de cargar. Slo los ndices de la tabla de colores cargados por este comando !D.Table_Size pueden ser de 0 a -5.

Preparacin para dibujar los grficos


El siguiente paso en la redaccin del programa de HistoImage es preparar los dibujos grficos. Yo tengo tres elementos separados para dibujar, el histograma, la barra del color y la imagen en s.

Clculo de posiciones en la ventana de grficos


As que lo primero que hago es calcular las posiciones de la ventana donde yo quiero que estos artculos pudan ir. Estas posiciones sern arrays de cuatro elementos que contiene la ventana de coordenadas normalizadas del tipo que se pueden utilizar con la palabra clave Position en la mayora de los comandos grficos. (Consulte "Colocacin de salida grfica en la ventana de visualizacin" en la pgina 44 para ms detalles de coordenadas normalizadas cmo se hace esto.) se utilizan para que los grficos puedan ir en una ventana de cualquier tamao. El cdigo se ver as:
histoPos =[0.15, colorbarPos=[0.15, imagePos =[0.15, 0.675, 0.500, 0.100, 0.95, 0.95, 0.95, 0.95] 0.55] 0.40]

Cambiando el tamao del carcter segn el tamao de la ventana


Uno de los requisitos de este programa es que puede mostrar sus grficos en la ventana de grficos redimensionado. O dicho de otra manera, que puede mostrar grficos en unas ventanas de cualquier tamao. En otras palabras, si la ventana es grande el histograma debe ser grande y la visualizacin de la imagen debe ser igual de grande. Si la ventana es pequea, la trama y la imagen en la pantalla deben ser pequeas, etc. Esto es realizado, obviamente, por la posicin de diversos componentes en la ventana de coordenadas normalizadas, como se describi anteriormente. Pero a menudo esta forma de pensar no nos lleva a la anotacin de las pantallas grficas. La mayora de los programadores utilizar un tamao de la fuente de 1 y lo llaman bueno. Pero si le gustara ver un gran tamao de los caracteres utilizados en las ventanas grandes y un tamao pequeo de caracteres utilizado en las pequeas ventanas. Una palabra clave que se puede utilizar es CharSize con los comandos grficos para cambiar el tamao de la fuente, pero cmo se puede hacer esto de una manera que sea consistente con el tamao de la ventana? La respuesta, al igual que muchas de las respuestas que han descubierto

hasta el momento, es expresar el tamao de los caracteres en unidades normalizadas. Por desgracia, esto es imposible en IDL. El tamao del carcter es siempre expresado en unidades de carcter. Pero aun as ... debe haber una manera! En realidad. Resulta que con el comando XYOutS puede obtener el width de una cadena de texto en unidades normalizadas. Y si utiliza un valor negative con la palabra clave CharSize, entonces XYOutS no ser realmente escrita como cadena para mostrase en la ventana, slo se calcula el ancho de la cadena. Por ejemplo, suponga que desea conocer el ancho de la cadena de texto "Una cadena de ejemplo". Usted puede escribir lo siguiente:
IDL> thisSize = -1 IDL> XYOutS, 0.5, 0.5, 'Una muestra cadena', /Normal, $

Width=thisWidth, Charsize=thisSize

Ahora, supongamos que compar el valor de thisWidth con cierta anchura de objetivo. Digamos, por ejemplo, que la anchura objetivo era 0,25. Otra forma de decir esto es que la cadena debe ser lo suficientemente amplia como para extenderse a travs de 25 por ciento de la ventana de visualizacin. Si el ancho del objetivo era mayor que el valor de thisWidth puede aumentar el tamao de la fuente en una pequea cantidad, y probar de nuevo, y as sucesivamente hasta que el tamao de la fuente sea adecuado para darle el ancho de texto que queras. El cdigo podra tener este aspecto:
IDL> IF thiswidth LT 0.25 THEN thissize = thissize + 0.01 IDL> XYOutS, 0,5, 0,5,'a simple string', /Normal, $

width = thisWidth, Charsize = thisSize

Finalmente, thisWidth pueda ser dentro de un pequeo valor delta de la anchura del objetivo. El algoritmo similar se puede emplear si thiswidth es mayor que la anchura del objeto. Este tipo de algoritmo ha sido desarrollado para que la forma del programa Str-Size descargado con los archivos de programa para utilizalo en este libro. El parmetros Str-Size son una cadena y un ancho de objetivo, en coordenadas normalizadas. Se encontro que la cadena "Una cadena de ejemplo" y un ancho blanco de 0,20 produce muy bien caracteres de tamao en la mayora de las parcelas en las ventanas de grficos que suelen utilizar.
IDL> ThisSize = Str_Size ('Una muestra String', 0.20)

Este es un tamao de carcter de aproximadamente 1,4 para una ventana de tamao normal en una mquina Windows, por ejemplo. En este programa, voy a escribir el tamao de la fuente del cdigo de seleccin de la siguiente manera:
ThisCharSize = Str_Size('Una muestra String', 0.20)

Clculo del histograma de la imagen


El siguiente paso es calcular el histograma de la imagen. (Recordemos que un histograma es simplemente un contador del nmero de entidades en cada bin del histograma. Normalmente, tomamos el nmero de pxeles con cada valor de la imagen.) Yo simplemente uso el comando Histogran, pasndole el tamao de bin que quiero usar, as:
histdata = histogram(imagen,Binsize=binsize, $ Min=Min(imagen), Max=Max(imagen))

Note que puse las palabras clave Min y Max explcitamente para la funcin Histogram a valor mnimo y mximo de la imagen. La documentacin IDL afirma que esto es la funcin Histogram por defecto, pero no he encontrado que este sea el caso. Ms bien, me parece que toma el valor mnimo de 0 y un valor mximo de 255 para imgenes bytes, independientemente de los valores de datos reales en la imagen.

Dibujar los grficos


Hay tres elementos grficos que desea dibujar: un histograma, un bar de color para que indican los valores de imagen, y la imagen misma.

Dibujar el histograma
IDL me da varias opciones para dibujar el histograma, pero me parece que no me gustan las dos ms obvias. Voy a explicar lo que quiero decir con un ejemplo sencillo para que pueda escribir en la lnea de comandos de IDL. Supongamos que tengo cinco contenedores de datos, cada bin en 5 unidades de tamao, y un vector que me dice cuntos "objetos" son en cada bin. Los datos y los vectores bins se podran crear como esto:
IDL> data = [4, 6, 3, 8, 2] IDL> bins = , [0, 5, 10, 15, 20]

El mtodo ms obvio es simplemente representar los datos con el comando Plot, de esta manera:
IDL> plot,bins,data,YRange=[0,10]

El resultado, que no se parece mucho a la definicin del comando plot "histograma", es ilustrado en la Figura 95.

Figura 95: Una trama muy simple de un funcion histograma. Teniendo en cuenta que no se ve igual que un histograma. El segundo enfoque es obvio para establecer la palabra clave PSym a 10, lo que resultar el tipo "escaln" de la trama que se espera de un histograma. Puedo probar esto:
IDL> Plot,bins,data,YRange=[0,10],PSym=10

Los resultados se ven mejor, como se muestra en la Figura 96, pero que todava no estn bien. En particular, los bins estn representados incorrectamente. La primera bandeja va de 0 a 5, el segundo bin desde 5 a 10, y as sucesivamente. Pero en la ilustracin, la primera bandeja parece ir de 0 a 2,5, y el segundo bin parece que van desde los 2,5 a 7,5, y as sucesivamente. Parece como si cada bin fuese medio tamao.

Figura 96: Esta parcela se parece ms a una parcela histograma, pero todava no est bien. Notar que los contenedores parecen ser de un tamao medio fuera de bin. Podra tratar de solucionar el problema mediante la adicin de un tamao medio bin a cada uno de los contenedores, as:
IDL> Plot,bins+2.5,data,YRange=[0,10],PSym=10

Ver los resultados en la Figura 97. De nuevo, est cerca de ser correcta, pero tengo problemas en cada extremo de la trama, donde las lneas deben extenderse hasta el final de la ventana grfica. Para dibujar realmente esta trama correctamente, debera duplicar los valores del primero y ltimo, de los datos del histograma y los valores de bin.

Figura 97: Esta parcela ha tenido la mitad de un tamao de bin aadido a los valores de ubicacin. Es preciso, pero las lneas de la trama no se extienden a los extremos de la ventana de dibujo

Por ejemplo, puedo hacer algo como esto:


Plot, [bins[0], bins + 2.5, bins[4] + 2.5 * 2], $ [data [0] , data, data [4]], YRange= [0,10], PSym=10

Por ltimo, tengo el tipo de histograma que espero, como se ilustra en la Figura 98.

Figura 98:. El histograma que esperaba conseguir Sera fcil y suficiente aadir lneas verticales con el comando PlotS para crear cajas de histograma para cada bin. Este es exactamente el tipo de enfoque que voy a tener en el programa HistoImage. El cdigo para esquivar los bins y el vectore histodata para tener un trazado correcto de esta manera:
npts = N_Elements(histdata) halfbinsize = binsize / 2.0 bins = Findgen(N_Elements(histdata)) * binsize + Min(image) binsToPlot = [bins[0] , bins + halfbinsize, $ bins [npts-1] + binsize] histdataToPlot = [histdata[0] , histdata, histdata [npts-1]] xrange = [Min(binsToPlot ) , Max(binsToPlot)]

El cdigo para trazar el diagrama de histograma en el color de eje, seguido de los datos del histograma dibujado en el color de los datos se ver as:
Plot, binsToPlot, histdataToPlot, $ Background=backColor, $ Charsize=thisCharsize, $ Color=axiscolor, $ Max_Value=max_value, $ NoData=1, $ Position=histoPos, $ Title='Irnage Histogram', $ XRange=xrange, $ XStyle=1, $ XTickformat= '(I6)' , $ XTitle='Image Value', $ YMinor=1, $ YRange= [0, max_value], $

YStyle=1, $ YTickformat= '(I6)', $ YTitle='Pixel Density', $ _Extra=extra OPlot, binsToPlot, histdataToPlot, PSym=10, Color=dataColor FOR j =1L,N_Elements(bins)-2 DO BEGIN Plots, Color=dataColor, [bins[j] , bins [j]] , $ [!Y.CRange[0], histdata[j] < max_value] ENDFOR

Tenga en cuenta que yo uso el comando PlotS para dibujar lneas verticales en cada lmite bin. Esto da el histograma en una caja que me guste ms asi que slo usar el histograma trazado con smbolo (Psym = 10) con el comando Plot. Me parece que al poner las palabras clave en orden alfabtico cuando yo uso un comando que requiere el establecimiento de un nmero de palabras clave de un estilo de utilidad. Esto hace que sea mucho ms fcil de ver las palabras claves que he fijado explcitamente. Esto ahorra tiempo y esfuerzo si tengo que aadir o eliminar una palabra clave ms adelante en el desarrollo del programa.

Dibujando la barra de colores


El dibujo de la barra de color es fcil. Yo simplemente uso el programa Colorbar descargado para el uso con este libro. Como TVImage (ver "Un alternativo comando para mostrar Imagenes" en la pgina 62), el programa de descomposicin Colorbar es independiente del dispositivo y se puede utilizar en cualquier dispositivo de grficos compatible con IDL. Los comandos se parecen a esto:
cbarRange = [Min(binsToPlot) , Max(binsToPlot)] Colorbar, $ Charsize=thisCharsize, $ Color=axisColor, $ Divisions=0, $ NColors=imagecolors, $ Position=colorbarPos, $ Range=cbarRange, $ XTicklen=-0.2, $ _Extra=extra

Observe que la barra de color se limita al mismo nmero de colores de la imagen, y que la gama de colores que se toma de la variable binsToPlot . Al establecer la palabra clave XTickLen a un valor negativo, produce hacia afuera marcas de graduacin. Ajuste la palabra clave Divisions a 0, permite que el programa para elija divisiones de anotacin de la misma manera que el comando plot. Esto har que el Colorbar sea una anotacin idntica a las anotaciones del histograma directamente por encima de ella y reforzar el propsito de las anotaciones.

Dibujo del diagrama de imagen


Todo lo que queda por hacer es dibujar la imagen, con sus ejes alrededor. Yo usare el comando TVImage para ver la imagen (vase "Un comando alternativo para mostrar Imagenes" en la pgina 62) y el comando plot para dibujar los ejes, utilizando los valores dados por las palabras claves XScale y Yscale como el rango de la parcela. El cdigo final se ver as:
TVImage, BytScl(image,Top=imagecolors-1), $ Position=imagePos, _Extra=extra PLOT, xscale, yscale, $

Charsize=thisCharsize, $ Color=axisColor, $ NoData=1, $ NoErase=1, $ Position=imagePos, $ XStyle=1, $ XTicklen=-0.025, $ YStyle=1, $ YTicklen=-0.025, $ _Extra=extra END

Tenga en cuenta que yo escalo los datos de la imagen en el nmero de colores de la imagen y que la posicin tanto la imagen y los ejes sobre la imagen con la variable imagePos.

Trabajar en un error de dispositivo de impresora


Hay un pequeo dispositivo Printer en las versiones de IDL a travs de IDL 5.3.1 (la versin oficial en el momento en que est escrito) que causa un problema cuando el cdigo es enviado directamente a una impresora PostScript. (Consulte "Carga de colores en el dispositivo de impresin" en la pgina 204 para obtener ms informacin.) Resulta que cuando se carga un solo color en la tabla de color (en este programa que se realiza con el comando GetColor ) en cualquier ndice en absoluto, entonces ese mismo color se utiliza para mostrar cualquier pxel de la imagen que tiene un valor de 0. (Se trata de un strage !). Por ejemplo, si escribe estos comandos, y su impresin por defecto es en una impresora PostScript (PCL parecen ser afectados), entonces es posible ver la salida que se parece a la ilustracin de la figura 99.
IDL> thisDevice = !D.Name IDL> Set_Plot, 'PRINTER' IDL> LoadCT, 0, NColors=!D.Table_Size-4 IDL> HistoImage, /NoLoadCT IDL> Device, /Close_Document IDL> Set_Plot, thisDevice

El trabajo en torno a este error, lo que har que el cdigo completo del dispositivo independiente, es simplemente llegar y volver a cargar los vectores de la tabla de colores despus de que el ltimo color solo se carga en la tabla de colores. En el cdigo HistoImage , busque esta lnea:
IF NOT Keyword_Set(noloadct) THEN $ LoadCT, colortable, NColors=imagecolors, /Silent

La lnea anterior debe ser reemplazada con este cdigo:


IF NOT Keyword_Set(no1oadct) THEN BEGIN LoadCT, colortable, NColors=imagecolors, /Silent ENDIF ELSE BEGIN IF !D.NAME EQ 'PRINTER' THEN BEGIN TVLCT, r, g, b, /Get TVLCT, r, g, b ENDIF ENDELSE

Esto har que los colores correctos se cargen cuando el programa se enva al dispositivo de impresin(printer).

Compilacin y prueba del programa


Para compilar y probar el programa, escriba lo siguiente:
IDL> .Compile histoimage IDL> HitoImage

Si el programa no compila, o si tiene errores cuando se ejecuta, elimine el programa desde la pantalla con el ratn, tipee RETALL en la lnea de comandos de IDL, y corregir los errores. No se olvide de volver a compilar el programa antes de ejecutarlo de nuevo. Intente ejecutar el programa con una imagen diferente:

Figura 99: Un error de dispositivo de impresin que se traduce en todos los pxeles con valor 0 aparecer el ltimo de un solo color cargado en la tabla de colores (el color background, en este caso). La solucin alternativa es llegar y volver a cargar los vectores de la tabla de colores cargando un solo color.
image = LoadData(5) HistoImage, image

Pruebe establecer algunas de las palabras claves. Por ejemplo, pruebe algunas de las palabras clave de color:
IDL> HistoImage, image, $

AxisColorName='beige', $ BackColorName='gray', $

ColorTable=33, $ DataColorName='yellow'

Trate de poner diferentes escalas en la imagen:


IDL> HistoImage, xScale=[0,1],scale=[-1,1]

Qu pasa con el establecimiento de palabras clave que no estn definidos para Histolmage, sino que se recoge por el mecanismo de herencia de palabras clave? Pruebe, por ejemplo, el establecimiento de la palabra clave Keep_Aspect_Ratio del comando TVIrnage y la palabra clave Divisions del comando Colorbar as:
IDL> HistoImage, /Keep_Aspect_Ratio, Divisions=8

Revisin del Programa de Ventajas Histolmage


Vamos a repasar algunos de las ventajas del programa HistoImage. Y yo quiero sealar un pocos que puede no ser evidente para usted, incluso an. En primer lugar, el programa ha sido escrito de tal manera que no importa si usted est en una pantalla de 8-bit o 24-bit, el programa funcionar de forma idntica. Ni tampoco importa si usted tiene el color descomposicin dentro o fuera de si usted est en una pantalla de 24-bit. Esto se debe a que hemos utilizado programas de color consistentes como GetColor y TVImage cargar colores de dibujo y mostrar la imagen. Hemos escrito el programa HistoImage con palabras claves _Extra definida para ello. Esto nos permite pasar palabras claves "extra" en los comandos plot, Colorbar, y TVImage dentro del programa. Pero tambin hace algo mucho ms til. Esto nos permite escribir un programa que puede automticamente volver a mostrar el grfico en pantallas de 24 bits cuando cambiar las tablas de colores. (Consulte "Actualizacin automtica de grficos Cuando el color las tablas estn cargados "en la pgina 66 para obtener ms informacin.) Por ejemplo, abra un editor de texto y crear el archivo simple, que se puede nombrar histoimage_redisplay.pro. (Este programa es uno de los programas que ha descargado para utilizar con este libro, si usted prefiere no escribirlo.)
PRO HistoImage_Redisplay, Image=image, _Extra=extra IF N_Elements(image) EQ 0 THEN image=LoadData(7) HistoImage, image, /NoLoadCT,_Extra=extra END

Este programa nos permitir cambiar la tabla de colores asociada a HistoImage y ver los efectos inmediatamente. (Esto slo ser necesaria en las pantallas de 24 bits, recordar. En pantallas de 8 bits, los colores se actualizan automticamente.) Tenga en cuenta que la palabra clave NoLondCT se establece. Esto es necesario, para una entidad externa para controlar los colores. Si no se establece esta palabra clave, HistoImage siempre cargaba su propia tabla de colores en lugar de utilizar los colores de la tabla de colores actual. En primer lugar, llame al programa normalmente y averiguar cuntos colores de imagen hay. La palabra clave de salida ImageColors se utiliza para este propsito.
IDL> image = LoadData(13) IDL> HistoImage, image, ColorTable=33, ImageColors=ncolors

A continuacin, llame a XColors para cargar diferentes tablas de colores. (XColors es un programa que se ha descargado para su uso con este libro. Utilizo exclusivamente en su lugar XLondCT, que es suministrado por IDL, por razones que usted aprender acerca de las

siguientes secciones de este captulo. Tiene muchas ventajas para XLoadCT, uno de los cuales es que yo creo que tiene un mayor sintaxis natural para la actualizacin automtica de pantallas grficas en un dispositivo de 24 bits.)
IDL> XColors, NColors=ncolors, Image=image, $

NotifyPro='HistoImage_Redisplay'

Si usted tiene ambos XColors y su ventana grfica abierta en la pantalla, para que pueda ver a los dos, te dars cuenta de que, al seleccionar las tablas de colores de la lista de tablas colores en XColors, los colores se actualizan automticamente en la ventana de visualizacin. Tenga en cuenta que si est ejecutando IDL en un dispositivo de 8 bits, slo necesita llamar a XColors como esto:
IDL> XColors, NColors = ncolors

Ahora, cierra su ventana XColors si an est en la pantalla. El programa XColors trabajar con el programa HistoImage_Redisplay no importa las palabras clave que se utilizan con HistoImage. Por ejemplo, puede escribir lo siguiente:
HistoImage, image, BackColorName='gray', $ AxisColorName='yellow', ImageColors=ncolors XColors, Image=image, NColors=ncolors, $ BackColorName='gray', AxisColorName='yellow', $ NotifyPro='HistoImage_Redisplay'

El Programa HistoImage es independiente del dispositivo


Hemos visto que el programa HistoImage es la profundidad visualizacin independiente y deconposicion independiente del Color, pero lo que puede no ser inmediatamente obvio es que tambin es independiente del dispositivo. Es decir, no importa qu dispositivo de pantalla grfica haya seleccionado para mostrar grficos,el programa HistoImage funciona correctamente en el dispositivo. Esto incluye dispositivos tales como el dispositivo PostScript (PS), el dispositivo de impresin (printer), y el dispositivo de memoria intermedia Z-grficos (Z). Por ejemplo, para imprimir esto en la impresora predeterminada, puede escribir lo siguiente:
IDL> thisDevice = !D.Name IDL> Set_Plot, 'PRINTER', /Copy IDL> Device, XSize=5, YSize=5, /Inches, XOffset=1.75,YOffset=3.0 IDL> HistoImage ,image IDL> Device, /close_Document IDL> Set_Plot, thisDevice

O bien, para crear un archivo PostScript, puede escribir lo siguiente:


IDL> thisDevice = !D.Name IDL> Set_Plot,'PS' IDL> Device, XSize=5, YSize=5, /Inches, XOffset=1.75,YOffset=3.0 IDL> HistoImage,image IDL> Device, /close_File IDL> Set_Plot , thisDevice

Recordemos que puse el color de fondo blanco de forma predeterminada slo con el propsito de ser capaz de enviar la salida grfica a una impresora o al dispositivo PostScript. Si no lo est blanco en la pantalla, se debe cambiar a blanco antes de enviarlo a la impresora o crear un archivo PostScript. Las palabras claves de colores hacen que sea fcil de hacer este interruptor cuando estn utilizando este tipo de dispositivos de salida grfica.

Lo que hace el programa HistoImage independiente del dispositivo es la ausencia de comandos que slo funcionan en un dispositivo en particular. Por ejemplo, usted no ve ningn comando Window en este programa, ya que un comando Window slo es apropiado en los dispositivos de visualizacin y no, por ejemplo, en el dispositivo PostScript. Los grficos se han escrito para entrar en cualquier ventana que pasa a ser abierto. Si el dispositivo de grficos es un dispositivo de visualizacin (es decir, WIN, MAC o X), y una ventana no est actualmente abierta, una ventana por defecto ser abierto cuando se ejecuta el primer comando de grficos. Si quera tener un comando Window en el programa (y casi nunca lo hago, sobre todo si tengo planes para usar el programa en un programa Widget), entonces usted debe asegrese de que el dispositivo es compatible con Windows. Esto se puede hacer con flags del sistema variable !D . El campo flags es un mapa de bits y queremos ver si el bit corresponde a el valor 256 se establece (ventanas son compatibles con este dispositivo) o no (Las ventanas no son compatibles con este dispositivo). El cdigo se ver as para una posible Ventana de comandos:
IF (!D.Flags AND 256) NE 0 THEN Window

Otra orden comn que no se ve en este programa es un dispositivo, comando Decomposed =0. Normalmente se requiere este comando para mostrar imgenes 2D en color. Nosotros no tienen que incluirlo porque los comandos Colorbar y TVIrnage han sido escrito con esta inteligencia integrada en ellos. Sin embargo, tendramos que utilizar un comando como este si bamos a usar el comando TV para mostrar la barra de color y la imagen. De hecho, probablemente tenga que usar varios comandos para comprobar la profundidad visual, el tipo de dispositivo, etc Para ms detalles, examinar el cdigo, ya sea en los programas TVImage o Colorbar. En el programa Colorbar de 12 lneas de cdigo presedidos por el comando TV y otras 12 lneas que siguen, slo para la trabajar con el comando TV correctamente en todos los dispositivos!

Usando Histolmage en un Redimencionable Ventana Grfica "Smart"


El programa HistoImage tambin cumple con los criterios de visualizacin de grficos para que se muestren con un programa de ventana grfica redimensionable, nombrado por el FSC_Window, que fue descargado para ser utilizado con este libro. El programa FSC_window es un ventana grfica "inteligente", ya que puede cambiar el tamao de su contenido, al crear BMP, GIF, JPEG, PICT, PNG, TIFF y archivos PostScript de su ventana de contenido , y enviar su contenido directamente a la impresora. Adems, si su programa de visualizacin grfica ha sido escrita correctamente, tambin puede cambiar los colores en su programa con una tabla de colores cambio de herramienta. Los cinco cripterios FSC_Windows que se impone en un programa de visualizacin son los siguientes: 1. El progama se debe escribir como un procedimiento. 2. No debe haber ms de tres argumentos posicionales. 3. Puede haber un nmero ilimitado de argumentos de palabra clave. 4. El programa debe estar escrito de manera que el contenido entre en cualquier ventana de tamao. 5. No debe haber comandos especficos del dispositivo en el programa (por ejemplo, el comandos Windows). Muchos comandos de visualizacin de grficos cumplen este criterio. Por ejemplo, el comando Shade_surf . Escriba los siguientes comandos:
IDL> peak = LoadData (2) IDL> LoadCT, 22 IDL> FSC_Window, 'Shade_Surf1', peak, Charsize=1.5

Usted ve un ejemplo del programa FSC_windows de la figura 100. Observe los controles bajo el archivo de la barra de men. Usted puede tomar el borde de la ventana con el ratn y cambiar el tamao de la ventana. El contenido de la ventana cambia de tamao para adaptarse a ellos. Usted puede tener tantos programas FSC_windows funcionando como usted lo desea. Por ejemplo, vamos a mostrar una imagen en un programa FSC_windows, pero tambin vamos a establecer la capacidad de los programas para cargar las tablas de colores diferentes. Escriba lo siguiente:
image = BytScl(LoadData(7) , Top=!D.Table_Size-l) FSC_Window, 'TVImage', image, /WColors

Observe que ahora hay un men de elemento de Colores en el archivo y un botn en la barra de mens. Haciendo clic en este botn para acceder al XColors herramienta para cambiar de color. XColors es un programa que fue descargado para su uso con este libro. Una de sus grandes ventajas es que no utiliza bloques comunes para almacenar sus tablas de colores. Lo que significa que no puede haber mltiples programas XCo1ors en la pantalla a la vez. Algo que es imposible con XLondCT, y el IDLsupplied , herramienta del cambio de la tabla de color. Por ejemplo, vamos a obtener el programa HistoImage en la pantalla tambin. Recurdese, sin embargo, que usted no desea utilizar todos los colores en la tabla de colores. Reservamos los cuatro primeros colores para otras cosas. Y recuerdan que si queremos que los colores sean manipuladas externamente, tenemos que estar seguro de no cargar la tabla de colores en HistoImage. Esto se logra estableciendo la palabra clave NoLondCT . Escriba lo siguiente:
IDL> image = BytScl(LoadData(5),Top=!D.Table_Size-1) IDL> FSC_Window,'HistoImage',image,/NoLoadCT, $

wcolors= !D.Table_Size-4

Ahora usted puede conseguir la herramienta de tabla de colores de ambos programas en la pantalla al mismo tiempo. Si est ejecutando IDL en una pantalla de 8 bits, las cosas se ven un poco catico, sin duda, ya que cada vez que se cambia la tabla de colores, los grficos de salida cambian automticamente.

Figura 100: El programa FSC_Window de la ventana grafica redimensionable con el comando Shade_Surf. Note que el men pull-dowiz le permitir imprimir y guardas los contenidos de una variedad de formatos de archivos.

En una pantalla de 24-bit, por supuesto, todo esto sucede de forma independiente. Lo que se nota en pantallas de 8 bits, sin embargo, es que el color ser correcto para la ventana que tiene el foco del teclado actual. En otras palabras, cada ventana "sabe", que colores deben ser cargados y los carga cuando tiene el foco. Tenga en cuenta que en una pantalla 8 bit, el programa FSC_Window no puede tener un botn Print y el archivo PostScript como se muestra en la Figura 100. Cuando el dispositivo de visualizacin no tiene tantos colores como los dispositivos PostScript o una impresora, es imposible obtener siempre los colores correctos para PostScript y la salida de la impresora. Demasiados factores estn involucrados y depende mucho de cmo se escribe el smbolo grfico que se ejecuta. Por ejemplo, no es posible obtener una salida PostScript correcto de nuestro programa HistoImage cuando se ejecuta en una pantalla de 8 bits con la tabla de colores carga apagado, al igual que el caso actualmente. Usted aprender ms acerca de cmo solucionar este tipo de problemas en los captulos que siguen, pero por ahora usted debe saber que usted puede conseguir tanto un boton print y un botn de Archivo PostScript del programa FSC_windowl en una pantalla de 8 bits, pero usted tiene que fijar explcitamente. Por ejemplo, usted puede hacer esto:
IDL> FSC_Window, TVImage , LoadData(7) , /WColors, $ /WPostS0cript,/WPrint

Pero incluso este comando no se imprimir correctamente o hacer un archivo PostScript correcto en una pantalla de 8 bits. Para hacer que la salida sea correcta, los datos de imagen tendrn que ser escalados correctamente tanto para la pantalla y para los dispositivos Postscript y la impresora. La nica manera de hacer esto es lograr que para llevar a cabo el escalado justo en el comando TVImage, como esto:
IDL> image = LoadData(7) IDL> FSC_Window , 'TVImage ' , $

BytScl(image, Top=!D.Table_Size-1), /WColors, $ /WPostScript/,WPrint

Você também pode gostar