Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Dicom PDF
Dicom PDF
de imágenes biomédicas
Octubre 2003
“En los momentos de crisis, sólo la imaginación es más importante que el
conocimiento”
(Albert Einstein)
“Lo único que podemos decidir es qué hacer con el tiempo que se nos ha dado”
(Gandalf)
“Al final todo es pasajero, incluso la oscuridad se acaba para dar paso a un nuevo
dı́a, y cuando el sol brilla, brilla más radiante aún”
(SamSagaz Gamyi)
Como parte del proyecto fin de carrera, también se han realizado las tareas de
administración de sistemas (Windows NT, 2000 y Linux) y mantenimiento del servidor
Web Apache (www.elai.upm.es) del departamento.
Abstract
The standard DICOM 3.0 allows the transmission, treatment and impression of
files DICOM, which are biomedical images with a report each of the realized study.
An application has been realized basing on the standard, which allows to share
files in a distributed environment; said otherwise, an application that it allows the
clients to visualize, to order and to receive the files contained of a servant.
The present work, a system describes multiplatform developed for the managing,
processing and audit of Images of Medical Diagnosis across nets (Intra or Internet).
The system is based on a design Cliente/Servidor orientated to objects, for which was
used as language of programming JAVA, and were realized in agreement to the norm
DICOM 3.0.
For the accomplishment of the application one has worked with libraries JDT (Java
Dicom Toolkit), with the libraries JDK 1.4.1., in the environment JBuilder Enterprise
7. It has been developed entirely in JAVA and can be usable in any operative system.
1. Introducción 1
2. El Estado de la técnica 5
2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
i
ÍNDICE GENERAL Fernando Ballesteros Herranz
2.3.7. Conectividad . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.4. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
ii GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz ÍNDICE GENERAL
3.4.2. Dcmnet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.4.3. Dcmjpeg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.4.4. DicomScope . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.5. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4. Programación en JAVA 91
4.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4.4.1. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.4.2. Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.4.4. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.5. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
GVA-ELAI-UPM
PFC0075-2003
r iii
ÍNDICE GENERAL Fernando Ballesteros Herranz
iv GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz ÍNDICE GENERAL
GVA-ELAI-UPM
PFC0075-2003
r v
ÍNDICE GENERAL Fernando Ballesteros Herranz
vi GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz ÍNDICE GENERAL
GVA-ELAI-UPM
PFC0075-2003
r vii
ÍNDICE GENERAL Fernando Ballesteros Herranz
GVA-ELAI-UPM
PFC0075-2003
r ix
ÍNDICE GENERAL Fernando Ballesteros Herranz
x GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz ÍNDICE GENERAL
GVA-ELAI-UPM
PFC0075-2003
r xi
Índice de figuras
2.5. Transmisión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
xiii
ÍNDICE DE FIGURAS Fernando Ballesteros Herranz
2.28. Muestreo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.4. Viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3.5. Print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
GVA-ELAI-UPM
PFC0075-2003
r xv
ÍNDICE DE FIGURAS Fernando Ballesteros Herranz
GVA-ELAI-UPM
PFC0075-2003
r xvii
ÍNDICE DE FIGURAS Fernando Ballesteros Herranz
Introducción
DICOM hace posible que los archivos médicos puedan viajar de forma segura entre
hospitales, centros de investigación y departamentos. Luego esa información puede ser
vista remotamente para que los médicos puedan diagnosticar desde su casa y buscar
diferentes opiniones de otros expertos de una forma rápida y sencilla.
DICOM poco a poco se está introduciendo en todo el ámbito sanitario, y que sin
duda facilitará el manejo de la información médica.
Lograr una interfaz común para todos los dispositivos de imágenes (tomografı́a,
1
Digital Imaging and Communications in Medicine
1
CAPÍTULO 1. INTRODUCCIÓN Fernando Ballesteros Herranz
Intentar desligar Dicom de las instituciones que lo desarrollan para que real-
mente pueda ser un estándar independiente.
Dicom 3.0 debe ser aplicable a toda la esfera de las imágenes médicas, desde su
transmisión hasta el tratamiento e impresión.
Reglas de codificación para construir una secuencia de datos para ser transmi-
tida como un mensaje.
2 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 1.2. OBJETIVOS DEL PROYECTO
Una vez visto que las librerı́as JDT son las que más nos interesaron, se llevó a
cabo la implementación de nuestra aplicación.
Este proyecto trata de ser una guı́a completa para el estudio del estándar Dicom,
sus posibles aplicaciones y utilización en el futuro.
Se han estudiado dos toolkit de Dicom con el fin de ver cual serı́a más útil para el
desarrollo de una aplicación final, en la que los principales servicios que proporciona
el estándar puedan ser operativos y utilizables para la medicina del nuevo siglo, ya
que DICOM ha tenido un importante avance en el último año.
GVA-ELAI-UPM
PFC0075-2003
r 3
CAPÍTULO 1. INTRODUCCIÓN Fernando Ballesteros Herranz
El estudio de las librerı́as JDT y las funciones que implementan del estándar
Dicom están explicadas en el capı́tulo 5.
4 GVA-ELAI-UPM
PFC0075-2003
r
Capı́tulo 2
El Estado de la técnica
2.1. Introducción
Estándar DICOM
5
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
[BOBA00] [TJAND99]
Los sistemas tradicionales de gestión de imágenes médicas, tales como los sis-
temas de visualización y de archivo y comunicación, están basados en estaciones de
trabajo especializadas y sistemas de arquitectura cerrada. La tecnologı́a de Internet
está siendo explorada para la distribución eficiente y rentable de imágenes médicas.
6 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.2. LIBRERÍA DE IMÁGENES MÉDICAS
GVA-ELAI-UPM
PFC0075-2003
r 7
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
8 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.2. LIBRERÍA DE IMÁGENES MÉDICAS
Por otra parte, los navegadores de Internet pueden funcionar en ordenadores per-
sonales relativamente económicos. Los documentos hypermedia y las imágenes son
almacenadas en servidores. En el nivel más sencillo, los documentos son textos planos
con hyperlinks incrustados a imágenes y otros recursos. Con la llegada de lenguajes
de programación basados en Internet, tales como Java, los navegadores tienen may-
or grado de operatividad. Las nuevas caracterı́sticas son añadidas a una localización
centralizada, resultando en menos costos y mantenimiento más fácil. Los navegadores
de Internet también permiten acceso omnipresente a imágenes médicas a través de
plataformas de múltiples clientes, mientras se mantiene un interface de usuario medi-
anamente coherente. Sin embargo, la baja resolución de las imágenes y la capacidad
para mostrar niveles de grises de los navegadores limita su uso a lecturas de diagnósti-
co aproximadas.
GVA-ELAI-UPM
PFC0075-2003
r 9
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Visualización 2D o visualización 3D
Los PACS están diseñados para soportar varios modelos de visualización de imágenes
2D, que pueden simular a las radiografı́as convencionales. Las caracterı́sticas añadidas
a la visualización de imágenes digitales incluye soporte de zoom, de rotación, ajustes
panorámicos, de ventana, de nivel. Recientes avances en hardware y lenguajes para
imágenes 3D facilitan el movimiento hacia la visualización 3D.
10 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.2. LIBRERÍA DE IMÁGENES MÉDICAS
búsqueda a través de caracterı́sticas comunes de las imágenes, tales como el color, for-
ma, textura, o una combinación de estas. Pero en el dominio de las imágenes médicas,
deben ser diseñados todavı́a más algoritmos especı́ficos para la extracción de carac-
terı́sticas y modelos de datos más complejos y costosos para tomar ventaja de la rica
información contenida en las librerı́as de imágenes médicas.
Funcionamiento y fiabilidad
Los usuarios de PACS necesitan acceso rápido a las imágenes médicas para lec-
turas y diagnósticos primarios, y para ello a menudo se necesitan redes de alta ve-
locidad (p.e., ATM y 100 Base T). Los PACS son esencialmente sistemas cerrados
con un pequeño número de usuarios, asegurando de ese modo un buen funcionamien-
to comparado con los sistemas basados en Internet. La estrecha relación existente
entre las aplicaciones de visualización y el modelo de datos incrementa además el
funcionamiento. Con más nodos siendo añadidos a Internet, la librerı́a digital basada
en ésta necesita considerar esta cuestión de funcionamiento. La librerı́a digital de
imágenes médicas debe ser capaz de organizar las peticiones clı́nicas no primarias-
como tareas principales. Una librerı́a digital de imágenes deberı́a ser diseñada para
lecturas secundarias o búsquedas de datos por referencia.
Implementando una librerı́a digital de imágenes con una intranet se puede lograr
un funcionamiento comparable a los tradicionales sistemas de PACS, mientras econ-
omizamos con el uso de ordenadores de escritorio económicos en lugar de estaciones
GVA-ELAI-UPM
PFC0075-2003
r 11
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Los sistemas PACS están creados para funcionar de manera continua, con una
fiabilidad de 24 x 71 . La tecnologı́a en auge basada en Internet, que es relativamente
nueva, tiene todavı́a que solucionar el tema de la fiabilidad. La actual implementación
de una Máquina Virtual de Java tiene todavı́a que probarse para su fiabilidad en
largos periodos de tiempo. Se han realizado muchos trabajos en gestión de sistemas
tradicionales de funcionamiento de red, pero para sistemas de objetos distribuidos,
tales como CORBA, muy poco está disponible en términos de interfaces de gestión
de sistemas y herramientas.
12 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.2. LIBRERÍA DE IMÁGENES MÉDICAS
Los datos multimedia de una librerı́a digital de imágenes consisten en datos de los
archivos de imágenes de PACS, RIS, HIS, bases de datos clı́nicas, o archivos externos.
Esta naturaleza de los datos es inherentemente multimedia, consistiendo en imágenes
médicas, historiales médicos, demografı́as, dictados de voz, e indicaciones biomédicas.
Los datos pueden ser almacenados en un archivo del sistema, o en bases de datos
relacionadas. Una tecnologı́a para aplicaciones en Internet que está en auge son las
bases de datos de objetos. Los protocolos estándar de información médica, tales como
DICOM (Digital Imaging and Communication in Medicine) y HL7 (Health Level
Seven), proporcionan un método a los datos para ser compartidos y archivados.
El servidor de Internet funciona como proxy para las peticiones de los usuarios. El
navegador genera peticiones HTTP (Hypertext Transfer Protocol) en representación
del usuario en el servidor de Internet. Sucesivamente, el servidor Web envı́a la petición
a una máquina de reglas, la cual procesa la petición, construye los tipos de datos
requeridos, y devuelve una respuesta al servidor HTTP y al usuario. Las máquinas
de reglas tienen varias funciones, incluyendo un mecanismo de filtrado de preguntas
o un agente que mapea las solicitudes del usuario a tipos de datos apropiados.
GVA-ELAI-UPM
PFC0075-2003
r 13
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
14 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
2.3.1. Introducción
GVA-ELAI-UPM
PFC0075-2003
r 15
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
que incluı́an todas las estructuras de datos de DICOM, mostraron que el apoyo de
red era operacional y podrı́a cumplirse exitosamente.
En primer lugar, dejar claro que DICOM 3.0 es aplicable a toda la esfera de las
Imágenes Médicas, desde la transmisión hasta el tratamiento e impresión, independi-
entemente de la “especialidad médica” que la exporte.
En segundo lugar, y quizás lo más importante a dı́a de hoy, indicar que aunque la
Norma tiene el potencial de facilitar la realización de trabajos con PACS, la utilización
de la Norma DICOM 3.0 no garantiza, por si misma que se cumplan todos los objetivos
que se intentan lograr en un sistemas de gestión de imágenes. Se facilita, pero no se
garantiza, la interoperatividad en un entorno multi-vendedor.
16 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
En un esfuerzo para desarrollar unos medios estándar para que usuarios de equipamien-
to de imagen médica (tal como TAC, resonancia magnética, medicina nuclear, y ultra-
sonidos) puedan intercambiar imágenes u otros dispositivos entre estas máquinas, el
Colegio Estadounidense de Radiologı́a (ACR) y la Asociación Nacional de Fabricantes
Eléctricos (NEMA) formó un comité conjunto a principios de 1983. La misión de este
grupo, el Comité para estandarizar las comunicaciones y la Imagen digital de ACR-
NEMA, estuvo en hallar o desarrollar una interfase entre el equipamiento y cualquier
otro dispositivo que el usuario quiera conectar. Además de las especificaciones para
la conexión de hardware, el estándar se desarrolları́a para incluir un diccionario de
los elementos de datos necesitados para interpretación y la exhibición de imágenes.
GVA-ELAI-UPM
PFC0075-2003
r 17
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
El problema era que por 1988 muchos usuarios quisieron una interfase entre dis-
positivos y una red. Mientras esto podrı́a realizarse con la Versión 2.0, el estándar
careció de partes necesarias para la comunicación robusta de red. Por ejemplo, uno
podrı́a enviar a un dispositivo un mensaje que contenga información de cabecera y
una imagen, pero el dispositivo no sabrı́a necesariamente qué hacer con los datos. La
Versión 2.0 de ACR-NEMA no era diseñada para conectar equipamiento directamente
a una red, resolver estos problemas significaban cambios importantes al estándar. La
comisión habı́a adoptado la idea que las futuras versiones del Estándar de ACR-
NEMA tendrı́an compatibilidad con las versiones anteriores, y esto puso algunas
restricciones al WG VI.
6
Transfer Control Protocol / Internet Protocol
7
International Standard Organization - Open Systems Interconnection
18 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Un proceso distribuido está formado al menos por dos procesos que comparten
información y confiando en la operatividad de uno en el otro. Un número de procesos
distribuidos actuando juntos proporcionan servicios para sistemas en entornos como
departamentos de radiologı́a. Figura 2.5.
Antes de que los procesos puedan actuar juntos una serie de temas tienen que ser
GVA-ELAI-UPM
PFC0075-2003
r 19
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
tratados. Tienen que estar de acuerdo en el papel (rol) que cada uno desempeñará,
tener una visión equivalente de la información y seleccionar las operaciones que cada
parte realizará.
Primeramente, el papel de cada parte debe ser definido como cliente o como servi-
dor. La parte que utiliza la operatividad de la otra, tiene el papel de cliente. La
parte contraria actuando sobre un modelo concertado tiene el papel de servidor. El
funcionamiento de ambas partes viene definida por la relación que comparten. La
relación define que parte y bajo que condición toma la iniciativa en el proceso. En
muchos casos los clientes provocan el proceso, pero a veces lo hace el servidor.
Además de los papeles que desempeñan, ambas partes tienen que estar de acuer-
do en la información que intercambian. La información está definida por el contexto
del servicio que el proceso distribuido está realizando. Cada proceso individual ten-
drá una visión selectiva de esta información, pero la visión tiene que ser coherente en
la totalidad del contexto.
Ambas partes, cliente y servidor, tienen que ser capaces de emitir peticiones a los
servicios de menor nivel. Los servicios de menor nivel llevarán el intercambio y están
ocultos para el dominio de la aplicación del cliente o servidor. La parte que solicita
20 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
los servicios es el usuario del servicio (service user). El equivalente es el proveedor del
servicio (service provider). Ambas partes pueden tener distintas implementaciones,
pero comparten el mismo conocimiento sobre como se intercambian los datos (proto-
colo) y tienen el mismo interface lógico (formato de petición) entre sı́. Ambas partes
deben determinar como viene representada la información en el formato de bit/byte.
El proveedor del servicio debe determinar en que formato la información fue trans-
ferida y convertida a la representación esperada por el dominio de la aplicación. La
representación es conocida entre el usuario y el proveedor del servicio en cada parte.
Después del intercambio, la información presentada a los procesos utilizando la infor-
mación es igual en ambas partes, independientemente de como fuera intercambiada.
El intercambio fı́sico entre los proveedores del servicio puede ser vı́a network o
media. Cada mecanismo tiene su propia forma de manejar el conocimiento de la
representación.
GVA-ELAI-UPM
PFC0075-2003
r 21
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
22 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
User). Para realizar una asociación, lo primero es que SCU y SCP estén deacuerdo
en utilizar una clase SOP.
Una Clase SOP identifica las capacidades del proceso distribuido especı́fico de
una Clase de Servicio. Cuando las partes están de acuerdo en utilizar una Clase
SOP, ambas partes deben asegurar que desempeñaran sus papeles como se describen,
utilizando el contexto de la Clase de Servicio incluida. Antes de que la información
se intercambie puede tener lugar la identificación de la Clase SOP, que es una parte
importante que tiene que ser realizada al principio. El mecanismo usado depende del
tipo de intercambio: “network” o “media”.
GVA-ELAI-UPM
PFC0075-2003
r 23
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
contexto definido por la Clase de Servicio, un IOD consiste en una entidad de in-
formación única llamada IOD normalizado (normalized IOD) o una combinación de
entidades de información llamada IOD compuesto (composite IOD). Las Clases de
Servicio que llevan a cabo funciones de administración (en su mayor parte cuestiones
simples) utilizan IODs normalizados, aquellas que manejan el flujo de imágenes (es-
tructura compleja de información) utilizan IODs compuestos. Cada Clase SOP es
definido con uno o más IODs que son combinados con uno o más servicios.
24 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Atributos
Los atributos son la entidad de información básica y tienen que ser descritos
en detalle.Figura 2.10. Las siguientes caracterı́sticas o campos de un atributo están
definidas en el estándar DICOM:
El tipo de clase especifica el uso de los atributos especificados en las Clases SOP
y el papel del SCU o del SCP. Dependiendo de la situación, cada atributo es forzado
GVA-ELAI-UPM
PFC0075-2003
r 25
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
a tener un valor (tipo 1) o forzado con o sin valor (tipo 2) o opcional (tipo 3).
Los Elementos de Servicio son las operaciones permitidas en los Objetos de In-
formación (IODs) para una Clase SOP definida. El grupo de elementos de servicio
pertenece a la Clase SOP y es llamada Grupo de Servicio (Service Group).
El Grupo de Servicio de una Clase SOP es seleccionado de una lista fija de Elemen-
tos de Servicio de DICOM. Algunos Elementos de Servicio están proyectados para
usarse con IODs compuestos, otros para uso con IODs normalizados. Una tercera
categorı́a, medios de almacenamiento (storage media) relacionados con Elementos
de Servicio, manejando instancias de Clases SOP normalizadas o compuestas como
archivos. Una Clase SOP utiliza uno o más elementos de servicio.
26 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Cada Clase SOP utiliza uno o más Elementos de Servicio de cada uno de los gru-
pos compuestos (C-XXXX) o de los grupos normalizados (N-XXXX). Los siguientes
Elementos de Servicio están disponibles: C-STORE, C-FIND, C-MOVE, C-GET, C-
CANCEL, C-ECHO, N-GET, N-SET, N-ACTION, N-CREATE, N-DELETE y N-EVENT-
REPORT. Las semánticas de los Elementos de Servicio dependen de la Clase de Ser-
vicio y de la Clase SOP en la cual están utilizados.
Gracias a las Clases de Servivio (mensajes DICOM) hay una comunicación entre
ambas partes. Antes de poder lograr el intercambio de información entre dos Clases
SOP, debe establecerse entre ellas una Asociación (Association en DICOM), donde se
negocia para establecer las posibilidades de trabajo de cada parte. Una vez establecida
la asociación, si esta fue satisfactoria puede establecerse el intercambio de mensajes a
través de los DIMSE- DICOM Service Element- (DIMSE-C en este caso, que soporta
operaciones con Instancias Compuestas SOP).
Los mensajes entre dos aplicaciones DICOM están codificados y son enviados en
forma de Data Set que está compuesto de Command Elements y deben tener una
estructura como la que se muestra en la figura 2.11.
La norma establece que la estructura del mensaje y set de comandos sea por
defecto: - Tags en orden Creciente, - Little Endian, -VR Implı́cito.
Si en el Data Set vienen ya implicitos los datos que quieren ser pasados de un
equipo a otro, éste se compone de Data Elements y su estructura es según la figura
2.12. Este es el modo en que se codifican los mensajes para transferir los estudios y
la información de un equipo a otro.
Tanto el Command Set como el Data Set son “cola” de Command Elements8 o
8
Elementos de Comandos DICOM (Store, Find, etc.)
GVA-ELAI-UPM
PFC0075-2003
r 27
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Value Representation (VR): es una cadena de dos caracteres que según la cual
se especifica el tipo de dato que se leerá en el Value Field. En la Parte6 de la
norma se especifica el tipo de dato (cadena de caracteres de hasta 16 bytes,
cadena de caracteres de 4 bytes, etc.) correspondiente a cada sigla (AE, AS,
etc.).
Value Length: Length: entero sin signo de 16 o 32 bits (según sea VR, Explı́cito
o Implı́cito). Contiene un número par que indica la extensión del campo Value
Field, donde se hallan contenidos los datos propiamente dichos.
9
Codificación de datos (Fecha de Estudio, Modalidad de Estudio, etc.)
28 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
El receptor del data set decodificará este para extraer la información que necesita
y actuar como acuerdo de la semántica de la Clase SOP.
Identificación
Como parte del proceso de creación de una Instancia SOP, una identificación es
generada como atributo de la SOP Instance. La identificación es pretendida para la
GVA-ELAI-UPM
PFC0075-2003
r 29
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
utilización por los sistemas de información antes que por los humanos y tiene dos
caracterı́sticas: la identificación de la clase (class identification) y la identificación de
la instancia (instance identification).
<root>.<suffix>
La parte de root es proporcionada por una autoridad que garantice que nadie
más utilizará este root. Este número será asignado por estándares de organizaciones
y compañı́as tales como Philips u hospitales, que deberán asegurar que permanece
único a lo largo de sus propios sistemas. Utilizando un sistema de identificación único,
cada sistema tendrá un único root a lo largo de todo el mundo. El suffix tiene que ser
creado dinámicamente por el sistema en la creación de la instancia.
Un vez que una instancia es identificada por un UID, esta debe ser utilizada
consistentemente. Si se crean copias o la instance es reproducida sin ninguna modifi-
cación, deberá tener el mismo UID, de lo contrario dos piezas de idéntica información
coexistirı́an con diferentes identificaciones, lo que podrı́a conducir a confusión.
Relaciones
30 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Para cada atributo un Representación del Valor (VR) es definido. Una Repre-
sentación del Valor describe como un atributo es codificado en un Data Element
(elemento de dato). El conocimiento de la Representación del Valor es compartido
por las partes en el intercambio de información, el proceso de codificación y decod-
ificación tiene que tener cuidado en la selección del VR correcto para un atributo
(identificado por su etiqueta —tag—).
Transfer Syntax
Antes de que la Data Set de una Instancia SOP pueda ser transferida, la forma
en la que el Data Set es codificado en una secuencia de bytes debe ser fija, ambos por
acuerdo cuando el intercambio network es usado, o almacenados juntos con los datos
de uno. La forma de codificar es especificada por el Transfer Syntax.
El manejo del “transfer syntax” es parte del proveedor del servicio. Sin embargo,
ambos procesos tienen que ser iniciados según el “transfer syntax”, aceptable para
ambas partes.
GVA-ELAI-UPM
PFC0075-2003
r 31
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Mirando la figura 2.13 se puede obtener una visión general del flujo de codificación
y decodificación. Los servicios proporcionados dentro del Dominio del Intercambio
tienen que garantizar que las Instancias SOP en ambas partes contienen la misma
información, independientemente de la representación y método de transferencia.
La segunda etapa transfiere el data set en una corriente de bytes que pueden
ser manejados por las capas más bajas. Para la segunda etapa la ordenación de
bytes tiene que ser utilizada como acuerdo con el Transfer Syntax.
32 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Una cuestión importante en las aplicaciones distribuidas en red es como las apli-
caciones pueden contactar entre ellas. En DICOM Network, las partes se reconocen
mutuamente mediante las Entidades de la Aplicación. Una Entidad de la Aplicación
es aquella parte de un proceso que negocia con la comunicación. Ella contiene el
Usuario de Servicio del proceso, conteniendo funciones para organizar conexiones y
transferencia de información. Una Entidad de la Aplicación tiene un nombre, Tı́tulo
de la Aplicación (Application Title), que tiene que se utilizado cuando se establece la
comunicación.
GVA-ELAI-UPM
PFC0075-2003
r 33
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Los Tı́tulos de la Aplicación son nombres simbólicos para los procesos involucrados
en la comunicación. En un sistema de red real, la dirección de red tiene que ser
suministrada. A esto se le llama la Dirección de la Presentación. Se le llama ası́ porque
el usuario del servicio es la capa de Aplicación (OSI), el proveedor del servicio, la capa
de Presentación (OSI) (y niveles más bajos). La frontera entre ambos niveles es el
punto de acceso network donde los datos son transferidos desde la capa de aplicación
a las capas de network. Cada punto de acceso en una red tiene una única dirección.
Association Negotiation
34 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Presentation Context
Para cada Clase SOP negociada durante la iniciación de la Asociación tiene que
alcanzarse un acuerdo entre los procesos involucrados acerca del transfer syntax usado
entre los procesos. La parte iniciadora propone todos los transfer syntaxes, fijando
el Contexto de la Presentación para esta Clase SOP. Después de la negociación una
Presentation Context para cada Clase SOP aceptada es establecida.
Una Presentation Context es identificada por un número acordado entre las dos
partes. En el contexto de una aplicación puede existir un número de una Presentation
Context. El número de la Presentation Context identifica la SOP Class para la cual
el intercambio de información tiene lugar.
Protocolos de Red
El actual Protocolo de Red tiene que cumplir con los servicios del estándar definidos
para el protocolo OSI. Ver figura 2.16.
GVA-ELAI-UPM
PFC0075-2003
r 35
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Para la capa de aplicación dos grupos de servicios tienen que estar disponibles
para una implementación DICOM: el protocolo de Control de Asociación (ACSE) y
el protocolo de Mensajes DICOM (DIMSE). ACSE es un estándar del protocolo OSI
y DIMSE pone en práctica los servicios DICOM.
36 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
La DUL utiliza el mismo interface que el protocolo TCP/IP con respecto del
protocolo OSI. En el nivel más bajo del DUL hay un interface para el nivel TCP.
La Asociación DICOM entre las Entidades de Aplicación es mapeada a una conexión
TCP. La Dirección de la Presentación es mapeada a un número de puerto TCP,
combinado con el número de IP o nombre del servidor (Host name). Esta combinación
del número de puerto TCP y el número de IP es llamada Dirección de Conexión
(Socket Address). En una red esta combinación es siempre única.
Esta primera categorı́a contiene las Clases de Servicio negociadas con los datos
de imagen. Los datos de imagen son siempre encapsulados en un IOD compuesto y
utilizando los servicios compuestos. Las Clases de Servicio de este grupo son:
Storage Service Class, que consiste en Clases SOP para cada modalidad de
tipo de imagen: Computed Radiography (CR), Computed Tomography (CT),
Magnetic Resonance (MR), etc. Esta Clase de Servicio especifica el intercambio
GVA-ELAI-UPM
PFC0075-2003
r 37
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
de los datos a través de la red. No especifica que tiene que hacerse con la imagen,
que tiene que ser gestionada por otras Clases de Servicio.
Query/Retrieve Service Class. Incluye las clases SOP FIND, MOVE y GET
para un número de modelos de peticiones. La FIND puede ser utilizada para
solicitar una colección de imágenes. La MOVE y GET pueden ser usadas para
iniciar la transferencia. La actual transferencia se realiza utilizando la Storage
Service Class.
38 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
En Media Storage Services class son definidos un set de servicios que permiten el
intercambio de datos usando Media Storage. Media es usado por dos razones:
Las imágenes son almacenadas en Media para el intercambio entre dos proce-
sos sin la especificación sobre el tratamiento, solamente la transferencia de la
información.
El papel en el cual el proceso está activado en esta Clase de Servicio no está rela-
cionado con el papel del compañero con la situación de red, pero con las operaciones
sobre los medios de comunicación. Tres papeles son definidos: el File-set Creator o
FSC, el File-set Reader o FSR y el File-set Updater o FSU, el nombre se refiere a la
operación permitida.
Los Elementos de Servicio usados en las Clases SOP de esta Clase de Servicio
especifica las operaciones en las instancias de las Clases SOP como un archivo o como
GVA-ELAI-UPM
PFC0075-2003
r 39
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
una dirección completa de un archivo. Los IODs usados con estos servicios definen la
información para ser guardados en un archivo.
Otras Clases SOP de Media Storage Service Class son identicas a las Clases SOP
usadas con el Network Storage Service Class para datos de imagen, Detached Patient
Management, Detached Study Management, Detached Result Management y Print
Management Service Classes. Las Clases SOP almacenadas en archivos pueden ser
usadas directamente por la Clase de Servicio de las Clases SOP correspondientes,
usando los servicios de Media Storage Service Class. Ver figura 2.18.
Los procesos de ambos lados deben estar de acuerdo en que información es in-
tercambiada por los medios de comunicación especificando una lista de Clases SOP
y otras cuestiones. Como no existe ningún mecanismo de negociación de asociación,
debe haber un arreglo que se conforma a un Perfil De aplicación.
Finalmente, hay una Clase de Servicio que no se ajusta a ninguna de las cat-
egorı́as anteriores: la Verification Service Class. Esta Clase de Servicio es utilizada
para chequear si una asociación puede establecerse entre dos procesos e intercambiar
una instrucción sin ningún dato (C-ECHO), donde ningún IOD está involucrado. Esta
proyectado para propósitos de chequeo en nivel de conectividad.
40 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
2.3.7. Conectividad
Antes de que las dos implementaciones de DICOM puedan ser conectadas entre
sı́, algo de investigación es necesaria si la conexión es posible. Esto alcanza desde el
bajo nivel de conexión fı́sica hasta la implementación de la misma Clase de Servicio
en el nivel de aplicación.
DICOM solventa esta cuestión utilizando perfiles de sistema (system profiles) para
implementaciones y Perfiles de aplicación (application Profiles) en un entorno de
intercambio “media”.
Conformance Statement
Un Perfil de Sistema (System Profile) contiene una lista de las funciones sopor-
tadas y limitaciones o extensiones de estas funciones. Juntos forman un perfil que se
debe ajustar al perfil de la parte que tendrá que cooperar. Estos perfiles de sistema
son descritos en un documento que debe ser suplido con cada implementación de
DICOM: la Conformance Statement. Figura 2.19
GVA-ELAI-UPM
PFC0075-2003
r 41
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Finalmente el soporte para otros caracteres fijados, además del estándar ASCII
(tales como extensiones para idiomas Europeos, Japonés, etc) descrito.
Para “media” un perfil de sistema detallado tiene poco sentido porque la corre-
spondencia no tendrá lugar antes de que se conecten los sistemas, pero por el momento
el medio es llevado a otro sistema. En este caso ambos sistemas deben garantizar que
se ajustan a un formato genérico que habilita la aplicación que ambos implementan.
Este formato genérico es llamado Perfil de la Aplicación. Por ejemplo, un sistema
que genera datos de imagen en un medio debe hacerlo conforme a un Perfil de Apli-
cación confirmado. Un sistema utilizando esta imagen puede confiar en este Perfil de
Aplicación para resultar un éxito.
42 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
El estándar DICOM está dividido en varias partes, cada una de ellas describiendo
una cuestión importante tal como las Clases de Servicio, los IODs, temas relacionados
con Network y Media, etc. En la figura 2.21 se ve una visión general de la relación
entre las diferentes partes.
Las partes de DICOM son 13: las 9 primeras son originales y las partes de la 10
a la 13 fueron propuestas mediante suplementos. La figura 2.21 muestra la relación
entre las partes del estándar. La figura no debe tomarse como jerarquı́a; la porción
de la izquierda representa las partes que definen la red y la comunicación punto por
punto. La porción derecha de la figura muestra las partes que soportan medios de
almacenamiento removibles. Las partes 1,2,3,5 y 6 son usadas en ambos ambientes.
En este apartado las partes de DICOM son abordadas en el mismo orden que los
temas planteados en los apartados anteriores. Puede ser usada como linea directiva
para empezar a leer las varias partes del estándar DICOM.
GVA-ELAI-UPM
PFC0075-2003
r 43
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Las Clases de Servicio y las Clases SOP incluidas en las Clases de Servicio están
definidas en la parte 4, basadas en los modelos de la parte 3. Los roles de las SCP y
SCU son definidos aquı́ y se especifica el comportamiento esperado para cada rol en
cada servicio. Esto permite a los implementafores y usuarios entender qué se espera
de un dispositivo que soporta una clase en particular. Para cada Clase de Servicio la
operatividad está delineada siguiendo la descripción de las Clases SOP individuales.
Para cada papel un proceso puede desempeñar los requisitos dados por los dos con
detalles del uso de los atributos si es aplicable. Dependiendo del tipo de Clase de
Servicio (compuesta o normalizada) la descripción es dando un pequeño contexto o
uno detallado. Ası́ mismo los temas que tienen que ser descritos por cada parte de la
Clase SOP en la Conformance Statement son listados. La parte 4 utiliza los IODs y
los Servicios definidos en las Partes 3, 7 y 10.
Los IODs utilizados por las Clases SOP son descritos en la Parte 3. Empieza con
la descripción del IOD completo, dividiéndolo en los grupos de IODs compuestos y
normalizados. De cada IOD se da una lista de “Information Object Modules”. La
última parte define los atributos individuales agrupados en detalle en los IOMs. Para
los IODs compuestos todos los detalles son listados en esta parte, para los IODs
normalizados el actual uso de los atributos depende del servicio aplicado y descrito
en la parte 4.
Los Elementos de Servicio utilizados por las Clases SOP son divididos en dos
partes, Parte 7 para los Servicios Network y la construcción de secuencias de comandos
y Parte 10 para los Servicios Media. En estas partes la codificación del “network
message header” y “media file header” son definidos. El resultado es un mensaje o
archivo que puede ser manejado por el correspondiente mecanismo de intercambio.
44 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Los dos grupos de menor nivel tratan con el intercambio fı́sico de datos. En la
Parte 8 las cuestiones de Protocolo de Red (Network Protocol) son descritas, la Parte
9 define la conexión punto-a-punto (point-to-point conexion) (raramente utilizada) y
la Parte 12 define las cuestiones del formato de Physical Media.
Todos los atributos y UIDs definidos por las varias partes del estándar DICOM son
listadas en el Diccionario de Datos (Data Dictionary) (Parte 6). Es el listado completo
de todos los elementos de datos junto con sus nombres numéricos (o etiqueta), sus
nombres de texto, cual es su representación (texto, número de coma flotante, etc.), si
ellos contienen uno o más ı́tems (la multiplicidad de valor), y qué los valores permitidos
están para esos elementos que pueden contener solo ciertos valores.
GVA-ELAI-UPM
PFC0075-2003
r 45
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Las clases SOP contienen una definición de objeto (IOD) y servicios para ser apli-
cados a ese objeto. En el manejo de los datos de las imágenes, como lo descrito en
DICOM, está sólo limitado por la transferencia (clase de almacenamiento SOP) y por
el medio de almacenamiento. En este capı́tulo, además de usar los términos almace-
namiento de clase e instancia SOP, el término DICOM Image SOP Class/Instance,
se usa para referirse al proceso de los datos de la imagen.
Los usuarios de cada tipo de aparato tienen su propia terminologı́a para esta
ordenación, como escáner, rodaja, etc. Cuando los datos de las imágenes de diferentes
fuentes tienen que ser recogidas en un ambiente único, debe ser posible ordenar los
datos de las imágenes de diferentes fuentes. Esto es sólo posible cuando los datos
están estructurados de acuerdo al mismo modelo de información.
46 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Nivel de paciente
Sin embargo, es de práctica normal usar el nivel del estudio para recoger la infor-
mación manejada por varios sistemas para un única respuesta a este estudio.
Nivel de estudio
GVA-ELAI-UPM
PFC0075-2003
r 47
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
principal. Un paciente puede tener muchos estudios como resultado de otros realizados
anteriormente.
Nivel de serie
Después del nivel de estudio todas las imágenes se recogen. El nivel de serie iden-
tifica el tipo de aparato que crea las imágenes, la fecha y el tiempo de creación de la
serie y los detalles del tipo de examen realizado y del equipo usado.
Realizar una lista de los términos usados en los diferentes aparatos tiene que ser
cuidadosamente considerado. Puede haber palabras que aparentemente signifiquen lo
mismo, pero se usan con diferencias en distintos contextos. Las series siempre son
una colección de imágenes que provienen de una único aparato. La forma en que
las imágenes están agrupadas en series depende del uso médico que se les va a dar.
Cómo las imágenes son adquiridas por una máquina es menos importante para ésta
agrupación. Sin embargo, varios atributos definirán el tipo de adquisición y se pueden
mostrar en la visualización. En algunos casos la relación entre las imágenes se define
mediante la forma en que la adquisición ha tenido lugar.
Cuando las adquisiciones en una secuencia tienen relación espacial o temporal, las
imágenes resultantes de esta adquisición pueden ser agrupadas en series. Una serie
nueva debe comenzar cuando la relación existente entre imágenes ya no existe.
Otro criterio para agrupar imágenes puede ser coger los datos de una única parte
del cuerpo hecho durante un estudio completo. Por ejemplo, cuando un aparato pro-
duce un número de imágenes del estómago de un paciente desde diferentes posi-
ciones y momentos, las imágenes pueden ser agrupadas en una serie. Algunos sis-
temas producen más de una imagen al hacer una adquisición de datos. Por ejemplo,
algunos escáneres se hacen con un sistema CT, las imágenes reconstruidas desde
cada escaneamiento son recogidas en series y tienen relación espacial. El siguiente es-
caneamiento estará en una nueva serie, porque en muchos casos el proceso de escanear
se hace desde diferentes posiciones.
También, en una serie, una imagen de referencia puede ser incluida como una de-
scripción de la posición espacial de las rodajas individuales. Ver figura 2.23. Diferentes
reconstrucciones puede ser guardada en diferentes series.
Para cada tipo de aparato médico hay reglas definiendo los contenidos que una
serie debe describir. Las reglas usadas por un sistema dado son parte de un perfil de
sistema en el estatuto de conformidad DICOM.
48 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Nivel de imagen
El nivel más bajo del modelo de información es el nivel de imagen. Cada imagen
contiene la información de adquisición y posicionamiento al igual que los datos propios
de la imagen. Dependiendo del tipo de aparato, el nivel de imagen contiene datos para
una sola imagen, dos imágenes (sistema de dos planos) o una colección de imágenes
cogidas en un corto espacio de tiempo (multiframe images).
GVA-ELAI-UPM
PFC0075-2003
r 49
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
en este diagrama representa una entidad de información (ver IODs) del IOD com-
puesto. Las relaciones indican los puntos cardinales para cada relación de la entidad
de información usada en una instancia SOP.
En este caso las entidades de información del paciente y del estudio tienen múlti-
ples instancias en la colección de las instancias SOP. En contraste, las instancias
normalizadas SOP (con entidades de información simples) usan referencias a otras
entidades de información, perteneciendo un protocolo más eficiente, pero requiriendo
un manejo más complejo.
Cuando se recoge un grupo de Image SOP Instances las cuales tienen relación entre
ellas, pero están creadas desde diferentes aparatos, es importante ser capaz de marcar
las entidades de información en diferentes niveles. Son importantes dos aspectos:
1. Todas las modalidades deben tener un mapa (código) consistente de cómo pasar
de unos datos de imagen a una instancia SOP.
2. Las entidades de información individuales deben contener la identificación sufi-
ciente de hacer un correcto marcado de las entidades de información equivalente
en otras instancias SOP.
El primer aspecto requiere que los datos producidos por los aparatos sean orde-
nados en series que tengan una relación como la descrita en la sección nivel de serie.
En los niveles de serie e imagen, la secuencia de imágenes dentro de una secuencia
debe ser identificada en un aparato.
50 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Identificación
Si los datos de imagen tienen que ser almacenados en sistemas los cuales ordenan
los datos examinando el contenido de la información de la entidad, debe haber un
consentimiento y un acuerdo para indentificar la información de la entidad por todos
los sistemas (aparatos, sistemas de almacenamiento, estaciones de trabajo, etc.) los
cuales manejan la información.
El mecanismo DICOM que se ha definido para estas identificaciones son los UIDs.
Cada una de las entidades de información en el modelo de información tiene su propia
GVA-ELAI-UPM
PFC0075-2003
r 51
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
UID, excepto para la entidad de información del paciente. La forma en que la infor-
mación debe ser identificada se define por otros sistemas de información (fuera del
visor DICOM) que tratan con la administración paciente. En este caso se usa un
identificador ID para el paciente.
Cuando este UID se usa de una forma consistente por todos los sistemas involucra-
dos, no es difı́cil relacionar todas las piezas de información con los datos de la imagen
en la instancia DICOM SOP. Sin embargo, esto requiere una unión entre todos los
sistemas involucrados para transferir la clave del sistema.
A parte de esta unión, los UIDs tienen que ser soportados por todos los otros
sistemas, no sólo los sistemas involucrados en el manejo de datos de imágenes. Un
sistema que genera los UIDs del estudio juega un mayor rol para distribuir el UID
a otros sistemas involucrados. Normalmente, esto deberı́a hacerse por un Sistema de
Información Radiológico (RIS) o por un Sistema de Información de Hospital (HIS),
que normalmente puede no siempre soportar el concepto UID.
Usar el UID del estudio como unión con las partes relacionadas de la informa-
ción es un aspecto importante para proporcionar un modelo de información DICOM
consistente, el cual puede ser expandido en otras partes de la información en un
departamento de radiologı́a.
Esta consistencia es muy difı́cil de mantener cuando el UID del estudio se reem-
plaza por un RIS o un método especı́fico de identificación.
52 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Otras identificaciones
A parte de las claves del sistema, los usuarios necesitan acceder a la información
y quieren usar identificadores que tengan sentido como el nombre del paciente, su dı́a
de nacimiento, fecha del estudio médico, etc.
Los aparatos médicos tienen que proporcionar una información lo más consistente
posible para permitir una identificación por parte de los humanos. La información de
identificación puede ser proporcionada por una única fuente cuando una unión entre
sistemas es posible.
Por ejemplo, el RIS da el nombre del paciente, su fecha de nacimiento, etc, como
parte de la información para realizar un examen médico. Este método previene el
error de máquina y permite una forma más eficiente de funcionamiento.
GVA-ELAI-UPM
PFC0075-2003
r 53
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
to de esta información se hace por sistemas que actúan como fuentes para aparatos
médicos.
Uno o más atributos son clave para la información en otros sistemas de informa-
ción. Otros atributos identifican al paciente como una persona o dan más detalles
sobre su condición. Un número de esos atributos son muy importantes para el proce-
so completo de identificación y conexión a otra información en un departamento de
radiologı́a.
54 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
La información del estudio es una clase con una mezcla de información fuente. Por
un lado, la información será suministrada desde un sistema como un RIS (Sistema de
Información Radiológico) que identifica el estudio a través de más de un sistema. Por
otro lado, el aparato médico añadirá información sobre el paciente en el momento en
que el estudio se realiza. Información de otros sistemas incluyen una identificación
del estudio. Un UID de una instancia de un estudio es la forma más eficiente de
identificación, pero tiene desventajas. Un atributo alternativo, llamado número de
acceso, puede ser usado en un sistema RIS. En el caso de que no esté disponible un
UID de la instancia del estudio desde fuera de un aparato médico, éste tiene que
generar el UID de forma que garantice que es el único en el sistema.
Otra información suministrada al aparato médico son los nombres de los médicos
solicitantes o la lectura de las imágenes y la información del paciente dinámica como
la edad, el peso, la ocupación, etc.
Información de la serie
GVA-ELAI-UPM
PFC0075-2003
r 55
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
tipo y la serie, cuestiones de calibración, etc. Estos datos pueden ser compartidos
por series pertenecientes al mismo estudio y realizados mediante el mismo aparato
médico.
Se usa un marco de referencia para agrupar imágenes que tienen relación espacial
o temporal. Esto puede ser usado para dividir series en partes o a través de más de
una serie si se aplica la misma relación. Tal relación se identifica por un UID de marco
de referencia compartido entre las imágenes involucradas.
Información de la aplicación
Los atributos en esta clase dan información sobre la imagen contenida en la in-
stancia SOP requerida para el diagnóstico y otras aplicaciones. Varios ejemplos, desde
un simple texto añadido como comentario, hasta detalles como el contraste, terapia
y dispositivos usados durante el reconocimiento médico.
Otro grupo describe la parte del cuerpo examinada usando valores codificados.
Los ajustes del valor de interés (VOI), en la mayorı́a de los casos llamado anchura
de ventana y centro de ventana (window width y window center), son miembros muy
importantes de esta clase. El VOI es la selección fuera de la gama completa de los
valores de pixel que son clı́nicamente significativos cuando se muestra o se imprime la
imagen. Sólo el rango especificado tiene que ser convertido a nivel de grises disponibles.
La información que dibuja lı́neas o agrega el texto a la imagen mostrada puede ser
en forma de matrices que tienen que ser agregadas a la muestra en un visualizador,
o ya aplicada a la matriz de pixel. Sumnistrando la superposición como una infor-
mación separada de los datos de imagen, la imagen puede ser mostrada con o sin la
superposición, permitiendo que los datos de imagen puedan ser usados como entradas
para el tratamiento remoto.
Información adquirida
56 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Información de la posición
En una serie que tiene relación espacial, como puede ser imágenes CT o MR, mu-
chos más detalles se tienen que suministrar sobre la posición de las imágenes en el
espacio tridimensional del cuerpo del paciente. Esta información permite a sistemas
como planificadores de tratamiento de radioterapia usar el posicionamiento tridimen-
sional para el procesamiento de los datos de las imágenes.
Cuando los aparatos médicos son capaces de generar imágenes en color, tiene que
ser suministrada la información sobre cómo los datos son ordenados en diferentes
planos. A parte del formato de la información, esta clase contiene los datos de los
pı́xeles en un marco sencillo, en dos marcos para sistemas de dos planos o en mul-
timarco. Cuando un multimarco se genera por un sistema de dos planos es posible
almacenar los marcos de los dos planos juntos. En este caso los marcos de los dos
planos se almacenan alternados (A-B-A-B-...). Para un multimarco las relaciones de
tiempo entre los marcos individuales se describen mediante otros atributos.
GVA-ELAI-UPM
PFC0075-2003
r 57
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
UID de la imagen se usa también como UID de la instancia SOP. Este UID se usa
para identificar la instancia cuando se transfiere o se recupera desde un almacen de
imágenes o para identificar la entidad de la imagen usándola en un árbol jerárquico
de información.
Los primeros se usan para codificar los atributos descritos en el estándar IOD. Si
no hay extensiones o cambios en los IODs, la clase SOP es una clase SOP estándar.
58 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
usa el mismo UID que la clase SOP estándar. Las diferencias entre las dos clases
se muestra en el Estatuto de Conformidad.
Clase SOP especializada: cuando las adiciones cumplen con el modelo de infor-
mación, pero la clase ya no es un superconjunto. Como consecuencia, el UID de
la clase SOP estándar puede no ser usado; se debe usar un UID privado para
esta clase SOP. Los socios que manejan las instancias SOP conocen el UID pri-
vado y pueden manejar la información. Otros no pueden aceptar la clase SOP
durante la negociación de la asociación o, cuando se abre un archivo DICOM
desde un medio DICOM.
Si una de las tres clases SOP arriba mencionadas se definen con la intención de
llegar a ser parte del estándar DICOM, los detalles se publican en el Estatuto de
Conformidad. De otra forma, sólo se usan en un ambiente cerrado.
Todas las instancias de las imágenes SOP comparten un mı́nimo juego de infor-
mación que permite a una aplicación visualizadora manejar las imágenes independi-
entemente de su tipo.
Una clase de imagen SOP está disponible para encapsular las imágenes que no
están disponibles en el formato digital y sı́ capturadas en formato de pelı́cula o de
vı́deo.
Las instancias de las clases de las imágenes SOP tienen un conjunto básico de
atributos; ver figura 2.26. El conjunto mı́nimo de atributos requeridos para una in-
stancia de imagen SOP consiste en el siguiente grupo de atributos:
GVA-ELAI-UPM
PFC0075-2003
r 59
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Tipo de aparato.
Codificación de los pı́xeles: bits asignados, bits almacenados, bit alto, repre-
sentación de pixel, configuración plana.
Este mı́nimo conjunto permite mostrar los datos de pı́xel y proporciona la identi-
ficación en el nivel de sistema, para el caso de la instancia SOP para adherirla modelo
de la información. Añadiendo más información al menos para los tres primeros nive-
les del modelo de información, hace más entendible a la instancia SOP. Los atributos
que identifican la instancia SOP para seres humanos y permiten que la imagen sea
mostrada.
Añadiendo más información para al menos los tres primeros niveles del modelos de
la informacón, hace la instancia SOP más comprensible. Los atributos que identifican
60 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
la instancia SOP para los seres humanos y permiten que la imagen sea visualizada
con los correctos ajustes de ventana son:
Los atributos listados arriba son en la mayorı́a de los casos atributos del tipo 2
(deben ser suministrados, pero pueden faltar) o del tipo 3 (opcionales).
Radiografı́a computada IOD (Computed Radiography IOD), usada por los sis-
temas radiográficos tradicionales que trabajan con fósforo que brilla al leerse
con sistemas como PCR.
Tomografı́a computada IOD (Computed Tomography IOD) para escáneres CT.
Para este tipo de aparatos el posicionamiento es importante, para montones de
imágenes, para crear vistas tridimensionales.
Resonancia magnética IOD (Magnetic Resonance IOD) para sistemas MR. A
parte de la misma información que para escáneres CT también se da información
adicional sobre el protocolo de adquisición.
Medicina nuclear IOD (Nuclear Medicine IOD) para cámaras usan isótopos
radiactivos. Contienen imágenes de especial formato para este tipo de aparatos.
Las imágenes son en multimarco formato.
Ultrasonidos IOD (Ultrasound IOD) para este tipo de equipos. Estos contienen
detalles sobre la posición y la adquisición de la imagen. Las imágenes pueden
ser en color y se puede usar el multimarco.
GVA-ELAI-UPM
PFC0075-2003
r 61
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Angiografı́a con rayos-X IOD (X-Ray Angiographic IOD) para sistemas dig-
itales cardiológico y basculares. Este formato puede capturar una cadena en
multimarco o imágenes simples.
Por cada uno de los IODs, se describe una lista de módulos en el estándar DICOM.
El uso de unos ciertos módulos a veces dependen de capacidades o condiciones de cier-
tos sistemas. Los módulos se seleccionan, o bien desde un grupo de módulos comunes
usados para todos los IODs de almacenamiento SOP, o bien desde módulos especı́ficos
para sólo un tipo de IOD.
Estos módulos contienen atributos especiales para ese tipo de IOD. Esos módulos,
y a veces atributos individuales, los redefinen y extienden para el IOD genérico. En
el estándar DICOM los IOD, IOM y los atributos se listan.
La Clase SOP Secondary Capture es una especial Clase SOP de imagen. Es uti-
lizado para el almacenamiento de imágenes en formato diferente al de DICOM, dentro
de un ambiente de DICOM convirtiéndolas al formato de DICOM. De esta manera la
informaciónde la imagen en formato diferente al de DICOM se puede combinar con la
información de la imagen de los sistemas DICOM que pertenecen al mismo estudio.
Esta Clase SOP incluye imágenes capturadas de equipos de pelı́cula digital, cap-
turas de pantallas, etc. El Secondary Capture IOD no contiene ningún detalle sobre
la modalidad y la adquisición de los datos de la imagen. Da solamente los detalles
sobre cómo los datos de la imagen fueron capturados.
El IOD permite que la imagen sea manejada como cualquier otra modalidad. En
un número de casos contiene solamente los valores del nivel de gris de una captura de
pantalla que pueda verse. Por ejemplo, una imagen hecha con una captura de pantalla
contiene solamente los niveles grises en la matriz del pixel (como una fotografı́a).
Pero, en otros casos, contiene una matriz verdadera del pixel que necesite un valor
de pixel a la conversión de gris, permitiendo la manipulación de la representación. Esto
permite utilizar la Clase SOP Secundary Capture para almacenar datos de la imagen
en modalidades para las cuales no hay IOD estándar disponible. Esto requiere el retiro
de toda la información relacionada modalidad de la adquisición, de la colocación y
otros. Solamente el paciente, el estudio, la serie, el recubrimiento, y otra información
adicional que esté disponible.
62 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Una tuberı́a del procesamiento de una imagen describe los pasos del proceso que
traducen la información adquirida (por X-Ray, SR., ultrasonidos, equipo, etc.) a una
imagen presentada en un vı́deo o muestra una pelı́cula. Algunos de los pasos del pro-
ceso dependen del sistema de la adquisición, otros mejoran la presentación, o utilizan
una serie de información adquirida para crear las imágenes derivadas (substracción,
imágenes tridimensionales, etc.). Los siguientes pasos del proceso se han distinguido:
Pasos del proceso de la presentación dando por resultado una imagen que es
mostrada o impresa.
GVA-ELAI-UPM
PFC0075-2003
r 63
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Los diversos tipos de pasos del proceso y de los datos transferidos de la imagen se
muestran en el cuadro 2.27.
El proceso para este tipo de imágenes incluye funciones tales como substracción
digital, ciertos dominios de filtración de frecuencia o combinar partes de imágenes a
una sola imagen más grande.
Para este tipo de proceso los datos de la imagen tienen que estar acompañados
con la información de los pasos del proceso para que puedan ser invertidos, proce-
sando parámetros e indirectamente para los pasos que se realizarán, la adquisición
adicional y colocado de la información, etc. Las Instancias SOP usadas para este tipo
de imagenes, no se piensan para el uso general, ası́ que una Clase SOP especializada
o privada es necesaria. La información se divulga solamente a las partes implicadas.
64 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
La entrada de este proceso de presentación requiere que los pasos del proceso que
preceden creen valores del pixel de tal manera que todos los valores del pixel tienen
un valor significativo unos con respecto a otros. Estos valores dependen del tipo de
sistema o/y del uso de los datos de la imagen.
En un número de situaciones los valores del pixel provistos por los pasos prece-
dentes (adquisición e intermedio del proceso) tienen que ser utilizados para la trans-
formación posterior. Esto requiere a veces otra relación entre los valores de pixel según
lo esperado por los pasos del proceso de la presentación. Por ejemplo la relación entre
los valores de pixel estan en una escala logarı́tmica y no proporcional a las medidas
fı́sicas. Antes de que la conversión a los niveles grises pueda ocurrir un paso del pro-
ceso debe ocurrir, basado en los valores provistos junto con los valores del pixel; véase
el cuadro 2.29.
Según algunos usos clı́nicos la exhibición de la información adquirida tiene que ser
GVA-ELAI-UPM
PFC0075-2003
r 65
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Figura 2.29: Datos de pixel con la conversión de los valores del pixel
Pasos de la Presentación
Los pasos de la presentación convierten los valores del pixel a una imagen exhibida
en la pantalla o pelı́cula de video. Estos pasos tienen en cuenta los siguientes puntos:
Los valores del pixel no pueden tener ninguna relación o valor semántico correcto
(no linear, no escalado, etc.).
Una gama de los valores del pixel debe ser presentada.
La representación del valor del pixel en la pantalla o la pelı́cula de video debe
ser perceptualmente correcta.
66 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
dispositivo. El resultado de las primeras dos funciones debe dar lugar a una gama
de los valores del nivel de gris que se aseguran de que el resultado de la corrección
dependiente del dispositivo sea igual en diversos sistemas. Estas dos o tres funciones
tienen que ser aplicadas a los datos del pixel en un paso de proceso para prevenir la
pérdida de calidad de la imagen debido a la acumulación de errores de redondeo en
cada función.
La última manera de describir una conversión no linear tiene una desventaja im-
portante. Introduce cambios precipitados en el valor de la salida cuando la entrada
GVA-ELAI-UPM
PFC0075-2003
r 67
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
valora pasos en un lı́mite de la gama. Si una secuencia de estas tablas del look-up
(LUT) se está utilizando, baja la calidad de la actual imagen. También no permite
que la composición de las funciones sea realizada en un paso (prevenir la pérdida de
la calidad de la actual imagen). La carencia de las posibilidades para especificar una
función no lineal en forma de un fórmula matemática es una desventaja importante
de las definiciones actuales de DICOM.
Para las imágenes transferidas con DICOM, se definen un número de módulos que
contienen la información para el paso de la presentación descrita arriba:
Módulo del pixel de la imagen que contiene los valores de la muestra del pix-
el, almacenado en una cadena de los datos del pixel, con las cualidades que
describen la codificación y el formato de la matriz del pixel.
Modalidad LUT (MOD LUT) con una descripción de la función para la conver-
sión. Figura 2.30.
Valor de interés LUT (VOI LUT) con una descripción de la función de selec-
cionar una ventana en la gama de los valores del pixel. Figura 2.30.
Sobreponga móduloslos cuales agregan la información gráfica para ser mostrar
que sobrepone la imagen exhibida.
Dependiendo del requerimiento del procesado del módulo MOD LUT, el módulo
VOI LUT o ambos pueden estar presentes al lado del módulo del pixel de la imagen.
Un VOI LUT es muy probable estar presente para poder mostrar correctamente las
imágenes par ciertas aplicaciones clı́nicas.
Paso de decodificar
El proceso de descodificación de la matriz del pixel desde las cadenas del Cell
Pixel, es utilizando dos grupos de cualidades del Image Pixel Module. Vea la figura
2.31
68 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Bits Allocated, Bits Stored, y High Bit para decodificar el Pixel Sample Values
desde Pixel Data Stream, y
Filas, columnas, muestras por pixel y configuración planar para pedir las mues-
tras del pixel en la matriz de la imagen.
Una sola muestra del valor del pixel se contiene en una célula de pixel (Cell Pixel).
Además del valor de la muestra, otro pixel de información puede ser almacenado en el
espacio no ocupado por la célula del pixel. La secuencia de los valores del Sample Pixel
se almacenan en la matriz del pixel con la dimensión en la columna, fila, muestras
por atributos del pixel. Cuando se utiliza más de un plano, la configuración planar
describe cómo los valores de la muestra se ordenan en la secuencia de datos del pixel.
Los atributos del Pixel Representation contiene el formato de datos de los valores
de la muestra del pixel: enteros con signo o sin signo.
Paso de Normalización
GVA-ELAI-UPM
PFC0075-2003
r 69
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
para los sistemas CT los valores de la muestra del pixel se convierten a la escala de
Hounsfield, etc.
En caso de que solamente una escala pueda ser utilizada, dos atributos son nece-
sarios describir la función:Rescale Slope y Rescale Intercept; ver la figura 2.32
Cuando una conversión no linear tiene que ser aplicada se utiliza el mecanismo de
la tabla del “look-up”.
La ventana es descrita por dos atributos. Los dos atributos permiten solamente una
conversión linear del rango seleccionado, la conversión no linear se pueden alcanzar
por medio de una tabla “look-up”. Cuando no se utiliza ninguna tabla, las ventanas
son descritas por el valor de centro del pixel (centro de la ventana) y el tamaño de la
ventana (anchura de la ventana); ver figura 2.33.
70 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
Paso de Recubrimiento
Uno o más módulos separados especifican donde los bitmap del recubrimiento se
deben colocar en la matriz de la imagen. Opcionalmente, el color de los contornos
puede ser especificado. Los bitmap que pertenecen a estas imágenes se pueden incluir
en la secuencia de datos del pixel o en matrices separadas del pixel.
En las posiciones correspondientes en la matriz del pixel, tienen que ser fijados los
valores para el contorno del recubrimiento antes de enviar la imagen del nivel gris al
paso siguiente.
Los valores convertidos de la muestra del pixel tienen que ser corregidos para
alcanzar una comprensión correcta de la imagen. Las correcciones son el dispositivo y
el entorno dependiente y tienen que ser determinadas por el calibrado del dispositivo
e incorporando el resultado de la calibración como función de la corrección que se
aplicará a los valores del nivel gris.
Para prevenir la pérdida de calidad debido a la ejecución de las dos o tres funciones
(véase la figura 2.30) por separado, todas las funciones tienen que ser combinadas en
una tabla “look-up” que convierta los valores almacenados del pixel directamente
en una representación perceptualmente correcta. Esto, sin embargo, funcionará sola-
mente cuando todas las funciones se describen y no se almacenan matemáticamente
en tablas “look-up”.
GVA-ELAI-UPM
PFC0075-2003
r 71
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
En el intercambio de datos entre los sistemas, cada sistema puede tener diver-
sas vistas de la información, aunque toda la información de la Image SOP Instance
esté transferida entre cada sistema implicado. Incluso cuando un sistema en una cade-
na no está utilizando la información, otro sistema que está utilizando la información,
está confiando en pasar la información completa de la cadena entera, véase la figura
2.34.
En primer lugar, estos atributos se usan para recoger todos los datos de las
imágenes pertenecientes al mismo estudio. La instancia UID del estudio (Study In-
stance UID) es el atributo clave. Pero cuando éste no se usa consistentemente, se
tienen que usar otros atributos como el ID del paciente, número de acceso, etc.
En segundo lugar, unos atributos pueden ser usados por sistemas que quieren en-
contrar instancias de imagen SOP en el sistema de almacenamiento. La clave principal
72 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
en este caso es la instancia UID del estudio y la instancia UID de la serie. Son posibles
también búsquedas basadas en el nombre del paciente, fecha del estudio, etc.
Estaciones de revisión
Una estación de revisión es básicamente usada para visualizar las imágenes hechas
en uno o varios aparatos. Recoge o busca las instancias de imagen SOP, en un sistema
de almacenamiento, perteneciente a un cierto estudio. Mostrará la imágen junto a la
información del paciente, ajustes de adquisicóon, información del diagnóstico, etc.
Las estaciones de trabajo capaces de procesar los datos de las imágenes tienen re-
querimientos adicionales. Se necesitan los parámetros de adquisición y posicionamien-
to para la realización de pasos adicionales de procesamiento. Dependiendo del tipo
de procesamiento la entrada es un conjunto de imágenes procesadas o no procesadas.
En este caso, en la relación entre las imágenes, es importante ordenar los datos de las
imágenes de forma correcta para el procesamiento.
Los resultados de este procesamiento son nuevos datos de pı́xeles que son almace-
nados en una nueva instancia de imagen SOP que tiene su propio ciclo de vida, en la
mayorı́a de los casos, relaciones con los datos originales usados por la imagen.
GVA-ELAI-UPM
PFC0075-2003
r 73
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Reutilización de datos
Categorı́as de aplicación
74 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 2.3. ESTÁNDAR DICOM
(CTNS) que trabajan como servidores para retener imágenes y administrar la red.
Los fabricantes conectan a estos CTNS para usar su implementación del Estándar
de DICOM, y usando el servicio clases, o envı́os, recibe, inquiere, o “imprimen” las
imágenes (imprimir sobre la pelı́cula que requiere un procesamiento mojado no es
factible en el área de diagnóstico a causa de los requisitos de tuberı́a). Los fabricantes
pueden escoger también enviar imágenes, o recibir imágenes de un fabricante diferente.
Algunos fabricantes pueden cumplir también una conexión al equipamiento en el área
Técnica de documentos de prueba, y algunos pueden mostrar la implementación de
la interfase HIS/RIS con apoyo del servicio de clases (el servicio de dirección clases).
Mediante un número importante de esfuerzos independientes de implementación, la
calidad del patrón en suplementario hace efectiva la interoperatibilidad, que ya se ha
demostrado. El alcance de la imagen médica se extiende más allá de las imágenes
radiológicas. Endoscopistas, patólogos, dentistas, y dermatólogos (por nombrar sólo
cuatro justo áreas de especialidad) todas trabajan con imágenes como parte de su
práctica.
Cada aplicación que necesita grabar archivos en un medio puede requerir medios
diferentes. Por ejemplo, la cardiologı́a necesita un medio de alta capacidad con acceso
rápido para pelı́cula de cine de 35 mm. Los especialistas de ultrasonidos no cardiacos,
sin embargo, probablemente no necesitarı́an tan alta capacidad, aunque ellos necesiten
GVA-ELAI-UPM
PFC0075-2003
r 75
CAPÍTULO 2. EL ESTADO DE LA TÉCNICA Fernando Ballesteros Herranz
Sin una duda, DICOM es de los más ambiciosos proyectos en imagen médica
emprendido por la industria y sociedades profesionales. Es un patrón complejo a
causa del tamaño de su contenido, pero es implementable y útil. El estándar ofrece
un balance correcto entre el objetivo pragmático de apoyo de rápida implementación
en productos actuales y una fundación modular sólida que asegura una capacidad
para evolucionar y responder a futuras necesidades. La cantidad de trabajo ya hecha
sobre DICOM es una parte de la razón del interés desde otras especialidades que usan
imágenes. Mediante el uso de la experiencia disponible en sociedades profesionales,
han podido definirse objetos informativos y los servicios. Estos pueden hacer uso de
la estructura de DICOM para la implementación.
2.4. Conclusiones
Para estudiar el estándar a fondo hay que leer varias veces los conceptos, incluso
ası́ pueden haber dudas sobre ciertos temas que trata DICOM.
76 GVA-ELAI-UPM
PFC0075-2003
r
Capı́tulo 3
[KURA]
3.1. Introducción
77
CAPÍTULO 3. LIBRERÍAS DCMTK DE OFFIS Fernando Ballesteros Herranz
Estos requisitos pueden ser resueltos solamente con estándares. Desde que el sector
de medicina está distribuido y estructurado, la estandardización de interfaces desde
niveles bajos a niveles técnicos es de gran importancia, también para el desarrollo de
nuevos servicios, como por ejemplo la telemedicina.
1. El Comité DICOM
El Comité DICOM ha publicado el estándar DICOM, que ha llegado a ser el
más importante estándar de las imágenes médicas.
78 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 3.3. DESCRIPCIÓN DE DICOM SEGÚN OFFIS
Estructuras de datos, formatos para las imágenes médicas digitales con sus datos
relacionados.
Imágen: resolución,. . .
GVA-ELAI-UPM
PFC0075-2003
r 79
CAPÍTULO 3. LIBRERÍAS DCMTK DE OFFIS Fernando Ballesteros Herranz
80 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 3.4. LIBRERÍAS DCMTK
son un completo código fuente y han sido escritas en una mezcla de ANSI C y
C++. El Toolkit del DCMTK es un software libre y se puede descargar de la página
(http://dicom.offis.de/dcmtk.php.en).
El software DCMTK puede ser compilado bajo el Windows NT o una amplia gama
de sistemas operativos Unix que incluyen Linux, Solaris, OSF/1, IRIX, FreeBSD y
MacOS X. Todo lo necesario para la configuración y los makefiles son sumnirados. La
página oficial de Offis es www.offis.de
El archivo necesario para la instalación del Toolkit de Offis, depende del sis-
tema operativo que estemos utilizando, si es Windows el archivo a descargar es
dcmtk351.zip, y si es un sistema UNIX es dcmtk351.tar.gz. La instalación descrita
está basada en el sistema Windows, bajo el entorno Visual C++.
3. Para poder generar los ejecutables de cada función, hay que incluir los ficheros de
cabezeras (.h) al Visual C++ 6. Aquı́ pinchando en Tools->Options->Directories-
>Include files, se pueden incluir todos .h del Toolkit, tan solo poniendo el Path
en el que se encuentran, por ejemplo: C:\Archivos de programa\Microsoft Vi-
sual Studio\My Proyect\dcmtk351\dcmtk\dcmnet\include.
4. También es necesario dar el path donde se encuentran los .lib, que se hace
pinchando en Tools->Options->Directories->Library files, y se incluye el path.
De esta forma se incluyen los .lib y .h de forma permanente en el visual.
GVA-ELAI-UPM
PFC0075-2003
r 81
CAPÍTULO 3. LIBRERÍAS DCMTK DE OFFIS Fernando Ballesteros Herranz
Este Toolkit tiene diferentes funciones basadas en el estándar Dicom. Las funciones
son agrupadas en carpetas dependiendo de la función que desempeñen. Vease la figura
3.1.
Dcmimage: Fuciones para el tratamiento de los datos de los pixel de una imagen.
Sólo para imágenes Dicom sin comprimir.
82 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 3.4. LIBRERÍAS DCMTK
3.4.2. Dcmnet
Esta carpeta tiene las funciones para la conexión entre varias máquinas para crear
una asociación entre ellas y poder transmitir los datos de los objetos DICOM.
Echoscu: Esta aplicación implementa un Service Class User (SCU) para la ver-
ificación SOP Class. Envı́a un mensage Dicom C-ECHO a un Service Class
Provider (SCP) y espera una respuesta.
GVA-ELAI-UPM
PFC0075-2003
r 83
CAPÍTULO 3. LIBRERÍAS DCMTK DE OFFIS Fernando Ballesteros Herranz
Esta aplicación es realizada sobre dos máquinas, una será Galileo que actuará de
SCP y otra será Gauss que será el SCU. Pondremos la opción -v la cual nos dirá en
todo momento que asociación se está realizando, dando detalles sobre ella.
Paso3o : Se envı́a una imagen Dicom a Galileo (SCP), volviendo a intentar realizar
una asociación Dicom con una aplicación que corra sobre Galileo. Es enviada una
petición C-STORE que contiene una imagen Dicom “craneo.dcm” y se espera una
respuesta C-STORE de Galileo.
84 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 3.4. LIBRERÍAS DCMTK
3.4.3. Dcmjpeg
Esta carpeta tiene las funciones para la compresión con y sin pérdidas de imágenes
jpeg.
Dcmj2pnm: Lee una imagen DICOM y convierte los datos de los pixel según
las opciones del procesamiento de imágenes seleccionadas, PPM/PGM, BMP,
TIFF o JPEG.
3.4.4. DicomScope
Process log: Muestra los procesos que se han llevado a cabo en la transmisión
de archivos Dicom.
1
Presentation states
2
Structured Reports
GVA-ELAI-UPM
PFC0075-2003
r 85
CAPÍTULO 3. LIBRERÍAS DCMTK DE OFFIS Fernando Ballesteros Herranz
Instalación
Browser
Es la base de datos del DicomScope donde se almacenan los estudios Dicom. Tiene
una estructura de árbol en la que cada estudio es una rama, y puede tener varias ramas
a su vez, puede tener imágenes, informes estructurados, imágenes de escalas de grises
y estados de presentación.
Para enviar estudios a otra máquina, se elige el estudio que se quiere enviar y se
presiona la tecla send, entonces se abre una ventana en la que hay que se elige la
forma de enviar los estudios. Hay tres formas:
86 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 3.4. LIBRERÍAS DCMTK
Para poder configurar a que máquinas son enviados los estudios y que puerto
se utiliza para la asociación, se hace mediante el archivo “DICOMscope.cfg” que se
encuentra en X:\. . . \DICOMscope351, escribiendo a que hostname quiere ser enviado
y el port.
Una cuestión importante en los archivos de configuración es que las lı́neas que
empiezan por # son comentarios y éstas no son consideradas para la configuración de
la aplicación. Vease figura 3.3
GVA-ELAI-UPM
PFC0075-2003
r 87
CAPÍTULO 3. LIBRERÍAS DCMTK DE OFFIS Fernando Ballesteros Herranz
GAUSS
Type = Storage
Aetitle = Storage
Hostname = Galileo
MaxPDU = 32768
Port = 10004
ImplicitOnly = false
DisableNewVRs = false
GALILEO
Type = Storage
Aetitle = Storage
Hostname = Gauss
MaxPDU = 32768
Port = 10004
ImplicitOnly = false
DisableNewVRs = false
BitPreservingMode = false
Viewer
Todas las instancias Dicom que se carguan, pasan a verse en el Viewer. Es una her-
ramienta para tratar las imágenes Dicom y cambiar y editar informes estructurados,
88 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 3.4. LIBRERÍAS DCMTK
Process Log
Uno es para que el DicomScope sirva como receptor de instancias Dicom con
transmisión insegura, sin utilizar TLS. Este proceso utiliza la orden C-STORESCP,
con esto recibe y guarda en la base de datos los archivos Dicom mandados a
este equipo, utilizando el puerto 10004.
El otro proceso recibe las instancias Dicom utilizando TLS, de esta forma la
transmisión de datos es segura. También utiliza la orden C-STORESCP y el
puerto elegido es el 10007.
GVA-ELAI-UPM
PFC0075-2003
r 89
CAPÍTULO 3. LIBRERÍAS DCMTK DE OFFIS Fernando Ballesteros Herranz
3.5. Conclusiones
La gran ventaja de estas librerı́as es que son un producto “freeware”, es decir, que
son un producto gratuito.
Son muy útiles para gente experta en C++ y Dicom, pero de lo contrario si se
intenta trabajar con estas librerı́as sin reunir uno de los dos requisitos puede llegar a
ser muy pesado.
90 GVA-ELAI-UPM
PFC0075-2003
r
Capı́tulo 4
Programación en JAVA
4.1. Introducción
91
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
Hay dos instalaciones posibles de la JVM, o bien la instalación del JRE2 , la cual
sirve para que se puedan ejecutar las apliaciones desarrolladas en Java pero no posee
2
Java Runtime Environment
92 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 4.2. INSTALACIÓN DE LA JVM
compilador para los ficheros fuente, o bien la instalación del SDK que si tiene compi-
lador para desarrollar aplicaciones.
C:\J2SDK1.4.1_03\BIN;
CLASSPATH
y en valor de variable el camino hasta la carpeta lib donde está dt.jar que son
las clases del JDK:
C:\j2sdk1.4.1_03\lib\dt.jar;.;
3
Para la versión 1.4.1
GVA-ELAI-UPM
PFC0075-2003
r 93
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
el valor de ;.; es para poder compilar cualquier fichero fuente desde cualquier
directorio y no deba ser desde el directorio donde está el compilador.
2. Una vez abierto en la lı́nea de SET PATH hay que incluir la carpeta del com-
pilador:
3. Crear el CLASSPATH y dar le localización de las librerı́as del JDK, para ello
escribir debajo del PATH:
Una vez compilado no deberı́a ser necesaria ninguna modificación por el hecho
de cambiar de procesador o de ejecutarlo en otra máquina. La clave consistió en
desarrollar un código “neutro” el cual estuviera preparado para ser ejecutado sobre
la JVM.
Para realizar una aplicación con el compilador del SDK, se debe escribir el código
en Java en un editor de texto cualquiera como puede ser el “Bloc de Notas”. Una vez
escrito debe ser guardado el fichero con extensión .java, por ejemplo nombre.java. La
compilación debe realizarse con un “shell” de comandos, como el del MSDOS. Para
realizar la compilación escribir:
4
JDK para las antiguas versiones y SDK para las nuevas versiones
94 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 4.4. VARIABLES Y TIPOS DE DATOS
Todo ello se realiza en el directorio donde se encuentre el fichero fuente .java. Ver
figura 4.3
Java Sun ha realizado un API para la ayuda y consulta de las clases que se
pueden utilizar con el SDK. Esta ayuda es de importancia vital para el buen uso y
comprensión de java. Ver http://java.sun.com
4.4.1. Comentarios
/* Comentario que
aparece en varias lı́neas*/
GVA-ELAI-UPM
PFC0075-2003
r 95
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
4.4.2. Identificadores
Las palabras clave reservadas son identificadores especiales que el lenguaje Java
se ha reservado para controlar cómo está definido su programa. Se utilizan para iden-
tificar los tipos, modificadores y mecanismos para control de secuencia incorporados.
Estas palabras clave sólo se pueden utilizar para su propósito original y no se pueden
utilizar como identificadores de nombres de variable, clase o método.Véase la lista 4.4
4.4.4. Variables
El tipo puede ser: byte, short, int, long, char, float, double, boolean o el nombre
de una clase o interfaz.
96 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 4.4. VARIABLES Y TIPOS DE DATOS
Los bloques de sentencias compuestas en Java se delimitan con dos llaves . Las
variables de Java sólo son válidas desde el punto donde están declaradas hasta el final
de la sentencia compuesta que la engloba. Se pueden anidar estas sentencias com-
puestas y cada una puede contener su propio conjunto de declaraciones de variables
locales. Sin embargo, no se puede declarar una variable con el mismo nombre que una
de un ámbito superior.
Tipos
Enteros que son todos los tipos numéricos de Java son valores con signo. Esta
ausencia de signo reduce el número de tipos de entero a cuatro:
• byte es un tipo de 8 bits con signo. Su rango comprende desde -128 a 127.Su
declaración puede ser:
byte b;
byte c = 0x55;
• short es un tipo de 16 bits con signo. Su rango comprende desde -32768 a
32767. Declaración:
short s;
short t = 0x55aa;
• int es un tipo de 32 bits con signo. Su rango comprende desde -2.147.483.648
a 2.147.483.647. Es el tipo más utilizado habitualmente para almacenar
valores enteros simples.
int n;
int m = 10;
• long es un tipo de 64 bits con signo. Hay algunas ocasiones en las que
un tipo int no es lo suficientemente grande como para guardar un valor
deseado.
long j;
Los números en coma flotante, también conocidos como números reales en otros
lenguajes, se utilizan cuando se calculan funciones que requieren precisión frac-
cionaria. Hay dos clases de tipos en coma flotante, float y double:
Lógico o booleano, utiliza 1 bit, y sólo puede tener dos valores TRUE o FALSE
GVA-ELAI-UPM
PFC0075-2003
r 97
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
boolean p;
Caracteres, dado que Java utiliza Unicode para representar los caracteres de
una cadena, el tipo char es de 16 bits sin signo.
char a = ’h’;
Conversiones
Hay situaciones en las cuales se tiene un valor de un tipo dado y se desea almacenar
ese valor en una variable de un tipo diferente. En algunos tipos es posible almacenar
simplemente el valor sin una conversión de tipos; lo que se denomina conversión
automática. Esto sólo es posible en Java si el compilador reconoce que la variable
destino tiene la suficiente precisión para contener el valor origen, como almacenar un
valor byte en una variable int. A esto se le llama ensanchamiento o promoción, dado
que el tipo más pequeño se ensancha o promociona al tipo compatible más grande. Si
por el contrario, se desea asignar un valor de variable int a una variable byte se necesita
realizar una conversión de tipos explı́cita. A esto se le llama estrechamiento, dado que
se estrecha explı́citamente el valor para que quepa en el destino. La conversión de un
tipo se realiza poniendo delante un nombre de tipo entre paréntesis.
int a = 100;
byte b = (byte) a;
Las matrices son un tipo especial que agrupa un conjunto de variables del mismo
tipo. Si se desea crear una matriz de doce enteros, se crea un tipo especial, que es
una “matriz de int”.
int days[];
Para las matrices, hay un valor especial llamado null, que representa una matriz sin
ningún valor. Se debe utilizar un operador especial, “new” (nuevo), para asignar el
espacio de una matriz. Para utilizar el operador “new” se debe promocionar un tipo
y un número entero no negativo de elementos a asignar.
98 GVA-ELAI-UPM
PFC0075-2003
r
Fernando Ballesteros Herranz 4.5. OPERADORES
4.5. Operadores
Los operadores de Java son caracteres especiales que le dicen al compilador que
se desea realizar una operación sobre algunos operandos.
Suma: +
Resta: -
Multiplicación: *
División: /
Resto: %
Preincremento: ++x
Postincremento: x++
Predecremento: - -x
Postdecremento: x- -
normal: x = y
adicción: x+=y ó x=x+y
resta: x-=y ó x=x-y
multiplicación: x*=y ó x=x*y
división: x/=y ó x=x/y
GVA-ELAI-UPM
PFC0075-2003
r 99
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
Los tipos numéricos enteros, long, int, short, char y byte tienen un conjunto adi-
cional de operadores que pueden modificar e inspeccionar los bits que componen sus
valores.
El operador AND, &, combina los bits de manera que se obtiene un 1 si ambos
operandos son 1, obteniendo 0 en cualquier otro caso.
00101010 42
& 00001111 15
= 00001010 10
00101010 42
| 00001111 15
= 00101111 47
Para comparar dos valores, Java tiene el siguiente conjunto de operadores relaciónales
que describen igualdad y ordenamiento. Ver figura 4.5
Todos los operadores lógicos booleanos combinan dos valores boolean para dar
como resultado un valor boolean. Ver 4.6
GVA-ELAI-UPM
PFC0075-2003
r 101
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
La cláusula else es opcional. Cada una de las sentencias puede ser una sentencia
compuesta encerrada entre llaves, { }. Una expresión-booleana es cualquier expre-
sión que devuelve un valor boolean. Podrı́a ser una variable simple declarada como
boolean.
boolean datosdisponibles;
if (datosdisponibles)
ProcesarDatos();
else
esperarAMasDatos();
switch ( expresión ){
case valor1:
instrucciones;
break;
case valor2:
instrucciones;
break;
default:
}
El valor de expresión se compara con cada uno de los valores literales de las sen-
tencias case. Si coincide con alguno, se ejecuta el código que sigue a la sentencia case.
Si no coincide con ninguno de ellos, entonces se ejecuta la sentencia default (por defec-
to). La sentencia default es opcional. La sentencia break, comentada anteriormente,
hace, en este caso, que la ejecución salte al final del switch. Si no se pone el break, la
ejecución continuará en el siguiente case. . La sentencia “break” de Java está diseñada
para cubrir aquellos casos en los que saltar arbitrariamente a una porción de código
es una constucción valiosa y legı́tima para el control del flujo. El término break se
refiere al acto de salirse de un bloque de código. Le dice al intérprete que retome la
ejecución pasado el final del bloque.
4.6.3. Bucles
Bucle while
Ejecuta una sentencia repetidamente mientras una expresión booleana sea ver-
dadera. Esta es su forma general:
[ inicialización; ]
while ( terminación ) {
cuerpo;
[ iteración; ]
}
Bucle do-while
[ inicialización; ]
do { cuerpo; [ iteración; ] } while ( terminación );
GVA-ELAI-UPM
PFC0075-2003
r 103
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
Bucle for
return
Java utiliza una forma de subrutina llamada método para implementar una in-
terfaz de procedimiento a las clases de objetos. En cualquier momento dentro de un
método, se puede utilizar la sentencia “return” para que la ejecución salte y vuelva al
punto donde se llamó al método. Se utiliza para acarbar los métodos. Si es un método
void, la sentencia serı́a:
return;
continue
Del mismo modo que se desea salir prematuramente de un bucle (con “break”),
se podrı́a desear continuar en el bucle, pero dejar de procesar el resto de código en
esta interación en concreto. La sentencia continue de Java salta del cuerpo de bucle,
pero permaneciendo en el bucle.
4.7. Clases
class punto{
}
Las clases de Java tı́picas incluirán variables y métodos de instancia. Los programas
en Java completos constan por lo general de varias clases de Java de distintos archivos
fuente. Una clase define la estructura de un objeto y su interfaz funcional, conocida
como métodos. Cuando se ejecuta un programa en Java, el sistema utiliza definiciones
de clase para crear instancias de las clases, que son objetos reales. La forma general
de una clase se muestra a continuación.
GVA-ELAI-UPM
PFC0075-2003
r 105
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
Cada nueva clase que se crea añade otro tipo que se puede utilizar igual que los
tipos simples. Por lo tanto, cuando se declara una nueva variable, se puede utilizar un
nombre de clase como tipo. A estas variables se las conoce como referencias a objeto.
Los datos se encapsulan dentro de una clase declarando las variables dentro de las
llaves de apertura y cierre de la declaración de la clase. A las variables que se declaran
en este ámbito y fuera del ámbito de un método concreto se las conoce como variables
de instancia. Este ejemplo declara una clase de nombre Point, con dos variables de
instancia enteras llamadas x e y.
class Point {
int x, y;
}
El operador new crea una única instancia de una clase y devuelve una referencia a
ese objeto. Aquı́ se crea una nueva instancia de Point y se almacena en una variable
p.
4.7.4. Operador(.)
El operador punto se utiliza para acceder a las variables de instancia y los métodos
contenidos en un objeto. Esta es la forma general de acceder a las variables de instancia
utilizando el operador punto.
p.x = 10;
p.y = 20;
System.out.println("x = " + p.x + " y = " + p.y);
Los métodos son subrutinas unidas a una definición de una clase especı́fica. Se
declaran dentro de una definición de clase al mismo nivel que las variables de instancia.
Se debe llamar a los métodos en el contexto de una instancia concreta de esa clase.
Se podrı́a crear un método en la clase Point que inicialice las variables de instancia
de la forma siguiente:
clase Point {
int x, y;
void init(int x, int y) {
this.x = x;
this.y = y;
}
}
GVA-ELAI-UPM
PFC0075-2003
r 107
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
El método main()
Dado que no hay funciones globales en Java, se debı́a idear alguna manera de
iniciar un programa, de ahı́ el sentido del método main, a partir de este método
es donde empiezan los programas. Esto es un concepto perdido en la creación de
interfaces gráficas. El método main es simplemente un lugar de inicio para que el
intérprete comience. Un programa complejo tendrá docenas de clases, y sólo una de
ellas necesitará tener un método main.
En este caso, se puede llamar al método “init” sobre cualquier objeto Point.
4.7.7. Constructores
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class PointCreate {
public static void main (String args[]) {
Point p = new Point(10, 20);
System.out.println("x = " + p.x + " y = " + p.y);
}
}
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
Point() {
x = -1;
y = -1;
}
}
class PointCreateAlt {
public static void main (String args[]) {
Point p = new Point();
System.out.println("x = " + p.x + " y = " + p.y);
}
}
Este ejemplo crea un objeto Point que llama al segundo constructor sin parámetros
en vez de al primero.
Éste es un operador que utilizan las clases para hacerse referencias a sı́ mismas. De
esta forma un objeto siempre puede tener referencias a sus variables. Muy utilizado
en los constructores.
GVA-ELAI-UPM
PFC0075-2003
r 109
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
Point() {
this(-1, -1);
}
}
4.7.10. Herencia
La palabra clave extends se utiliza para indicar que se desea crear una subclase
de Point. No se necesita declarar las variables x e y en Point3D porque se habı́an
heredado de Point. Todas las variables x, y, z están en el mismo ámbito desde la
perspectiva de una instancia de Point3D.
super
Hay una variable especial en Java llamada “super”, que se refiere directamente a
los constructores de la superclase. Este ejemplo define una nueva versión de Point3D
final
Todos los métodos y las variables de instancia se pueden sobrescribir por defecto.
Si se desea declarar que ya no se quiere permitir que las subclases sobrescriban las
variables o métodos, éstos se pueden declarar como final. El modificador de tipo final
implica que todas las referencias futuras a este elemento se basarán en esta definición.
Se puede utilizar final como modificador en declaraciones de método cuando se desea
no permitir que las subclases sobrescriban un método concreto.
static
A veces se desea crear un método que se utilize fuera del contexto de cualquier
instancia. Todo lo que se tiene que hacer es declarar estos métodos como “static”
(estático). Los métodos estáticos sólo pueden llamar a otros métodos static directa-
mente, y no se pueden referir a this o super de ninguna manera. Las variables también
se pueden declarar como static, pero debe ser consciente que es equivalente a declarar-
las como variables globales, que son accesibles desde cualquier fragmento de código.
Se puede declarar un bloque static que se ejecuta una sola vez si se necesitan realizar
cálculos para inializar las variables static.
abstract
Las clases abstractas son aquellas cuya descripción es incompleta. Se definen uti-
lizando la palabra reservada abstract. No proporcionan la implementación de todos
sus métodos. Los métodos no implementados se declaran como abstract. Una clase
con un método abstracto tiene que declararse como abstract. Una clase abstracta no
puede instanciarse, es decir, no pueden crearse objetos de esa clase.
GVA-ELAI-UPM
PFC0075-2003
r 111
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
4.8.1. Paquetes
Sentencia package
Lo primero que se permite en un archivo Java es una sentencia package, que le dice
al compilador en qué paquete se deberı́an definir las clases incluidas. Si se omite la
sentencia package, las clase terminan en el paquete por defecto, que no tiene nombre.
El compilador Java utiliza directorios de sistema de archivos para almacenar paquetes.
Si se declara que una clase está en dentro de un paquete llamado MiPaquete, entonces
el archivo fuente de esa clase se debe almacenar en un directorio llamado MiPaquete.
Sentencia import
Lo siguiente que se pone después de una sentencia package y antes de las defini-
ciones de clase en un archivo fuente en Java puede ser una lista de sentencias import.
Todas las clases interesantes están almacenadas en algún paquete con nombre. Para
no tener que introducir el largo nombre de trayecto de paquete para cada clase, Java
incluye la sentencia import para que se puedan ver ciertas clases o paquetes enteros.
La forma general de la sentencia import:
import java.util.Date;
import java.io.*;
protected: acceso en la clase, las subclases (en cualquier paquete) y desde las
clases del mismo paquete.
4.8.3. Interfaces
Las interfaces son como las clases, pero sin variables de instancia y con métodos
declarados sin cuerpo. Las clases pueden inplementar varias interfaces. Para imple-
mentar una interfaz, todo lo que necesita una clase es una implementación del conjun-
to completo de métodos de la interfaz. Las interfaces están en una jerarquı́a distinta
de la de las clases, por lo que es posible que varias clases que no tengan la más mı́ni-
ma relación en cuanto a la jerarquı́a de clases implementen la misma interfaz. Por
defecto todos sus métodos son públicos y abstractos, y sus atributos son públicos y
constantes. Los métodos que se declaran no tienen sentencias de cuerpo. Un ejemplo
de una interfaz es:
interface Callback {
void callback(int param);
}
GVA-ELAI-UPM
PFC0075-2003
r 113
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
Una cadena es una secuencia de caracteres. Las cadenas son una parte fundamental
de la mayorı́a de los programas, ası́ pues Java tiene varias caracterı́sticas incorporadas
que facilitan la manipulación de cadenas.
Java tiene una clase incorporada en el paquete “java.lang” que encapsula las es-
tructuras de datos de una cadena. Esta clase, llamada String es la representación
como objeto de una matriz de caracteres que no se puede cambiar.
4.9.1. Constructores
Como con todas las otros clases, se pueden crear instancias de String con el oper-
ador new.
Este ejemplo crea una instancia de String sin caracteres en ella. Para crear un
String inicializado con caracteres hay que pasarle una matriz de char al constructor.
String s = "mejor";
length
La clase String además tiene sus propios métodos, uno de los más habituales es
length, que devuelve el número de caracteres de una cadena.
String s = "abc";
System.out.println(s.length()); // imprime 3
Concatenación
El único operador que utiliza Java es + , y en los objetos String. El + actúa como
operador de concatenación en este caso en concreto para mejorar la legibilidad, por
ser operación muy común.
Comparación de cadenas
Si se desean comparar dos cadenas para ver si son iguales, puede utilizar el méto-
do equals() de String. Devuelve “true” si las cadenas de caracteres comparadas son
iguales.
Extracción de caracteres
Todos los objetos tienen el método toString() heredado de Object, de esta forma
cualquier objeto puede ser convertido en cadena. Ejemplo de int a String.
GVA-ELAI-UPM
PFC0075-2003
r 115
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
int entero = 5;
String cadena = new Integer(entero).toString();
Una excepción es una condición anormal que surge en una secuencia de código
durante la ejecución. La gestión de excepciones de Java lleva la gestión del error
en tiempo de ejecución al mundo orientado a objetos. Una excepción de Java es un
objeto que describe una condición excepcional que se ha producido en un fragmento
de código.
class Exc {
public static void main(String args[]) {
try {
int d = 0;
int a = 42;
} catch (ArithmeticException e) {
System.out.println("división por cero");
}
}
}
En algunos casos, la misma secuencia de código puede activar más de una condición
excepcional. Se pueden tener varias cláusulas catch en una fila. Se inspecciona cada
uno de estos tipos de excepción en el orden en que están y el primero que coincida se
ejecuta.
4.10.2. throw
GVA-ELAI-UPM
PFC0075-2003
r 117
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
4.10.3. finally
import java.io.*;
public class PruebaExcepciones {
public static char leer() throws IOException {
return (char) System.in.read();
}
public static void main(String args[]) {
try {
char car=leer();
System.out.println("Caracter: "+car);
} catch (IOException e) {
System.out.println("Error de entrada de datos");
}
}
}
4.11. Hilos
esperar a que se terminen cada una de estas tareas antes de proseguir con la siguiente.
Aunque la CPU esté libre la mayor parte del tiempo, tiene que colocar las tareas en
la cola ordenadamente.
Prioridades de hilo
Sincronización
Una vez que el programa se ha dividido en sus partes lógicas, a modo de hilo, es
preciso definir exactamente como se comunicarán entre si dichos hilos. Java utiliza
los métodos wait y notify para el intercambio de información entre hilos.
4.11.1. Thread
En Java los hilos se representa mediante una clase. La clase Thread encapsula
todo el control necesario sobre los hilos. Hay que tomar la precaución de distinguir
claramente un objeto Thread de un hilo en ejecución. Un objeto Thread se define
GVA-ELAI-UPM
PFC0075-2003
r 119
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
4.11.2. Runnable
Runnable es una interfaz simple que abstrae la noción de que se desea que algún
código se “ejecute” ası́ncronamente. Para implementar Runnable, a una clase le basta
con implementar un solo método llamado run. Este es un ejemplo que crea un nuevo
hilo.
}
System.out.println("saliendo del hilo hijo");
}
public static void main (String args []) {
new ThreadDemo();
}
}
El hilo main crea un nuevo objeto Thread, con new Thread (this, “Demo Thread”),
pasa this como primer argumento para indicar que el nuevo hilo llame al método run
sobre este objeto. A continuación se llama a start, lo que inicia el hilo “t” en la
ejecución a partir del método run. En estos momentos hay dos hlos en ejecución,
uno “ct” que continúa con el programa principal, lo que le lleva al primer try, y el
segundo salta desde start() al método run(). Después, el hilo main se duerme durante
3000 milisegundos antes de imprimir un mensaje y después termina. Demo Thread
todavı́a está contando desde cinco cuando sucede esto. Se continúa ejecutando hasta
que termina con el bucle de run. Esta es la salida después de cinco segundos:
El planificador de hilos hace uso de las prioridades de los mismos para decidir
cuándo debe dejar a cada hilo que se ejecute, de manera que los hilos con may-
or prioridad deben ejecutarse más a menudo que lo de menor prioridad. Cuando
está ejecutándose un hilo de baja prioridad, y otro de mayor prioridad se despierta
de su sueño, o de la espera por un operación de E/S, debe dejarse que se ejecute de
manera inmediata, desalojando al hilo de menor prioridad. Cuando los hilos son de
igual prioridad deben desalojarse los unos a los otros, cada cierto tiempo, utilizando
el algoritmo circular round-robin para gestionar el acceso al la CPU.
GVA-ELAI-UPM
PFC0075-2003
r 121
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
4.11.4. Sincronización
Sentencia synchronized
Si se utiliza una clase que no fue diseñada para accesos multihilo y, por ello,
se dispone de métodos no sincronizados que manipulan el estado interno,se puede
envolver la llamada al método en un bloque sincronizado. El formato general de la
sentencia sincronizada es el siguiente:
synchronized(objeto) sentencia;
wait: le indica al hilo en curso que abandone el monitor y se vaya a dormir hasta
que otro hilo entre en el mismo monitor y llame a notify.
notify: despierta al primer hilo que realizó una llamada a wait sobre el mismo
objeto.
notifyAll_: despierta todos los hilos que realizaron una llamada a wait sobre el
mismo objeto. El hilo con mayor prioridad de los despertados es el primero en
ejecutarse.
4.11.6. Métodos
Métodos de clase
Estos son los métodos estáticos que deben llamarse de manera directa en la clase
Thread.
Métodos de instancia
Estos son los métodos que deben llamarse desde instancias u objetos de la clase
Thread.
start: indica al intérprete de Java que cree un contexto de hilo del sistema
y comience a ejecutarlo. A continuación, el método run objeto de este hilo
será llamado en el nuevo contexto del hilo. Debe tomarse la precaución de no
llamar al método start más de una vez sobre un objeto hilo dado.
run: constituye el cuerpo de un hilo en ejecución. Este es el único método de
la interfaz Runnable. Es llamado por el método start después de que el hilo
apropiado del sistema se haya inicializado. Siempre que el método run devuelva
el control, el hilo actual se detendrá.
GVA-ELAI-UPM
PFC0075-2003
r 123
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
setPriority(int p): asigna al hilo la prioridad indicada por el valor entero pasado
como parámetro.
getPriority: devuelve la prioridad del hilo en curso, que es un valor entre 1 y 10.
4.12. Utilidades
4.12.1. Envolturas
Number
La clase abstracta Number representa una interfaz a todos los tipos escalares
estándar: long, int, float y double. Number tiene métodos de acceso que devuelven el
valor posiblemente redondeado del objeto de cada uno de los objetos simples:
Double y Float
Double y Float son subclases de Number. Ambas clases tienen dos constructores
para inicializarlas con valores double y float, o, lo que es muy práctico, se pueden
inicializar con una representación tipo String del valor:
Integer y Long
La clase Integer es una envoltura alrededor de int, short y byte. Long es una
envoltura alrededor del tipo long. Además de los métodos heredados de Number
tienen otros muy útiles:
parseInt(String, base) hace lo mismo que el método anterior, pero especifica una
base distinta de la décima.
Character
GVA-ELAI-UPM
PFC0075-2003
r 125
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
Boolean
Boolean es un envoltorio muy fino alrededor de valores boolean, que solo es útil
para situaciones de paso por referencia.
4.12.2. Enumeraciones
Java tiene matrices para almacenar grupos de datos de tipo similar, que son muy
útiles para modelos simples de acceso a datos. Sin embargo, las enumeraciones ofrecen
una manera más completa y orientada a objetos para almacenar conjuntos de datos
de tipo similar. Las enumeraciones tienen su propia asignación de memoria y posibil-
idad de una nueva asignación para ampliarlas. Tienen interfaces de método para su
iteración y recorrido. Se pueden indexar mediante algo más complejo y útil que los
simples enteros.
Interfaz de enumeración
Enumeracion es una interfaz simple que permite enumerar todos los elementos de
cualquier conjunto de objetos. Especifica dos métodos. El primero, un método boolean
llamado hasMoreElements, devuelve true cuando todavı́a quedan más elementos que
extraer. El segundo, nextElement devuelve una referencia a objeto genérica cuyo tipo
hay que convertir al tipo de clase de la cual el objeto es una instancia.
Vector
4.12.3. Runtime
Runtime rt = Runtime.getRuntime();
rt.exec("c:\\CntVirRel.exe");
4.12.4. System
System.out.println("Este es un ejemplo");
4.12.5. Date
La clase Date se utiliza para presentar una fecha y una hora. Se pueden manipular
el dı́a, mes, año, dı́a de la semana, horas, minutos y segundos. Hay varios constructores
para objetos Date. El más simple, Date(), inicializa el objeto con la fecha y hora
actual. Hay tres constructores más que ofrecen niveles de especificidad mayores para
la precisión que se desea para la hora:
GVA-ELAI-UPM
PFC0075-2003
r 127
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
Date(año, mes, dı́a) establecerá la hora a las 00:00:00 del dı́a especificado.
Date(año, mes, dı́a, horas, minutos) fijará la fecha y hora, dejando los segundos
a 0.
Date(año, mes, dı́a, horas, minutos, segundos) establecerá la hora exacta.
4.13. Entrada/Salida
La mayorı́a de los programas no pueden alcanzar sus metas sin acceder a datos
externos. Estos datos se recuperan a partir de un origen de entrada. Los resultados
de un programa se envı́an a un destino de salida. La noción genérica de una fuente
de entrada puede representar muchos tipos de entrada distintos: desde un archivo de
disco, un teclado o un conector (socket) de red. Estas abstracciones son una manera
limpia de tratar la E/S sin necesitar que todo el código comprenda la diferencia entre
un teclado y una red.
Java llama flujo a esta abstracción y la implementa con varias clases del paquete
java.io. El flujo de E/S representa todos los orı́genes y destinos de los datos detrás de
una interfaz uniforme. La entrada está encapsulada en la clase InputStream y la salida
en la clase OutputStream. Estas dos clases abstractas son las que todos los objetos
deberı́an referenciar cuando tratan la E/S en general. Sus métodos más importantes
son read() y write(int b); son métodos abstractos que definen la función básica de
lectura/escritura de un byte.
4.13.1. File
Los objetos archivo se pueden crear utilizando uno de los tres constructores
disponibles. El ejemplo siguiente crea tres archivo: f1, f2 y f3. El primer objeto File
se construye utilizando un trayecto de directorio como único argumento. El segundo
Directorios
import java.io.File;
class Dirlist {
public static void main(String args[]) {
String dirname = "/java";
File f1 = new File(dirname);
if (f1.isDirectory()) {
System.out.println("Directorio de " + dirname);
String s[] = f1.list();
for (int y = 0; i < s.length; y++) {
System.out.println(s[i] + " es un directorio");
}
} else {
System.out.println(dirname + " no es un directorio");
}
}
}
La ejecución de este programa lista el contenido del directorio /java del PC.
FilenameFilter
GVA-ELAI-UPM
PFC0075-2003
r 129
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
de nombre de archivo. Con este fin, el paquete java.io incluye una interfaz llamada
FilenameFilter. Un objeto que implemente FilenameFilter tiene un único método,
accept, al que se llama una vez por cada archivo de una lista. El método accept
devuelve el valor true si se debiera incluir el archivo en la lista. El ejemplo siguiente
amplı́a el programa anterior restringiendo la visibilidad de los nombres de archivo
devueltos por el método list. La restricción se aplica a archivos con nombres que
terminan con la extensión de archivo que se pasa como parámetro cuando se construye
le objeto:
import java.io.*;
public class OnlyExt implements FilenameFilter {
String ext;
public OnlyExt(String ext) {
this.ext = "." + ext;
}
public boolean accept (File dir, String name) {
return name.endsWith(ext);
}
}
4.13.2. InputStream
InputStream es una clase abstracta que define el modelo de Java para el flujo de
entrada. Todos los métodos de esta clase lanzarán una IOException si se producen
condiciones de error. Este es un breve resumen de los métodos de InputStream:
read() devuelve una representación como entero del siguiente byte de entrada
disponible.
read(byte b[], int off, int len) intenta leer hasta len bytes situándolos en b comen-
zando en b[off], y devuelve el número de bytes que se leyeron con éxito.
mark(int limitelectura) coloca una marca en el punto actual del flujo de entrada
que seguirá siendo válida hasta que se lean limitelectura bytes.
4.13.3. OutputStream
Igual que InputStream, OutputStream es una clase abstracta que define el flujo
de salida. Todos los métodos de esta clase devuelven un valor void y lanzan una
IOException en caso de error. Esta es una lista de los métodos de OutputStream:
write(byte b[], int off, int len) escribe len bytes de la matriz b, comenzando a
partir de b[off].
flush() inicializa el estado de la salida de manera que se limpian todos los buffers.
FileInputStream
La clase FileInputStream utiliza archivos de datos reales como base del flujo de
entrada. El ejemplo siguiente crea dos FileInputStreams que están utilizando el mismo
archivo de disco real.
GVA-ELAI-UPM
PFC0075-2003
r 131
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
FileOutputStream
ByteArrayInputStream
ByteArrayOutputStream
Los flujos filtrados amplı́an los flujos básicos, proporcionando una sincronización.
En un sistema de E/S multihilo, se pueden producir resultados inesperados cuando
se permite que múltiples hilos operen sobre el mismo flujo. Aunque es posible tener
hilos múltiples en Java leyendo o escribiendo en el mismo flujo, hay una buena razón
para permitir que sólo un hilo tenga acceso directo a un flujo de E/S único. Todos
los constructores y métodos proporcionados en esta clase son idénticos a los men-
cionados anteriormente para InputStream y OutputStream, a excepción de que están
sincronizados.
BufferedOutputStream
4.13.6. SequenceInputStream
SequenceInputStream(Enumeration e);
SequenceInputStream(InputStream s0, InputStream s1);
PrintStream
La clase PrintStream proporciona todas las utilidades de formato que hemos es-
tado utilizando desde el principio del libro de los descriptores de archivo de System.
Pensabas que se introducı́a “System.out.println” sin pensar demasiado en las clases
que proporcionaban el formato de la salida que se presentaba. PrintStream tiene
dos constructores, PrintStream(OutputStream sal) y PrintStream(OutputStream sal,
boolean auto), donde auto controla si java vacı́a el flujo de salida cuando vaya a la
salida un carácter de lı́nea nueva “\n”.
Los objetos PrintStream de Java admiten los métodos print y println para to-
dos los tipos, incluyendo Object. Si un argumento no se un tipo simple, los métodos
PrintStream llaman al método toString del objeto y a continuación imprimen el re-
sultado.
4.13.7. Ejemplo
Este primer ejemplo se muestra una forma cómoda y eficaz para la lectura ficheros
que en este caso se leen los datos del fichero LeeFichero.java y se imprimen por la
consola.
GVA-ELAI-UPM
PFC0075-2003
r 133
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
import java.io.*;
try {
FileInputStream FicheroOrigen = new FileInputStream
("LeeFichero.java");
try {
do {
NumBytes = FicheroOrigen.read(buffer);
System.out.print(new String(buffer,0,NumBytes));
} while (NumBytes == TAMANIO_BUFFER);
FicheroOrigen.close();
} catch (IOException e){
System.out.println("Error leyendo los datos o
cerrando el fichero");
}
} catch (FileNotFoundException e) {
System.out.println("Fichero no encontrado");
}
import java.io.*;
int NumBytes;
try {
FileOutputStream FicheroDestino = new FileOutputStream
("Salida.txt");
try {
do {
NumBytes = System.in.read(buffer);
FicheroDestino.write(buffer,0,NumBytes);
} while (buffer[0] != Character.LINE_SEPARATOR);
FicheroDestino.close();
} catch (IOException e){
System.out.println("Error escribiendo los datos
o cerrando el fichero");
}
} catch (FileNotFoundException e) {
System.out.println("Fichero no encontrado");
}
Un aspecto que hay que tener en cuenta cuando se programan comunicaciones con
TCP es la eficiencia que se consigue. Cuando se va a traspasar una gran cantidad de
información (por ejemplo, un fichero video), si no necesitamos tiempo real, TCP es un
protocolo adecuado, puesto que el tiempo necesario para establecer la comunicación
es desprediable respecto al utilizado para la transmitir los datos. En el otro extremo,
si necesitamos una gran cantidad de cominicaciones cortas en las que la fiabilidad no
GVA-ELAI-UPM
PFC0075-2003
r 135
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
4.14.1. InetAddress
InetAddress ip = InetAddress.getLocalHost();
toString() devuelve una cadena que contiene el nombre del nodo y la dirección
IP.
4.14.2. Datagramas
Los datagramas son bloques de información del tipo “lanzar y olvidar” que se
transfieren a través de la red. Para la mayorı́a de los programas de la red, el utilizar
un flujo TCP/IP en vez de un datagrama UPD es más sencillo y hay menos posibili-
dades de tener problemas. Sin embargo, cuando se requiere un rendimiento óptimo, y
está justificado el tiempo adicional que supone el realizar la verificación de los datos,
los datagramas son un mecanismo realmente útil.
DatagramPacket
GVA-ELAI-UPM
PFC0075-2003
r 137
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
4.14.3. Conectores
Socket cliente
Socket(String nodo, int puerto) crea un conector que conecta el nodo local con
el nodo y puerto nombrados.
Socket(InetAddress dirección, int puerto) crea un conector utilizando un objeto
InetAddress ya existente y un puerto.
Cuando se ha creado el objeto Socket, también puede ser examinado para acceder
a los flujos de entrada y salida asociados con él. Todos estos métodos pueden lanzar
una IOException si se han invalidado los conectores debido a una pérdida de conexión
en la red. Estos flujos se utilizan exactamente igual que los flujos de E/S que hemos
visto en el capı́tulo anterior para enviar y recibir datos:
Socket servidor
Los ServerSockets se deben utilizar para crear servidores de Internet. Estos servi-
dores no son necesariamente máquinas, de hecho son programas que están esperando
a que programas cliente locales o remotos se conecten a ellos en puertos públicos.
Los ServerSockets son bastante diferentes de los Sockets normales. Cuando se crea un
ServerSocket, se registrará en el sistema que tiene interés en conexiones de cliente.
Tiene un método adicional, accept, que es una llamada que se bloquea ya que espera
que un cliente inicie la comunicación y después devuelve un Socket normal.
4.14.4. Conexión
Conexión cliente
Lo primero debe ser crear un objeto socket diciendo con que servidor y por que
puerto se realiza la conexión. Después para que haya una comunicación entre las dos
máquinas es necesario abrir dos flujos uno de entrada y otro de salida, en los que por
ellos se realiza el intercambio de información. Es recomendable utilizar el buffer para
la transferencia de la información. Por último una vez se quiera desconectar, se debe
cerrar el socket.
GVA-ELAI-UPM
PFC0075-2003
r 139
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
(conexion.getOutputStream()));
//...
conexion.close();
Conexión servidor
Es muy interesante que el servidor sea multihilo para que pueda atender varias
peticiones de clientes distintos a la vez, por lo que la clase del servidor tiene que
derivarse de la clase Thread. Para abrir el socket del servidor vale con pasarle que
puerto es utilizado para la trasnmisión de datos. Este puerto debe ponerse a la escucha
de posibles peticiones de los clientes. También se deben declarar los flujos de entrada
y salida de datos.
Subclases de Component:
5
Graphics User Interfaces
Button (botón). Componente que se puede utilizar para ejecutar alguna acción
cuando el usuario lo pulsa y lo libera.
GVA-ELAI-UPM
PFC0075-2003
r 141
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
4.15.2. Organización
Frame (marco). Tiene una barra de tı́tulo, esquinas para cambiar el tamaño y
una barra de menú.
Cada ventana de nivel superior, puede tener una barra de menú asociada con
ella. Un objeto menubar (barra de menú) puede contener varios objetos menú en
él. Los menús tienen una lista de objetos menuitem (elemento de menú) dentro de
ellos. Menú, es una subclase de menuitem, lo que permite anidar submenus de forma
jerárquica.
Administrador de diseño
GVA-ELAI-UPM
PFC0075-2003
r 143
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
4.15.5. Eventos
A los eventos relacionados con el ratón, se les llama con una copia del evento
original y la ubicación (x, y) del evento.
4.16. Encriptación
[ENCRI]
Debido a las leyes de los Estados Unidos, que prohiben exportar software de
encriptación de datos, el JCE no viene incluido en el JDK, y existen restricciones
para bajarlo de la site de SUN, pero existen paquetes de terceros, desarrollados fuera
de los Estados Unidos, que implementan todas las especificaciones del JCE y que no
están sujetos a sus restricciones legales, como por ejemplo la librerı́a CRYPTICS.
GVA-ELAI-UPM
PFC0075-2003
r 145
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
subpaquetes), ası́ como una serie de especificaciones a tener en cuenta por los progra-
madores que quieran crear extensiones criptográficas (como la librerı́a CRYPTICS,
etc).
El JDK 1.1 viene con un proveedor por defecto llamado “SUN”, el cual incluye
una implementación del algoritmo DSA y una implementación de los algoritmos de
Hashing MD5 y SHA-1. En el JDK se pueden instalar uno o mas paquetes proveedores.
SecureRandom
Una vez tenemos un objeto SecureRandom, podemos utilizar los siguientes méto-
dos:
Key
El interface Key es el interface de mas alto nivel de todas las claves y define la
funcionalidad compartida por todas las claves.
PublicKey y PrivateKey
Los interfaces PublicKey y PrivateKey son interfaces sin métodos, que derivan de
la interface Key, utilizados solamente para comprobación de tipos.
KeyPair
KeyPairGenerator
Identity
La clase Identity se utiliza para manejar identidades. Para crear identidades us-
aremos el constructor siguiente:
Signer
GVA-ELAI-UPM
PFC0075-2003
r 147
CAPÍTULO 4. PROGRAMACIÓN EN JAVA Fernando Ballesteros Herranz
Signature
La clase Signature se utiliza para crear o verificar firmas. Para crear objetos Sig-
nature usaremos uno de los siguientes métodos:
SecretKey
KeyGenerator
La clase KeyGenerator se utiliza para crear una clave secreta. Para crear objetos
KeyGenerator usaremos uno de los siguientes métodos:
Cipher
La clase Cipher se utiliza para cifrar o descifrar datos. Para crear objetos Cipher
usaremos uno de los siguientes métodos:
4.17. Conclusiones
El lenguaje Java puede no ser tan potente como lo pueda ser C++ gracias a los
punteros, pero la forma de programar es mucho más simple, rápida y encapsulada de
lo que puede ser C++. Es un lenguaje orientado a objetos más sencillo de aprender
que C++, y además es más rápido y eficiente. También hay que mencionar que con
Java se pueden hacer dos tipos de programas, aplicaciones completas y Applets. Es
un sistema multihilo y es fácel de aprender como administrar las prioridades de los
hilos. Da mejor soporte para las aplicaciones para internet, ya que uno de los campos
más fuertes de este leguaje son los Applets. Las conexiones y envı́o de información a
través de la red es verdaderamente muy fácil.
GVA-ELAI-UPM
PFC0075-2003
r 149
Capı́tulo 5
[SOFT] [TIANI]
5.1. Introducción
5.2. Terminologı́a
151
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
5.3.1. Introducción
Hay un número de métodos set/get en DicomObject con los que se pueden meter,
sacar o modificar los atributos guardados en un DicomObject. La forma de hacer
esto es con la clase com.archimed.dicom.DDict. La clase DDict tiene una constante
definida para cada atributo definido en el estándar DICOM. Por ejemplo:
DDict.dPatientName
DDict.dAccessionNumber
Esas constantes pueden ser usadas en los métodos set/get del DicomObject:
Person p = (Person)dcm.get(DDict.dPatientName);
Integer acnumber = (Integer)dcm.get(DDict.dAccessionNumber);
dcm.set(DDict.dPatientName, new Person("Fernando"));
dcm.set(DDict.dAccessionNumber, new Integer(12345));
El método set implı́citamente convierte el valor del argumento dado al tipo DICOM
correcto.
Hay también dos métodos get que convierten directamente a String o int:
String s = dcm.getS(DDict.dPatientName);
int i = dcm.getI(DDict.dAccessionNumber);
Para manipular atributos con una multiplicidad mayor de uno, se usan los méto-
dos get/set con un argumento adicional. La multiplicidad de un atributo se obtiene
con getSize(). Por ejemplo, suponiendo que un DicomObject dcm contiene un atrib-
uto ImageType con multiplicidad 2 y valores DERIVED/SECONDARY, entonces se
puede coger esos valores de la siguiente forma:
GVA-ELAI-UPM
PFC0075-2003
r 153
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
dcm.set(DDict.dImageType,0,"DERIVED");
dcm.set(DDict.dImageType,1,"SECONDARY");
Secuencias
Las secuencias se tratan de una forma parecida que los valores de multiplicidad
mayor de uno. Cuando un atributo en un DicomObject representa una secuencia (tipo
SQ DICOM), entonces los “items” de la secuencia pueden ser insertados y cogidos
con los mismos métodos get/set del DicomObject que ahora aceptan y devuelven los
DicomObejcts completos. Por ejemplo, suponiendo que el DicomObject dcm contiene
un atributo DirectoryRecordSequence con un cierto número de items:
Para añadir un valor a una secuencia, simplemente se usa el método set que tiene
el DicomObject que representa el item y el ı́ndice del item.
Son accesibles con las mismas funciones get/set de las secuencias como las us-
adas en los datasets de los DicomObject. Esto provee a las secuencias de la misma
funcionalidad que los DicomObject.
Comentarios:
cuando usamos set para insertar valores de atributos, los valores se alamacenan
por referencia y no se copian.
cuando usamos get para sacar valores de atributos, se devuelve una referencia
al valor.
Para usuarios que quieran manipular los grupos enteros del conjunto de datos,
hay el acceso al grupo proporcionado por com.archimed.dicom.GroupList, el cual es
la superclase de com.archimed.DicomObject. Un grupo es un conjunto de atributos
que tienen el mismo número de grupo en su par (grupo,elemento).
void addGroups(DicomObject o)
Agrega a todos los grupos encontrados en “o” a este dataset. Solamente agregan
a los grupos que no estaban ya presentes en este dataset. Una vez más solamente se
hace una copia baja o no profunda.
GVA-ELAI-UPM
PFC0075-2003
r 155
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
Leer datasets
Este método lee todos los atributos DICOM desde un inputStream de un Dico-
mObject. El inputStream puede contener tanto un archivo DICOM como un conjunto
de datos (datasets) DICOM. Cuando el inputStream contiene un archivo de la parte
10 DICOM, se lee y se almacena la Meta File Information en un DicomObject sep-
arado que se puede coger mediante getFileMetaInformation(). La transfer syntax se
asume que es Implicit VR Little Endian cuando el inputStream contiene un conjun-
to de datos DICOM. Cuando el inputStream contiene un archivo de la parte 10 de
DICOM, el transfer syntax se detecta desde la File Meta Information.
Este método hace igual que el anterior pero además permite especificar si analizar
o saltar datos de pı́xel. Esto ahorra el tiempo de transformación en el que no se
necesita los datos de pı́xel.
En el parámetro “ts” se puede especificar qué transfer syntax se usa. Este parámetro
puede venir dado cuando se conoce por adelantado con qué transfer syntax se codif-
icó el dataset.
Escribir datasets
Visualización de datasets
DicomObject contiene dos métodos para mostrar todos los atributos contenidos
en un OutputStream de forma ordenada para que el ser humano sea capaz de leerlo.
Ejemplos
Estos trozos de código demuestran el fácil uso de JDT. Con sólo unas lı́neas de
código, es posible construir soluciones DICOM poderosas.
El código siguiente lee un archivo DICOM desde un archivo y muestra los atributos
(incluidos los contenidos en la meta information si existe) por la pantalla.
El siguiente ejemplo lee los datos de un archivo y lo escribe en otro archivo usando
una transfer syntax y una secuencia de codificación especı́ficas.
GVA-ELAI-UPM
PFC0075-2003
r 157
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
Enumeration e = dcm.enumerateVRs(false);
Devuelve la File Meta Information del DicomObject dcm si existe. Se puede usar
ahora fmi para añadir o alterar atributos especı́ficos de esta información como se
quiera.
Información general
5.4. Depósitos
Hay unas clases en el paquete com.archimed.dicom que hacen más fácil a los pro-
gramadores usar los data elements y los registros UIDs.
Devuelve el número de grupo para una constante DDict que representa un atrib-
uto.
GVA-ELAI-UPM
PFC0075-2003
r 159
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
Devuelve el tipo para una constante DDict que representa un atributo. Los ele-
mentos de datos que no están en la lista de arriba tendrán un DDict.tUNKNOWN.
Da una descripción elaborada para una constante DDict que representa un atrib-
uto.
Devuelve la constante DDict que representa el atributo con número de grupo “g”
y número de elemento “e”. Si no se encuentran constantes, el método devolverá DDict
.dUNDEFINED.
Esta parte habla de las capacidades de imagen de JDT. Todas las clases rela-
cionadas con las imágenes pueden ser encontradas en el paquete com.archimed.dicom.image.
GVA-ELAI-UPM
PFC0075-2003
r 161
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
Hay otra forma de insertar los datos de la imagen. Dado una “ImageProducer ip”,
construyendo un objeto ImageIO y usando el método setImageProducer() para copiar
los datos de imagen desde la ImageProducer a la DicomImage:
java.awt.image.ImageProducer getImageProducer()
java.awt.image.ImageProducer getImageProducer(int i)
java.util.Vector getImageProducers()
Para imágenes de escalas de grises con profundidad de pixel mayor que 8 bits, hay
un color model (clase de java) especial com.archimed.dicom.image.GrayColorModel.
Este color model se usa en combinación con un array int de pı́xeles, para producir
imágenes de 256 grises sin pérdida de datos. Con este GrayColorModel, también es
posible meter el Window/Level usado en la producción de la imagen.
Los array de bytes se cogen e insertan con los métodos get(DDict. dPixelData)
y set(DDict.dPixelData,¡byte array¿) respectivamente.
GVA-ELAI-UPM
PFC0075-2003
r 163
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
5.6.4. Compresión
JPEG baseline
JPEG lossless
RLE Lossless
Todos los decodificadores están limitados a 8 bits por pı́xel. El decodificador JPEG
puede manejar 1 o 3 muestras por pı́xel. RLE es sólo capaz de descomprimir 1 muestra
por pı́xel. El camino más fácil para descomprimir imagen entera DICOM es construir
un objeto Compression desde un DicomObject y después llamar al método decom-
press. Éste descodifica los datos del array de pı́xeles del DicomObject y los reemplaza
por los datos descomprimidos.
Los argumentos de codificación, ancho y alto que tienen que ser suministrados
para usar decompressframe() se encuentran en la imagen DICOM original.
Para establecer una asociación con una entidad del par DICOM, se hace uso
las clases del paquete com.archimed.dicom.network.. Es necesario un iniciador de la
asociación y un receptor de la asociación.
1. Hacer una conexión TCP/IP con la entidad del par DICOM que hace uso las
clases estándares de java.net. En este ejemplo el servidor es “Fourier” y el puerto
104.
2. Crear un objeto “Association” con los Input and Output Streams derivadas de
Socket.
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
Association as = new Association(in,out);
3. Preparar un objeto “Request” con los parámetros necesarios para establecer una
asociación. Los parámetros son al menos un tı́tulo de la entidad de la aplicación
llamada (called), un tı́tulo de la entidad de la aplicación llamar (calling) y un
abstract syntax con un sintaxis de transferencia. En el ejemplo el tı́tulo de la
entidad called es “hola” y el calling es “Servicio”. Estos tı́tulos no deben ser más
de largos de 16 caracteres. Conectamos con “hola” para almacenar una imagen
secundaria de la captura con Implicit Little Endian transfer syntax.
GVA-ELAI-UPM
PFC0075-2003
r 165
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
as.sendAssociateRequest(request);
Response response = as.receiveAssociateResponse();
6. En este punto se tiene una asociación válida para el Secondary Capture Image
Storage y podemos enviar imágenes SC a la entidad del par DICOM.
DicomObject cstorerequest;
DicomObject cstoreresponse;
DicomObject scimage;
...
as.send(SOPClass.SecondaryCapture,cstorerequest,scimage);
cstoreresponse = as.receiveCommand();
...
7. Acabar asociación.
as.sendReleaseRequest();
as.receiveReleaseResponse();
GVA-ELAI-UPM
PFC0075-2003
r 167
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
while (true)
{
result = as.peek();
if (result == Association.PDATA_PDU)
{
dcm = as.receiveCommand();
sopclass = dcm.getS(DDict.dAffectedSOPClassUID);
if(sopclass.equals(sc_sopclass)
{
// Se chequea para ver si es una válida petición
// C-STORE, si es ası́ se leen los datos con
// receiveData(), se procesan los datos para el
// almacenaje y se envı́a una respuesta C-STORE
}
else if (sopclass.equals(ve_sopclass)
{
// Chequear si es una petición válida C-ECHO
// y enviar respuesta C-ECHO
}
else
{
System.out.println("sopclass " + sopclass +
" no negociada, abortado");
as.sendAbort(Abort.DICOM_UL_SERVICE_USER,
Abort.REASON_NOT_SPECIFIED);
s.close();
return;
}
}
else if (result == Association.RELEASE_REQUEST)
{
as.receiveReleaseRequest();
as.sendReleaseResponse();
s.close();
System.out.println("asociación acabada");
return;
}
else if (result == Association.ABORT)
{
Abort abort = as.receiveAbort();
s.close();
System.out.println("asociación acabada por el par");
System.out.println(abort);
GVA-ELAI-UPM
PFC0075-2003
r 169
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
return;
}
}
}
class java.lang.Object
class com.archimed.dicom.network.Association
• class com.archimed.dicom.image.GrayColorModel
class com.archimed.dicom.codec.Compression
class com.archimed.dicom.DDate
class com.archimed.dicom.DDateRange
class com.archimed.dicom.DDict
class com.archimed.dicom.DDictEntry
class com.archimed.dicom.Debug
class com.archimed.dicom.network.DimseUtil
class com.archimed.dicom.network.ExtendedNegotiation
class com.archimed.dicom.GroupList
• class com.archimed.dicom.DicomObject
◦ class com.archimed.dicom.image.DicomImage
class com.archimed.dicom.image.SCImage
class com.archimed.dicom.image.ImageIO
class com.archimed.dicom.Jdt
class com.archimed.dicom.Offsets
class com.archimed.dicom.Person
class com.archimed.dicom.network.Request
class com.archimed.dicom.network.Response
• class com.archimed.dicom.network.Abort
• class com.archimed.dicom.network.Acknowledge
• class com.archimed.dicom.network.Reject
class com.archimed.dicom.network.ResponsePolicy
class com.archimed.dicom.tools.Sequences
class com.archimed.dicom.TagValue
• class java.lang.Exception
◦ class com.archimed.dicom.DicomException
◦ class com.archimed.dicom.IllegalValueException
◦ class com.archimed.dicom.UnknownUIDException
class com.archimed.dicom.UID
• class com.archimed.dicom.MetaSOPClass
• class com.archimed.dicom.SOPClass
• class com.archimed.dicom.SOPInstance
• class com.archimed.dicom.TransferSyntax
class com.archimed.dicom.UIDEntry
class com.archimed.dicom.image.WL
5.8.2. Packages
Com.archimed.dicom.network
GVA-ELAI-UPM
PFC0075-2003
r 171
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
Com.archimed.dicom.codec
Com.archimed.dicom.image
DicomImage: Esta clase provee de métodos para construir una imagen Dicom.
SCImage: Esta clase proporciona métodos para construir una imagen SC.
Com.archimed.dicom.tools
Sequences: Estos objetos proveen los “atajos” para coger/poner valores den-
tro de secuencias. La conversión de valores está hecha usando el esquema de
conversión DicomType-JavaType dada en la clase DicomObject.
Com.archimed.dicom
DDictEntry: Un objeto para una etiqueta que puede ser almacenado en el dic-
cionario de datos.
Debug: Proporciona una variable static int por si hay que imprimir información
de reparación de los errores a System.err.
DicomObject: Esta es la clase base de todos los datasets. Los métodos de acceso
proporcionados aquı́ son el modo de obtener/poner elementos de dato (data
elements) dentro de un objeto Dicom (DicomObject).
GVA-ELAI-UPM
PFC0075-2003
r 173
CAPÍTULO 5. ESTUDIO DE LIBRERÍAS JDT Fernando Ballesteros Herranz
UID: Esta clase contiene un depósito de todos los UIDs Dicom certificados.
Cada UID está en función del Transfer Syntax, SOPClass, MetaSOPClass y
SOPInstance.
5.9. Conclusiones
Una vez trabajado y experimentado con los dos toolkit de DICOM (dcmtk y JDT),
se llegan a las siguientes conclusiones:
Por el contrario, JDT es un producto no gratuito, pero cuenta con las grandes
ventajas que el toolkit dcmtk351 no tiene. Lo primero a señalar es que el lenguaje
de programación es JAVA, con las ventajas que conlleva con respecto a C++. Por
otro lado, contiene una documentación amplia y muy bien estructurada, gracias a la
utilidad de javadocs, lo que facilita enormemente el trabajo y su comprensión. JDT
contiene un árbol de clases, información de los diferentes packages, información sobre
las clases y sus métodos.
La elección después de trabajar con los dos Toolkit ha sido el Java Dicom Toolkit
(JDT), ya que es más fácil de utilizar y debido a la creación de un Cliente/Servidor
para la Red, las aplicaciones en Java son más fáciles y potentes.
GVA-ELAI-UPM
PFC0075-2003
r 175
Capı́tulo 6
Desarrollo de aplicación
6.1. Introducción
Para estas dos aplicaciones hay que elegir el entorno de desarrollo a utilizar.
Pueden ser utilizados múltiples sistemas como TextPad, Visual J++, el propio JDK
o JBuilder.
177
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Por lo tanto para el desarrollo del Servidor se utiliza el compilador TextPad 4.7.0,
las librerı́as SDK v1.4.1, el paquete JCE para la encriptación/desencriptación y las
librerı́as DICOM JDT, mediante las cuales se va a implementar la aplicación DICOM.
6.2.1. Introducción
En esta sección se van a ver los aspectos más importantes para la compilación de
archivos fuentes y se van a describir las herramientas más utilizadas en el trabajo con
Java.
La instalación puede ser o bien sólo de la Máquina Virtual de Java(JRE Java En-
viroment Enterprise), para poder ejecutar programas de Java pero no poder compilar
ficheros fuente, o bien la instalación de las librerı́as y la MVJ para poder ejecutar y
compilar programas Java.
SDK
La instalación a realizar son de las librerı́as de la última versión SDK 1.4.1 que se
puede descargar de la página (http://java.sun.com). Con la instalación de las librerı́as
viene incluida la JVM2 .
El tercer paso es el más importantes ya que aunque se tengan las librerı́as y los
ejecutables, hay que decir a la computadora donde están. Este paso es el que diferencia
Windows 95/98 con Windows NT/2000/XP. En Windows 98 hay que dar el PATH de
donde se encuentran los ejecutables y hay que crear un CLASSPATH donde debemos
dar el camino para llegar a las librerı́as del SDK. Los pasos para realizar esto son:
De esta forma quedan instaladas las librerı́as del SDK y la Máquina Virtual de
Java.
2
Java Virtual Machine
GVA-ELAI-UPM
PFC0075-2003
r 179
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Para utilizar las librerı́as en cualquier fichero fuente, basta realizar un import del
paquete o clase a utilizar. Para poder trabajar con SDK es muy importante disponer
de la ayuda del API de la página web http://java.sun.com. La figura 6.1 muestra la
organización de esta API.
JCE
3. Añadir en el CLASSPATH:
SET CLASSPATH = C:\j2sdk1.4.1_03\lib\dt.jar;C:\JAVA\JCE;
C:\JAVA\JCE\DemoApps;C:\JAVA\JCE\Server;C:\JAVA\JCE\SCM;
C:\JAVA\JCE\rfm;C:\JAVA\JCE\jaudio;.; %Classpath %
4. Poner en el PATH:
SET PATH = . . . ;C:\J2SDK1.4.1_03\BIN;C:\JAVA\JCE\jaudio; %Path %
5. Crear una carpeta llamada .jce en C:\ y copiar en este directorio el .jce que
viene en el archivo descargado de internet, que está dentro de la carpeta JCE.
SDK
GVA-ELAI-UPM
PFC0075-2003
r 181
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
7. Como último paso dar a Aceptar tres veces secuencialmente para que los cambios
se apliquen.
JCE
5. Crear una carpeta llamada .jce en C:\ y copiar en este directorio el .jce que
viene en el archivo descargado de internet, que está dentro de la carpeta JCE.
Compilador
Es una herramienta del JDK o SDK3 . Realiza un análisis del sintaxis del código es-
crito en los ficheros fuente de Java (con extensión *.java). Si no encuentra errores en el
código genera los ficheros compilados (con extensión *.class). En el JDK de Sun dicho
compilador se llama javac.exe. Java.exe es el intérprete para sistemas PC/Windows.
Una vez compilado no deberı́a ser necesaria ninguna modificación por el hecho
de cambiar de procesador o de ejecutarlo en otra máquina. La clave consistió en
desarrollar un código “neutro” el cual estuviera preparado para ser ejecutado sobre
la JVM.
Para realizar una aplicación con el compilador del SDK, se debe escribir el código
en Java en un editor de texto cualquiera como puede ser el “Bloc de Notas”. Una vez
escrito debe ser guardado el fichero con extensión .java, por ejemplo nombre.java. La
3
JDK para las antiguas versiones y SDK para las nuevas versiones
compilación debe realizarse con un “shell” de comandos, como el del MSDOS. Para
realizar la compilación escribir:
Javadocs
GVA-ELAI-UPM
PFC0075-2003
r 183
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
/**
* La clase <em> Storagescp </em> es utilizada para poner al Servidor
DICOM a la escucha de asociaciones.
* @author Fernando Ballesteros Herranz
* @version Beta
*
*/
Modo de uso:
4
Java 2 Standard Edition
jar
Esta utilidad es usada para generar archivos .jar que contienen todas las clases
de la aplicación realizada. Esto se realiza para su posterior distribución. Ejecutando
el .jar generado, la MVJ podrá ejecutar el programa desarrollado.
v - produce un salida verbosa en stderr (en versión 1.1) o stdout (en versión 1.2)
mientras se construye el fichero. La salida verbosa te dice el nombre de cada
fichero añadido al fichero JAR.
GVA-ELAI-UPM
PFC0075-2003
r 185
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Los pasos seguidos para crear el JAR de nuestra aplicación Servidor. Estos pasos
se realizan en el Shell de comandos de MSDOS:
1. Crear un archivo nuevo (incluyendo las clases y otros recursos que te interesen
empaquetar).
jar Main.jar c:\encri.class c:\Connection.class c:\Storagescu.class
c:\Storagescp.class
3. Modicar dicho archivo (en algún editor de texto corriente). Lo que se hace es
agregar la lı́nea siguiente al archivo MANIFEST.MF (este paso no se hace en
MSDOS):
Main-Class: Storagescp
6.3.1. Introducción
6.3.2. Caracterı́sticas
tipeo más comunes con comandos, y transportar palabras, caracteres y lı́neas. El tex-
to puede ubicarse automáticamente en el márgen, o en una columna especificada, si
no cabe en una lı́nea. Cualquier cambio puede ser deshecho o hecho de nuevo. Las
combinaciones con frecuencia usadas de comandos se pueden salvar como macros. El
programa posee herramientas personalizables y opciones de búsquedas. Ver figura 6.4
Con este editor se pueden escribir documentos fuentes de java. Para crearlos tan
solo hay que grabarlos con la extensión .java.
Una vez instaladas las librerı́as, para instalar el TextPad tan solo hay que ejecutar
el archivo Setup del programa.
GVA-ELAI-UPM
PFC0075-2003
r 187
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
6.4.1. Introducción
En esta sección se van a ver los aspectos más importantes del JBuilder 7.0 Enter-
prise. Este entorno de desarrollo está orientado a la creación de interfaces gráficas,
por este motivo la mayor parte de la aplicación cliente DICOM ha sido desarrollada
con el JBuilder. La aplicación del cliente es compatible con las nuevas versiones que
han ido saliendo a lo largo del año del JBuilder como las versiones 8.0 y 9.0.
6.4.2. Instalación
La instalación es muy sencilla tan solo hay que seguir estos pasos:
5. Una vez hecho esto se tiene un programa de prueba de 1 mes, pero si se consigue
un archivo jbuilder.jar sustituto al que venga con la aplicación, éste se debe so-
brescribir sobre el existente, que está locacizado en . . . /JBuilder/bin/jbuilder.jar.
Al instalarse el JBuilder, instala por defecto el JDK v1.3.1 y utiliza estas librerı́as
para compilar.
En nuestra aplicación ha sido necesaria la utilización de las JDK 1.4.1, por lo que
hay que cambiar la referencia de las librerı́as. Para cambiar las JDK 1.3.1 a las JDK
1.4.1 hay realizar una pequeña configuración dentro del JBuilder.
1. Entrar en Herramientas
5. Pulsar Aceptar
GVA-ELAI-UPM
PFC0075-2003
r 189
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Con esto hecho, las aplicaciones que se realicen a partir de este momento se apo-
yarán en las nuevas librerı́as designadas. Ver figura 6.6
Se va a crear un simple editor de texto para ver cómo se realiza una aplicación en
el JBuilder. A partir de este ejemplo es posible realizar aplicaciones más completas y
complejas. Tan sólo recordar que el JBuilder está orientado a la creación de interfaces
de usuario y con esto desarrollamos nuestra aplicaión Cliente DICOM.
Pasos:
Para crear un proyecto se usa el asistente para proyectos y el asistente para apli-
caciones, de esta forma:
3. Aceptar con las opciones por defecto de los pasos 1 ,2 y 3. Ver figura 6.7
Para ajustar las propiedades del proyecto hay que entrar en Proyecto->Propiedades
del Proyecto. . . . En nuestro caso ajustaremos el Estilo de código a Adaptador estándar
Una vez creado nuestro proyecto, pasamos a crear una aplicación dentro del proyec-
to mediante el asistente para aplicaciones:
1. Pinchar en Archivo->Nuevo.
2. Hacer doble click sobre el icono Aplicación para abrir el Asistente para aplica-
ciones. Ver figura 6.8
3. Poner el nombre del paquete igual al nombre del proyecto creado, y el nombre
de la clase el que se quiera. (Tener en cuenta que este nombre será el nombre
de la clase principal)
4. Pulsar Siguiente para ir al Paso 2. Marcar la opción de Generar comentarios de
cabezera
GVA-ELAI-UPM
PFC0075-2003
r 191
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
5. Poner nombre de clase y de Tı́tulo (este será el tı́tulo que aparecerá en la barra de
tı́tulo de la aplicación). Marcar las 5 opciones que hay: Generar barra de menú,
Generar barra de herramientas, Generar barra de estado, Generar cuadro Acerca
de y Centrar marco en la pantalla. De esta forma se genera automáticamente el
código más general correspondiente a las opciones seleccionadas. Ver figura 6.9
En este paso se crea un área de texto que rellena por completo el marco de la
interfaz de usuario entre la barra de menús y la barra de estado. Para lograrlo, el
gestor de diseño del contenedor principal de la interfaz de usuario debe utilizar Bor-
derLayout. Como consecuencia de la utilización del Asistente para aplicaciones, el
principal contenedor de esta interfaz de usuario, que aparece como this en el árbol de
GVA-ELAI-UPM
PFC0075-2003
r 193
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
10. Por último, se deben definir algunas propiedades en jTextArea1 para que se
ajusten automáticamente las lı́neas de texto y se haga en los espacios entre
palabras. En el Inspector, asignar los siguientes valores:
lineWrap = true
wrapStyleWord = true
background = white
GVA-ELAI-UPM
PFC0075-2003
r 195
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
2. Hacer doble click sobre jMenuBar1 en la carpeta Menu del árbol de componentes
para abrir el diseñador de menús. (También puede seleccionar un elemento de
menú del árbol de componentes y pulsar Intro)
6. Pulsar Flecha abajo para aceptar la nueva entrada y bajar al siguiente elemento
(en este caso, el elemento de menú Salir).
GVA-ELAI-UPM
PFC0075-2003
r 197
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Se comienza a enlazar los sucesos de menú, empezando con el elemento de menú Edi-
ción->Fuente que es el que va a mostrar el cuadro de diálogo Selector de fuentes.
En primer lugar, para poder utilizar esta opción de menú, se debe añadir un
componente cuadro de diálogo Selector de fuentes a la clase TextEditFrame:
3. Hacer doble click en el valor de este suceso, o pulsar Intro para crear el suceso.
Si el método de tratamiento del suceso es nuevo, esta operación generará un stub
vacı́o para el método en el código fuente. Independientemente de si el método
es nuevo o ya existe, el foco de ventana cambiará a código fuente en el editor y
colocará el cursor dentro del método de tratamiento de sucesos. En el caso de
un método nuevo de tratamiento de sucesos, como es el caso, verá que la sección
principal del método no contiene todavı́a código alguno.
4. Escribir esta lı́nea de código en el cuerpo de este nuevo método vacı́o (entre las
llaves de apertura y cierre): fontChooser1.showDialog();
Ahora el método deberı́a parecerse a éste:
void jMenuItem5_actionPerformed(ActionEvent e) {
fontChooser1.showDialog();
}
GVA-ELAI-UPM
PFC0075-2003
r 199
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
void jMenuItem5_actionPerformed(ActionEvent e) {
// Gestiona el elemento de menú "Edición Fuente"
GVA-ELAI-UPM
PFC0075-2003
r 201
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
jTextArea1.repaint();
}
void jMenuItem6\verb’_’actionPerformed(ActionEvent e) {
}
5. Volver al diseñador.
6. Seleccionar el tercer elemento de menú en el árbol de componentes, en Edición
(menuItem7), que debe tener la etiqueta “Color de fondo” en la propiedad
actionCommand. Crear un suceso actionPerformed() para él, tal como hizo con
jMenuItem6
7. Insertar el siguiente código en el suceso actionPerformed() de jMenuItem7:
1. Vuelva al diseñador.
2. Seleccionar el elemento de menú Archivo->Nuevo del árbol de componentes
(jMenuItem1).
3. Crear un suceso actionPerformed() e introducir en él este código:
4. Guardar y ejecutar la aplicación, escribir algo en el área de texto y ver qué sucede
al seleccionar Archivo->Nuevo. Deberı́a borrarse el contenido. Observar que no
se pregunta si se desea guardar el archivo antes. Para poder tratar este aspecto,
se tiene que configurar la infraestructura para la lectura y escritura de archivos
de texto, para controlar si el archivo ha cambiado y necesita guardarse.
GVA-ELAI-UPM
PFC0075-2003
r 203
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Se va a añadir código para leer el texto del archivo seleccionado por el usuario y
ponerlo en el JTextArea.
En primer lugar, hay que añadir un nuevo método a la clase para realizar la
operación de apertura del archivo. Este método se llamará openFile().
// Obtener el tama~
no del archivo abierto.
int size = (int)file.length();
GVA-ELAI-UPM
PFC0075-2003
r 205
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Para ello, es necesario añadir una variable de instancia String para almacenar el
nombre del archivo abierto, además de añadir métodos para escribir de nuevo el texto
en este y en otros archivos.
5. Crear un método saveFile() al que se pueda llamar desde el manejador del suceso
de Archivo->Guardar. Puede ser colocado justo después del método openFile().
Este método escribe el nombre de archivo en la barra de estado al guardar.
GVA-ELAI-UPM
PFC0075-2003
r 207
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
try
{
// Abrir el archivo del nombre actual.
File file = new File (currFileName);
showSaveDialog(this)) {
// Asignar al nombre de archivo actual la selección
//del usuario
// a continuación realizar un saveFile normal
currFileName = jFileChooser1.getSelectedFile().getPath();
//pinta el menú de nuevo una vez que el elemento se ha
//seleccionado
this.repaint();
return saveFile();
}
else {
this.repaint();
return false;
}
}
GVA-ELAI-UPM
PFC0075-2003
r 209
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
switch (value) {
case JOptionPane.YES_OPTION:
// sı́, por favor guardar cambios
return saveFile();
case JOptionPane.NO_OPTION:
// no, abandonar modificaciones
//por ejemplo devolver true sin guardar
return true;
case JOptionPane.CANCEL_OPTION:
default
// cancelar
return false;
}
}
GVA-ELAI-UPM
PFC0075-2003
r 211
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
System.exit(0);
}
}
Ahora, estos métodos de tratamiento de los sucesos de menú realizan su
función sólo si okToAbandon() devuelve “true”.
Con estos pasos se tiene un conocimiento básico de cómo crear un GUI (graphical
user interface) que es nuestro punto básico para construir nuestra aplicación DICOM.
Estas son las librerı́as de Java utilizadas que implementan funciones del estándar
DICOM. Es necesario hacer una instalación manual como la realizada con las JDK.
También al realizar el programa se han utilizado las librerı́as JDT que se distribuyen
de forma gratuita por lo que tienen un perı́odo de validez, este perı́odo se acaba el
22 de Abril del 2003, pues bien para poder utilizarlas, lo que hacemos es retrasar el
reloj del ordenador hasta el 22 Abril del 2002 y ası́ tenemos un año completo para
poder utilizar las librerı́as.
Para realizar la instalación es común en todos los sistemas operativos el crear una
carpeta que se llame como se quiera, en nuestro caso se llama “classpath”. En esta
carpeta hay que guardar los archivos enviados por softlink que son jdt.jar y jdt.key.
La página para hacer la petición de las librerı́as es www.softlink.be.
En nuestro caso hemos creado una carpeta llamada classpath en el disco D:\, por
lo que hay que copiar los archivos jdt.jar y jdt.key en D:\classpath.
Para la instalación de las librerı́as JDT en este sistema operativo, hay que abrir el
archivo “autoexe.bat” que se encuentra en C:\ con un editor de texto (click derecho
sobre el archivo mientras se deja pulsado “Shift”, y elegimos el Bloc de Notas). En la
variable classpath creada anteriormente cuando instalamos las librerı́as JDK, hay que
escribir el path o camino para llegar a los archivos de las librerı́as JDT. En nuestro
caso es:
D:\classpath\jdt.key;D:\classpath\jdt.jar;
Una vez realizado esto, hay que hacer una copia del archivo “jdt.key” en los
directorios donde haya archivos fuente que utilicen estas librerı́as. Por ejemplo si
tenemos en la carpeta C:\java un archivo fuente main.java que utilice estas librerı́as,
hay que poner en la carpeta al archivo “jdt.key”.
Para la instalación de JDT, hay que entrar en las variables de entorno. Para llegar
a las variables de entorno ir a Inicio->Configuración->Panel de Control->Sistema-
>Avanzado->Variables de entorno. . . y en variables del sistema pinchar en la variable
classpath creada anteriormente, ahı́ añadir:
D:\classpath\jdt.key;D:\classpath\jdt.jar;
Una vez realizado esto, hay que hacer una copia del archivo “jdt.key” en los
directorios donde haya archivos fuente que utilicen estas librerı́as. Por ejemplo si
tenemos en la carpeta C:\java un archivo fuente main.java que utilice estas librerı́as,
hay que poner en la carpeta al archivo “jdt.key”.
Una vez instaladas las librerı́as ahora hay que incluir las librerı́as en el proyecto
que se esté realizando una aplicación DICOM. Este proceso es el mismo para cualquier
tipo de librerı́as que se quieran utilizar. Para ello hay que realizar los siguientes pasos:
Nombre: JDT
Ubicación: Directorio Inicial
Pulsar Añadir. . .
Selecionar el camino hasta las librerı́as JDT que en nuestro caso son:
GVA-ELAI-UPM
PFC0075-2003
r 213
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
• D:\classpath\jdt.jar
• D:\classpath\jdt.key
• D:\classpath\
Aceptar
5. Hecho esto ahora podemos añadir las clases de estas bibliotecas a nuestro codigo
fuente sin que de error. Por ejemplo:
import com.archimed.dicom.*;
Con esto podemos declarar nuevos objetos de las clases de JDT, por ejemplo:
6.6.1. Introducción
La aplicación Servidor DICOM implementa todas las funciones DICOM que puede
realizar un servidor con las librerı́as JDT. Se ha realizado un programa multiplatafor-
ma que estará en ejecución indefinidamente y que él mismo es capaz de administrarse
sin mantenimiento exterior.
Vamos a analizar cada función que realiza el servidor. Los pasos previos a todas las
funciones es el que se eralice una asociación entre cliente y servidor y estén deacuerdo
en la información que van a compartir.
5
Digital Encription Standard
GVA-ELAI-UPM
PFC0075-2003
r 215
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
6.6.2. Listar
EL servidor a petición del cliente, realiza una lista de los archivos Dicom contenidos
en la base de datos. Esta lista es enviada y codificada por el servidor a los clientes
que la soliciten.
System.out.println(si[i]);
ps.println(si[i]);
ps.println(a);
}
return;
Donde primero se mira cuantos archivos Dicom hay en la base de datos y luego
sabiendo este número se van listando. También es importante saber cuantas imágenes
tiene cada archivo Dicom ya que es una información que el cliente debe de conocer.
Toda esta información es enviada al cliente cada vez que hace una petición de la base
de datos.
6.6.3. Enviar
.......
DicomObject scimage = new DicomObject();
scimage.read(fin,true);
fin.close();
.......
as.send(SOPClass.CTImageStorage,cstorerequest,scimage);
.......
GVA-ELAI-UPM
PFC0075-2003
r 217
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
6.6.4. Guardar
Cuando el cliente envı́a archivos Dicom al servidor, éste debe saber administrar
la forma de guardarlo sabiendo qué nombre debe dar al archivo recibido y donde se
producirá su almacenaje.
El código fuente es muy extenso pero para entender la forma de realizarse esta
función vale con:
.......
DicomObject im = new DicomObject();
.......
//recibe los VRs
im = as.receiveData();
im.write(fin,true);
fin.close();
.......
Para esto se ha tenido que crear un objeto Dicom DicomObject im = new Di-
comObject() que será quien reciba los datos que se están recibiendo del cliente vı́a
network. Estos datos son los data sets con los valores correspondientes del archivo
Dicom. El objeto Dicom recibe los datos mediante el método receiveData() de la clase
Association y luego los guarda para no perderlos y ası́ crear un nuevo archivo Dicom
en la base de datos del servidor. Esto se realiza con im.write(fin,true), siendo fin el
objeto tipo archivo donde se guarda el objeto Dicom.
6.6.5. Query/Retrieve
Edad
Sexo
Esta información es de suma importancia para tener conocimiento del estudio que
queremos analizar, modificar, borrar o eliminar.
.......
FileInputStream fin = new FileInputStream("c://BaseDeDatos//"+nombre);
DicomObject scimage = new DicomObject();
scimage.read(fin,true);
String nombres = scimage.getS(DDict.dPatientName);
ps.println(nombres);
String nombr = scimage.getS(DDict.dPatientAge);
.......
ps.println(nombr);
String nom = scimage.getS(DDict.dPatientSex);
ps.println(nom);
String dia = scimage.getS(DDict.dPlanes);
ps.println(dia);
GVA-ELAI-UPM
PFC0075-2003
r 219
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
6.6.6. Editar
Esta función permite modificar los archivos Dicom del servidor sin necesidad el
cliente de tener que traerse todo el archivo Dicom. Es muy útil para modificar los
estudios de los pacientes o poner notas que los médicos creen convenientes, de una
forma rápida y sencilla.
Edad
Sexo
El código es:
.......
String nomb = in.readLine();
String archiv = in.readLine();
String edad = in.readLine();
String sexo = in.readLine();
String dia = in.readLine();
String mes = in.readLine();
String ano = in.readLine();
FileInputStream fin = new FileInputStream
("c://BaseDeDatos//"+archiv);
De esta forma se reciben los datos que el cliente quiere modificar del archivo que
desee y mediante el método set de la clase DicomObject se van modificando los datos.
Una vez hecho esto se deben guardar los cambios realizados en el objeto con el método
write().
6.6.7. Encriptación/Desencriptación
.......
byte caracterEncriptacion=’n’;
GVA-ELAI-UPM
PFC0075-2003
r 221
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
String cadenaEncriptada="";
int caracterEncriptado=0;
String cadenaDesencriptada="";
}
.......
6.7.1. Introducción
Esta aplicación sigue todos los pasos del estándar DICOM en la implementación de
las funciones. Se ha querido realizar un programa multiplataforma y que esté deacuer-
do con las especificaciones requeridas.
Vamos a ver para que sirven cada uno de estos paneles y una pequeña muestra de
cómo han sido implementados.
Este panel sirve para comunicarse con el Servidor Dicom. Mediante este panel se
puede solicitar al servidor una lista de los archivos que tenga en la base de datos,
GVA-ELAI-UPM
PFC0075-2003
r 223
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
se puede coger cualquier archivo de esa base de datos, se pueden enviar archivos a
la base de datos, se pueden modificar estos archivos desde el cliente y se puede ver
partes de la información que contienen estos archivos Dicom que están en la base de
daros del servidor. Ver figura 6.22
Antes de realizar cualquier acción en este panel, se debe escribir el nombre del
servidor del que queremos tener estos servicios.
Base de Datos
Mediante el botón Base De Datos, se hace una petición al servidor de los archivos
que contenga. Estos archivos contenidos en la base de datos del servidor, se muestran
en el cliente en un árbol, en el que se ve también por cuantas imágenes está compuesto
el archivo. Ver figura 3.2.
Para que el funcionamiento de este botón sea correcto, hay que poner el nombre
del servidor con el que queremos crear una asociación en el espacio creado para ello.
Después de presionar el botón Base De Datos, saldrá una orden a su derecha que nos
dirá “Haz click en Dicom”, entonces hay que hacer click en la palabra Dicom que
está escrita en el árbol.
jTree1.addMouseListener(ml);
// Al pulsar la tecla, haga la peticion de la lista.
String servidor = textoServidor.getText();
Storagescu BasedeDatos = new Storagescu(servidor,104,
"storecp","storecu");
BasedeDatos.lista();
jScrollPane9.setVerticalScrollBarPolicy(JScrollPane.
VERTICAL_SCROLLBAR_ALWAYS);
jScrollPane9.setViewportBorder(BorderFactory.
createEtchedBorder());
jScrollPane9.setBounds(new Rectangle(313, 308, 378, 255));
Al pulsar el botón Base de Datos, creamos un listening para el ratón para actuar
con sus eventos, pedimos una lista al servidor sobre su base de datos y creamos un
árbol de los archivos.
Enviar
Para enviar estudios o archivos Dicom al servidor para que los almacene en la base
de datos, implementamos este botón, el botón Enviar. Ver figura 6.23.
Para enviar los datos, primero hay que poner el nombre del servidor con el que
queremos conectar en el JTextArea que hemos creado para ello. Este boón cogera con
que servidor queremos conectarnos y nos abrirá un browser para buscar el archivo
que queremos enviar.
GVA-ELAI-UPM
PFC0075-2003
r 225
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
open();
String servidor = textoServidor.getText();
.......
Storagescu enviar = new Storagescu(servidor,104,
"storecp","storecu",openFileName);
.......
int ok=enviar.store();
if(ok==enviar.STORE_OK)
etiquetaEnvio.setText("Enviado con éxito");
else
etiquetaEnvio.setText("Enviado sin éxito");
Donde los parámetros del objeto enviar de la clase Storagescu son los datos nece-
sarios para enviar el archivo más tarde mediante el método store() de la clase Stor-
agescu.
Coger
Este botón ha sido implementado para poder hacer peticiones al servidor de que
envı́e al cliente el archivo marcado en el árbol. El archivo enviado por el servidor se
guardará en el cliente y podrá ser visualizado en el panel Visor Dicom. Ver figura
6.24.
Coge el nombre del servidor al que está conectado y el nombre del archivo que se
quiere traer, luego se crea un objeto de la clase Storagescu que es la encargada de
establecer la asociación con el servidor. Este objeto llama a la función coger() que
la que hace el elemento de servicio necesario para traer el archivo especificado del
servidor.
Editar
Su función es modificar los datos de los archivos que están en el servidor sin
tener que traernos el objeto entero. Cada vez que se pinche sobre un archivo se trae
la información necesaria no todo el archivo. La información que se trae y se puede
modificar es:
Edad
Sexo
Para modificar estos datos hay que escribir en los espacios JTextField (ver figura
6.25) dispuestos para ver y para escribir en ellos. Para que las modificaciones se
conserven, hay que escribir los datos que se quieran en los campos y darle al botón
Editar, de esta forma se modifican los datos de los arhivos Dicom del Servidor.
GVA-ELAI-UPM
PFC0075-2003
r 227
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Este panel sirve para poder visualizar todo tipo de archivos DICOM: archivos
comprimidos, no comprimidos, en color, en escala de grises y de una o varias imágenes,
también es capaz de insertar datos de texto en los campos ya existentes de un archivo
Visualizar datos
Este parámetro que se pasa es un archivo DICOM sacado de archivos .dcm (for-
mato DICOM).
GVA-ELAI-UPM
PFC0075-2003
r 229
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
.......
if (JFileChooser.APPROVE OPTION == jFileChooser1.
showOpenDialog(this))
openFileName = jFileChooser1.getSelectedFile().
getAbsolutePath();
f = new File(openFileName);
fin = new FileInputStream(f);
bis = new BufferedInputStream(fin);
dcm.read(bis, true);
.......
El paso siguiente es coger los datos reunidos en este objecto. Para ello necesitamos
la clase Imagedos. Llamamos a su constructor public Imagedos(DicomObject dcm) con
lo que tenemos un objeto de esta clase:
imagen = imagedcm.getBufferedImage(numeroImagen);
etiquetaMostrarImagen.setIcon(new ImageIcon(imagen));
GVA-ELAI-UPM
PFC0075-2003
r 231
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
etiquetaMostrarImagen.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
try
if(x1==-1&y1==-1)
{
x1 = e.getX();
y1 = e.getY();
}else if(x2==-1&y2==-1)
{
x2 = e.getX();
int ancho = Math.abs(x2) - Math.abs(x1);
int alto = y2 - y1;
ancho = Math.abs(ancho);
alto = Math.abs(alto);
zoomBufferedImagen = ImageToBufferedImage.
toBufferedImage(zoomImagen);
if((x1>x2)&(y1>y2))
{
zonaBImagen= zoomBufferedImagen.getSubimage
(x2,y2,ancho,alto);
}if((x1<x2)&(y1>y2))
{
zonaBImagen= zoomBufferedImagen.getSubimage
(x1,y2,ancho,alto);
}if((x1<x2)&(y1>y2))
{
zonaBImagen= zoomBufferedImagen.getSubimage
(x1,y1,ancho,alto);
}if((x1>x2)&(y1<y2))
{
zonaBImagen= zoomBufferedImagen.getSubimage
(x2,y1,ancho,alto);
}
Image zonaZoomImage = zonaBImagen.
getScaledInstance(4*ancho,4*alto,Image.SCALE DEFAULT);
Marco PantallaCompleta marcoZonaZoom = new Marco
PantallaCompleta(zonaZoomImage);
Dimension dlgSize = marcoZonaZoom.getPreferredSize();
Dimension frmSize = getSize();
Point loc = getLocation();
marcoZonaZoom.setLocation((frmSize.width - dlgSize.
width) / 2 + loc.x, (frmSize.height - dlgSize.height)
/ 2 + loc.y);
marcoZonaZoom.setModal(true);
marcoZonaZoom.pack();
}
}
});
GVA-ELAI-UPM
PFC0075-2003
r 233
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
2. Botón Seguidas:
Se basa en lo anterior, pero se consigue que las imágenes pasen una detrás de
otra (formando una pelı́cula). La pelı́cula se para si se pulsa con el ratón sobre
el panel donde aparece esta secuencia. Ver figura 6.30
Donde, como se puede ver, se cargan todas las imágenes en un array de Images
y más tarde se crea una instancia de la clase ImageSequenceTimer con la cual
se crea el panel donde se va a visualizar la secuencia.
GVA-ELAI-UPM
PFC0075-2003
r 235
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
import javax.imageio.*;
Esto se puede hacer de dos formas diferentes. Se puede insertar datos en campos
ya existentes, como el nombre del paciente, o se puede crear nuestro propio campo
como por ejemplo número de moléculas infectadas.
Del primer tipo se han dispuesto una serie de campos, los cuales pueden ser válidos
o no. En este aspecto deben ser los profesionales de la medicina los que deben sum-
inistar información para saber los datos que quieren insertar para poder adaptarnos
a ellos.
Ya se vió de que manera se puede visualizar todos los datos del archivo DICOM.
Aquı́ vamos a cambiar o meter nuevos datos en determinados campos y podremos
visualizar si estas modificaciones se llegan a producir.
Para ésto se han dispuesto dos instancias de la clases JComboBox, dos botones
de la clase JButton para insertar y para ver lo insertado y de dos objetos JTextArea
siendo éstas las zonas de visualización. Todo esto se puede ver en la figura 6.32
GVA-ELAI-UPM
PFC0075-2003
r 237
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
= new JComboBox(opcionesCombobox);
Por lo que al pinchar sobre la flecha del combobox, aparecen todos estos cam-
pos. Ahora hay que interconectarlos para que al seleccionar uno y escribir sobre las
JTextArea se inserte y visualicen los datos.
Para insertar:
Donde new Person(dato) es el dato del nombre del paciente que se inserta en el
campo del archivo DICOM DDict.dPatientName.
Hecho esto, el dato estarı́a en el objeto DicomImage pero no todavı́a en el
archivo .dcm, para lo que se implementa estas otras lı́neas de código:
Se ha visto cómo insertar datos en los campos del archivo DICOM existentes ya,
como el sexo del paciente, nombre del fabricante, ID del paciente, etc, pero es muy
importante ser capaces de crear nuestros propios campos, como por ejemplo el número
de virus, diagnóstico del médico, y en definitiva, los que se crean convenientes.
Para ello se han dispuesto en la GUI ciertos botones (figura 6.33) que son capaces
hacer este servicio.
GVA-ELAI-UPM
PFC0075-2003
r 239
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Una vez hecho esto, creamos un objeto de la clase DDict, en la cual vamos a
insertar nuestro nuevo campo por medio del método addEntry(DDictEntry a).
campoElementoTexto.getText()).intValue(), DDict.tST,
campoNuevoTexto.getText(),"1");
diccionario.addEntry(entrarDDict2);
dcm.set ge(new Integer(campoGrupoTexto.getText()).intValue(),
new Integer(campoElementoTexto.getText()).intValue(),
new Integer(numero.getText()));
.......
}
Donde lo único que cambia es el tipo de dato que vamos a insertar, por lo que el
tercer parámetro que se pasa al constructor de la clase DDictEntry es DDict.tST.
Este panel sirve para poder procesar una imagen mediante un algoritmo desar-
rollado por el GVA. Este panel visualiza la imagen de origen a procesar y ejecuta el
GVA-ELAI-UPM
PFC0075-2003
r 241
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Pasos a seguir:
1. Lo primero que se debe hacer es poner en las variables de entorno los caminos
para encontrar las librerı́as necesarias:
C:/AWouter/bin/win32; C:/AWouter; C:/matlab6p5/bin/win32;
Esto significa que antes se ha debido copiar en estas carpetas los archivos solic-
itados.
En la carpeta C:/AWouter se deben copiar los archivos applylut.dll y dataread.dll.
2. Después se debe ejecutar el setup mglinstaller.exe que instala las librerı́as nece-
sarias de Matlab.
5. Después se tiene que crear una carpeta donde se ponen las librerı́as para sólo
este algoritmo:
C:/matlab6p5/toolbox/images/images/private y se incluyen en ésta bwlabel1.dll
y bwlabel2.dll.
Esto es a nivel de sistema. Una vez hecho esto se debe realizar una implementación
para que este algoritmo se pueda ejecutar desde nuestro GUI (graphical user inter-
face). Para hacer esto se dan estos pasos:
En el panel de procesamiento se han creado dos JLabel donde poner las imágenes
de origen y la de salida o procesada. Se ha incluido además un JTextArea para decir el
camino y el nombre de la imagen procesada y dos botones, uno para abrir la imagen
a procesar y otro para empezar el procesamiento. Figura 6.35.
Pasos en JBuider7.0:
GVA-ELAI-UPM
PFC0075-2003
r 243
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
escribirEnArchivo.println(fotoEntradaCamino);
imagenProcesada = textoImagenSalida.getText();
escribirEnArchivo.println(imagenProcesada);
etiquetaSeleccionImagen.setText(fotoEntradaCamino);
......
Donde se muestra la imagen de entrada (setIcon) y se escribe el camino
de entrada y de salida en el fichero files.txt de donde después con el botón
que se ve a continuación se saca esta información.
Los datos de texto como el nombre del paciente, el aparato que hace la imagen,
la parte del cuerpo examinada, etc, se insertan de la forma vista en el “Panel Visor
Dicom”.
En esta parte vamos a ver la forma de cómo insertar los datos de una sóla imagen.
GVA-ELAI-UPM
PFC0075-2003
r 245
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
1. Botón Monochrome:
La implementación de la función de este botón es de la forma:
dcmNueva.imagePixelData(imagenJPG.getHeight(null),imagenJPG.
getWidth(null),8,8,7,pix);
dcmNueva.write(salvar,true);
.......
}
GVA-ELAI-UPM
PFC0075-2003
r 247
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
2. Botón RGB:
Para el caso de la imagen en color se realiza de la misma forma. La diferencia
es que se usa otra implemtentación del método imagePixelData ya que es un
método sobrecargado y se utiliza debido al cambio de parámetros que se pasan
a éste:
dcmNueva.imagePixelData(imagenJPG.getHeight(null),
imagenJPG.getWidth(null),0,pix);
Se ha visto cómo crear un archivo DICOM de escala de grises, pero al hacer ésto
se tiene un problema: el tamaño de los archivos es muy grande debido a que no se ha
realizado ningún tipo de compresión a los datos de pı́xel, por lo que el espacio que
ocupan es bastante grande.
Se crea una instancia de la clase Compression (c) que después usa su método
compress, el cual necesita saber el tipo de compresión a usar. En este momento se
GVA-ELAI-UPM
PFC0075-2003
r 249
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
tiene que decir que el único tipo de compresión que realiza este servicio es el señalado
arriba, TransferSyntax.JPEGLossless, mientras que con los otros tipos no se consigue
lo buscado con la limitación de que funciona sólo con imágenes monochrome.
No comprimido: tamaño = X
Comprimido: tamaño = X / 2
Para este caso se ha introducido en un array de Image todas las imágenes que se
quieren insertar en el archivo DICOM.
Una vez insertadas, se procede a sacar los datos de pı́xel de estas instancias Image.
En este caso se van a guardar estos datos en una matriz de bytes en vez de array int.
Una vez hecho ésto se procede a insertar estos datos en el archivo DICOM a crear.
Para todo esto se usan diferentes botones que realizan las diferentes funciones
vistas antes:
GVA-ELAI-UPM
PFC0075-2003
r 251
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
imagenesTotales);
todosBytesJuntos = todoJunto;
if (JFileChooser.APPROVE OPTION == jFileChooser1.
showSaveDialog(this))
{
try
{
String rutaArchivoDicomGuardar = jFileChooser1.
getSelectedFile().getAbsolutePath();
........
dcmNueva.imagePixelData(imagenJPG.getHeight(null),
imagenJPG.getWidth(null),8,8,7,todosBytesJuntos);
........
dcmNueva.write(salvar,true);
........
}
}
}
Como se ve en este código, una vez recogidas todas las instancias Image en el
array, se pasa a sacar de cada objeto Image sus datos de pı́xel y se reunen en
una matriz de bytes llamada arrayDeArrayDeBytes.
Una vez hecho esto, se unen esos array de bytes en uno sólo mediante el método
unirBytesArray(byte[][] secuencia, int numeroDeImagenes), el cual es el dato a
insertar en nuestro archivo DICOM, donde se recogen todas nuestras imágenes.
Este archivo está sin compresión. Se puede realizar una compresión como la indi-
cada antes y la reducción de tamaño es de la relación 2 a 1 aproximadamente, es decir
el tamaño del archivo comprimido es la segunda parte del archivo sin comprimir.
Generación de ejecutables
Una vez creada la versión Beta de nuestra aplicación Cliente DICOM es importante
poder distribuirla para que sea ejecutada sobre cualquier sistema operativo, siendo
de esta manera una aplicación multiplataforma.
GVA-ELAI-UPM
PFC0075-2003
r 253
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
Pasos a seguir:
Para el caso del servidor se puede o bien crear el recopilatorio .jar o bien ejecutar
cuando se quiera poner el funcionamiento el .class, ya que el servidor se debe poner
solo una vez en funcionamiento y no hace falta ningún tipo de administración.
Para crear el .jar de una aplición no basada en GUI se hace de la forma descrita
en el apartado de Utilidades de SDK, utilizando la utilidad jar.
Instalación
Para la instalación de la aplicación cliente hay que seguir los siguientes pasos:
Para poner el programa, tan solo hay que ejecutar el programa cliente, en nuestro
caso CuatroW.exe
5. Poner los .class que en este caso son Storagescp.class, Storagescu.class, Connec-
tion.class y Encri.class en la raı́z que en Windows es C:\.
java Storagescp
GVA-ELAI-UPM
PFC0075-2003
r 255
CAPÍTULO 6. DESARROLLO DE APLICACIÓN Fernando Ballesteros Herranz
6.8. Conclusiones
Esta aplicación es una versión beta de un posible programa mucho más avanzado
que de soporte a más funciones del estándar DICOM. Ha sido desarrollado en Java
por lo cual hace que sea un sistema multiplataforma y más eficiente.
Cierto es que utilizando las librerı́as JDT se han detectado limitaciones no respecto
a lo establecido en el estándar sino con la encriptación de los datos de los pacientes
por la red.
A pesar de ello, se trata de una tecnologı́a que está madurando con mucha rapidez,
estabilidad y fiabilidad. Cabe esperar que en los próximos años DICOM vaya a ser
cada vez más utlilizado en el ámbito de la medicina y la investigación.
El único inconveniente de esta aplicación es que es una versión beta, y por ella sola
no funciona, debe ser retrasado el reloj de la máquina sobre la que estemos trabajando
al año 2002, para ası́ tener un año de utilidad este programa. Si se quieren más años
tan solo habrı́a que retrasar el reloj más tiempo atrás.
Administración de sistemas
El sistema operativo NT fue desarrollado por Microsoft para superar los obstáculos
impuestos por la vieja arquitectura de sus sistemas operativos MSDOS y Windows.
NT es un sistema operativo completo, que puede ser instalado sobre un equipo nuevo
sin necesidad de software adicional, como le ocurre a Windows 3.x, y que ofrece nuevas
tecnologı́as para el desarrollo y ejecución de todo tipo de aplicaciones.
257
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Hay varios tipos de gestores de archivos para los equipos, éstos son utilizados
dependiendo del sistema operativo y la gestión realizada por el administrador de la
red:
Ext 32: sistema de gestión de archivos utilizado por equipos Unix y sistema
operativo Linux.
Hay más tipos de gestores de archivos, sólo se han señalado los que pueden ser
interesantes en una administración de equipos de una Red basada en Windows y a lo
sumo la utilización de Samba para la compatibilidad con equipos con Linux.
GVA-ELAI-UPM
PFC0075-2003
r 259
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
las hojas de cálculo. Esto evita al usuario largos tiempos de espera en su trabajo
habitual.
Para ver el funcionamiento de la red Microsoft hay que distinguir dos partes:
En los grupos de trabajos los servidores y estaciones de trabajo configuran una red
local del tipo de igual a igual. En este modo de funcionamiento, en principio todos los
ordenadores pueden ser clientes y servidores simultáneamente. Los grupos de trabajo
fueron introducidos por Microsoft cuando introdujo en el mercado Windows para
Trabajo en Grupo. Este esquema de funcionamiento es bastante sencillo, ya que no
precisa de la existencia de la figura del administrador del grupo.
Ordenadores con MSDOS o Windows 3.1, con el cliente de red Microsoft insta-
lado.
Otros tipos de ordenadores, por ejemplo los que usan LAN Manager para UNIX,
o con el software de SMB (por ejemplo Samba).
GVA-ELAI-UPM
PFC0075-2003
r 261
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
superar las decenas, la estructura creada por el dominio aporta numerosas ventajas.
La primera y más importante es la seguridad del dominio.
Un usuario del dominio puede pertenecer a varios grupos, de manera que cada uno
de los grupos a los que pertenece le permita realizar una serie de tareas diferentes.
El sistema de dominios simplifica la administración de servidores y estaciones de
trabajo. A medida que se añaden estaciones y servidores al dominio, el administrador
utiliza las herramientas administrativas para darlos de alta en el dominio. Cuando
un equipo es dado de alta en el dominio puede comunicarse de una manera segura
con los demás miembros del dominio. De esta manera puede reconocer a los demás
usuarios y equipos del dominio. Esta tarea es realmente sencilla. Durante el proceso
de instalación de una estación de trabajo o servidor NT, aparece un cuadro de diálogo
en el que se da la oportunidad de añadir el equipo al dominio. Para añadir el equipo
basta escribir el nombre del dominio y nombre de usuario y contraseña con privilegios
de administrador válido en el dominio. El proceso de instalación se pone en contacto
con el controlador del dominio y da de alta al ordenador en el dominio. Una vez que se
ha dado de alta en el dominio, el programa de instalación configura automáticamente
el sistema para que sea miembro del dominio. El proceso completo se desarrolla en
pocos segundos y sin intervención del usuario.
Estaciones de trabajo. Son los clientes del dominio, y pueden ser de diferentes
tipos (Windows, Os/2, etc.)
Otros tipos de servidores. Hay varios sistemas operativos que de alguna forma
pueden acceder al dominio NT, normalmente con sus propias herramientas de
integración. Por ejemplo, desde que Microsoft hizo público el protocolo SMB,
hay sistemas que soportan parte de la funcionalidad de este protocolo, aunque
no se pueden construir controladores de dominio con otros sistemas operativos.
En una red Microsoft se pueden compartir varios tipos de recursos, como pueden
ser impresoras y unidades de red. En una red Microsoft el nombre de los recursos
sigue el siguiente convenio:
\\servidor\recurso
\\servidor\recurso\directorio\directorio\fichero.exetension
GVA-ELAI-UPM
PFC0075-2003
r 263
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
otro tipo de recursos, como unidades CD-ROM, modems, fax (con el software ade-
cuado, no incluido en NT), y otros tipos de recursos especiales, como pueden ser las
tuberı́as creadas entre el controlador del dominio y los ordenadores conectados a él.
Para crear los recursos se deben utilizar las herramientas apropiadas en cada caso:
Por ejemplo, siempre que se inicia NT, el sistema de red comparte automática-
mente en modo administrativo las unidades de disco. Ası́ por ejemplo tendremos:
\\servidor\c$
\\servidor\d$
Este mecanismo permite de una manera muy cómoda acceder a los admin-
istradores a los diferentes discos de todas las estaciones de trabajo del dominio,
para realizar labores de copia de ficheros, instalación de aplicaciones, y otras
tareas. Para conectarse a un recurso compartido en modo administrativo, ya
que su nombre no aparece en los listados de recursos, debemos seleccionarlo
manualmente:
Otra forma de acceder los administradores a los discos de las estaciones de trabajo
del dominio es:
Éste es un buen método para escanear con antivirus las máquinas desde otras
máquinas.
GVA-ELAI-UPM
PFC0075-2003
r 265
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Cuando un usuario va a acceder a una red, lo primero que debe realizar es un inicio
de sesión. El inicio de sesión consiste en que el usuario debe introducir un nombre de
usuario y una contraseña, que serán utilizados por el sistema para acceder a la red.
Ya que en el grupo de trabajo no hay servidores dedicados a validar los inicios de
sesión, el inicio de sesión en Windows para trabajo en grupo es simple. El inicio de
sesión es un mero anuncio de que el usuario se dispone a utilizar los recursos de red.
No se realiza ninguna comprobación de seguridad, es decir, cualquier usuario puede
iniciar sesión con cualquier nombre dentro del grupo de trabajo. No existe ningún
mecanismo que impida al usuario iniciar sesión de red.
El cliente encripta los datos enviados por el servidor con la contraseña que le ha
suministrado el usuario. Este nuevo conjunto de datos es enviado al servidor.
El servidor encripta los datos originales, con la contraseña del usuario que guar-
da en la base de datos de NT. Ahora compara ambos conjuntos de datos.
El inicio de sesión en el dominio sólo se produce una vez. Es decir, una vez que
un usuario ha iniciado sesión en un dominio, no necesita suministrar de nuevo su
contraseña para acceder a los diferentes recursos del dominio. En todo momento, la
validación del usuario se va a realizar a través de los controladores y servidores.
GVA-ELAI-UPM
PFC0075-2003
r 267
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Todo dominio tiene una base de datos de usuarios. La copia original de esta base
de datos reside en el controlador principal del dominio. En esta base de datos quedan
registradas todas las caracterı́sticas de los usuarios, sus cuentas, y de los ordenadores
que forman parte del dominio.
Además del controlador principal del dominio, puede haber dentro de un dominio
varios controladores secundarios del dominio. En estos controladores se mantiene una
copia de la base de datos de usuarios del dominio. Si el controlador del dominio
está muy cargado o simplemente está inactivo, cualquier controlador del dominio
puede validar el inicio de sesión en el dominio.
Los cambios se realizan siempre sobre el controlador principal del dominio, y son
enviados automáticamente a los demás controladores del dominio. Hay que tener en
cuenta que esto se realiza con una pequeña demora temporal, que se puede reducir
sincronizando los servidores con el administrador de servidores.
NT Server está preparado para configurar servidores. Aunque realmente los núcleos
de NT Server y Workstation son muy parecidos, la versión Server incluye una serie de
mejoras en el núcleo y en los diferentes módulos del sistema que lo hacen más robusto
en tareas de servidor de red. NT Server da mayor prioridad a los accesos mediante
red frente a las aplicaciones de usuario que se ejecutan en el servidor. Además NT
Server no tiene el lı́mite de 10 conexiones simultaneas de red que tiene NT Worksta-
tion. NT Server ofrece mayor seguridad en el almacenamiento de datos, ya que posee
caracterı́sticas avanzadas de tolerancia a fallos que no han sido incluidas en la versión
Workstation.
En NT hay dos tipos de usuarios, aquellos que pertenecen a una máquina que
corre NT WK o Server y aquellos que pertenecen a un dominio NT. Para cada uno de
estos tipos de usuarios existe una herramienta de administración: el administrador de
usuarios incluido en NT Workstation y el administrador de usuarios para dominios
incluido en NT Server (ver figura A.2).
GVA-ELAI-UPM
PFC0075-2003
r 269
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Nombre completo Es el nombre completo del usuario. Si este usuario es una per-
sona se suele escribir el nombre y apellidos.
Contraseña Aquı́ se debe escribir la contraseña para el usuario. Puede incluir es-
pacios, mayúsculas y minúsculas, e incluso caracteres especiales. NT admite
hasta 14 caracteres. Cuando se va escribiendo aparecen asteriscos, y una vez
completada en el cuadro aparece una lı́nea de asteriscos, siempre de la misma
longitud.
Al final del cuadro de diálogo aparecen varios botones (ver figura A.3).
GVA-ELAI-UPM
PFC0075-2003
r 271
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Grupos Permite establecer los grupos a los que pertenece un usuario (ver figura
A.4). En NT hay dos tipos de grupos:
Grupos globales Válidos para dominios en los que se confı́an. Aparecen mar-
cados con el icono de grupo global.
Grupos locales Son grupos locales al servidor o estación de trabajo.
Perfil Permite controlar las caracterı́sticas del entorno de un usuario (figura A.5).
Se puede establecer:
Perfil Nombre del fichero que representa el perfil del usuario para NT. Hay que
escribir un fichero en formato UNC (Univer name convention), es decir:
\\servidor\recurso\directorio\fichero.bat.
Iniciar desde Este cuadro de diálogo permite seleccionar los ordenadores desde los
cuales un usuario puede iniciar sesión. Se pueden especificar hasta 8 ordenadores
que ejecuten NT, o permitir el inicio en todos los ordenadores del dominio. Ver
figura A.7.
GVA-ELAI-UPM
PFC0075-2003
r 273
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Modificar un usuario
Los grupos locales pueden obtener permisos en los servidores del dominio propio.
Pueden ser miembros de los grupos locales los miembros del dominio, los grupos
globales del dominio y los grupos globales de otros dominios en los que se confı́a.
Los grupos globales tienen como miembros a los usuarios del dominio y se pueden
utilizar tanto en los servidores del dominio como en las estaciones de trabajo del
dominio. También se pueden usar en otros dominios en los que se confı́a.
GVA-ELAI-UPM
PFC0075-2003
r 275
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
En NT se pueden fijar una serie de directivas comunes para todo el dominio. Entre
estas se puede fijar el plan de cuentas para el dominio, que fija propiedades de las
cuentas tales como la polı́tica de contraseñas, el plan de derechos de usuarios, que
permite asignar determinados permisos genéricos usuarios o grupos del dominio, o el
plan de auditoria, que permite activar los elementos del sistema de auditoria en el
dominio.
GVA-ELAI-UPM
PFC0075-2003
r 277
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Los derechos de usuarios son una serie de permisos que no se aplican sobre un
objeto concreto, como un fichero, impresora o directorio, sino que se aplican al sistema
completo. Estos permisos tienen prioridad sobre los permisos asignados sobre los
objetos del sistema. Se pueden asignar a cada tipo de derecho de usuario los usuarios
o grupos de usuarios a los que se necesite otorgar ese derecho.
Los derechos de usuarios pueden ser modificados desde el cuadro de diálogo “Plan
de derechos de usuarios” accesible desde el menú Directivas\Derechos de usuar-
ios. Ver figura A.10.
Iniciar sesión como proceso por lotes. Este derecho está pensado para los ser-
vicios que atienden las peticiones de usuarios en forma de transacciones, como
por ejemplo servidores POP3 y otros. Actualmente no está implementado en
el sistema operativo, pero algunos servicios verifican que el usuario posea este
derecho antes de atender su petición.
Los perfiles de usuario de NT permiten especificar las opciones del entorno para
cada usuario de Windows NT. En Windows 3.x estas opciones habitualmente se guard-
aban en archivos .ini que eran archivos de texto normalmente compartidos por todos
los usuarios de la aplicación. En NT todas las opciones y configuraciones del sistema
y de las aplicaciones se guardan en el registro.
Cuando un usuario inicia una sesión por primera vez en NT, el sistema crea un
registro personalizado para el usuario. Si no se ha definido previamente un perfil para
el usuario, el sistema utilizará una copia del perfil de usuario por defecto. Tanto los
perfiles de usuario como el perfil de usuario por defecto se puede editar para establecer
de antemano las opciones del entorno de usuario.
GVA-ELAI-UPM
PFC0075-2003
r 279
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Se puede modificar este mecanismo para asignar un perfil concreto al usuario. Esto
se hace con el administrador de usuarios, que permite asignar un fichero de perfil,
creado con el editor de perfiles, al usuario. Se pueden elegir dos tipos de perfiles:
Se pueden eliminar perfiles antiguos de usuarios del sistema. Para ello, deberemos
abrir el menú Opciones/Eliminar perfil del icono Instalación de Windows
en la carpeta principal del administrador de programas.
Local Este perfil es especı́fico del ordenador en el que se ha creado. El usuario sólo
puede acceder al perfil local al iniciar sesión interactiva en el ordenador en el
que reside el perfil.
Móvil Este tipo de perfil puede ser usado por el usuario en cualquier NT del dominio.
Es parecido al perfil móvil de Windows 95, pero es más completo.
Un fichero con las claves del registro correspondientes al usuario. Este fichero
se llama: Ntuser.dat
Un fichero log, que mantiene los cambios efectuados en el registro. Se llama
:NTuser.dat.log. Cuando el usuario cierra sesión, el fichero NTuser.dat se actu-
aliza con los cambios introducidos en NTuser.dat.log. En el caso de que existan
problemas al actualizar el fichero NTuser.dat, los cambios se actualizarán en el
siguiente inicio de sesión.
Directorios de datos, enlaces directos y aplicaciones, como son el Escritorio,
carpeta Personal, carpeta Favoritos, carpeta Enviar a y otras carpetas ocultas.
GVA-ELAI-UPM
PFC0075-2003
r 281
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Configuramos la seguridad del recurso para que los usuarios tengan acceso a su
perfil.
Perfiles Obligatorios
Este último paso impide en NT 4.0 que el usuario pueda iniciar sesión con el perfil
cache si el perfil principal no está disponible (el servidor de perfiles está fuera de
servicio).
GVA-ELAI-UPM
PFC0075-2003
r 283
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
El modo de trabajo de las directivas del sistema consiste en modificar ciertas claves
del registro, que son las que cierran el paso a las partes del registro más sensibles.
Las herramientas de administración y el panel de control utilizan estas claves para
permitir o denegar el acceso del usuario para la modificación de estas partes. Cuando
se manejan directivas del sistema y perfiles de usuario hay que tener en cuenta que:
Las directivas del sistema complementan a los perfiles, ya que también añaden
claves al registro. El perfil del usuario normalmente almacena información de
configuración que no compromete la seguridad del sistema.
Las directivas del usuario se aplican añadiendo las claves después de haber
cargado el perfil de usuario. Esto permite que independientemente de la config-
uración almacenada en el perfil del usuario, se puedan aplicar las restricciones
de seguridad necesarios para el usuario. Las directivas del sistema por tanto se
aplican añadiendo o alterando las claves del registro tras la carga del perfil.
Se crea una nueva directiva con el menú Archivo\nueva directiva del editor
de directivas.
El editor de directivas trabaja modificando las claves del registro. Para ello al crear
una nueva directiva el editor carga desde unas plantillas un conjunto de directivas.
Por defecto, el editor de directivas dispone de tres plantillas:
windows.adm Contiene configuración sólo de Windows 95. Esta plantilla debe añadirla
manualmente un administrador desde el subdirectorio \Windir\inf.
GVA-ELAI-UPM
PFC0075-2003
r 285
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Hay que tener en cuanta que las directivas se aplican de modo acumulativo. Si un
usuario pertenece a varios grupos para los que se han fijado directivas, el orden de
aplicación se obtiene según se halla fijado en el cuadro de diálogo “directivas de
grupo”
A.7.1. Introducción
El protocolo TCP/IP nació de los trabajos del ARPA (Advanced Research Project
Agency)del Departamento de Defensa de los EEUU, durante las décadas de los 60 y
70. A través de las universidades y centros de investigación se trató de construir una
red que fuese capaz de resistir las caı́das parciales de la misma (por ejemplo en caso
de guerra). Ası́ surgió ARPANET, la primera red de intercambio de paquetes.
Netbeui Para compartir ficheros e impresoras en redes sencillas. Para este tipo de
GVA-ELAI-UPM
PFC0075-2003
r 287
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
IPX/SPX De aplicación en redes en las que existan servidores Novell Netware. Tiene
un buen rendimiento en ficheros e impresión y poca dificultad de administración.
TCP/IP Es el que peor rendimiento ofrece para uso en ficheros e impresión, pero es
el que presenta mayores herramientas para crear grandes redes de ordenadores.
Es encaminable y es imprescindible en Internet. Microsoft ha implementado
todas las caracterı́sticas de Netbios dentro del protocolo TCP/IP. Es el que
obliga al mayor esfuerzo administrativo.
Una red de ordenadores está compuesta de dos partes: la red fı́sica en sı́ y el pro-
tocolo que utilizan los ordenadores para comunicarse entre sı́. La red fı́sica está com-
puesta normalmente de una serie de subredes, a las que se conectan los diferentes
equipos (ordenadores, impresoras...).
Esta red puede tener una topologı́a muy variada. Actualmente existen dos tipos
de topologı́as:
Ethernet, que es del tipo bus, Token Ring, que tiene topologı́a de testigo y uti-
liza topologı́a de bus con paso de testigo. El protocolo TCP/IP fue desarrollado
inicialmente para Ethernet , pero admite sin problemas las otras dos tecnologı́as.
Actualmente se está imponiendo la tecnologı́a Ethernet en las redes pequeñas, so-
bre todo sobre cableado de par trenzado (10 Base T), y por su bajo coste y buen
rendimiento.Normalmente una red tı́pica estará compuesta por una serie de orde-
nadores conectados entre sı́, además de impresoras y otros elementos de la red.
Cada ordenador tendrá al menos una tarjeta de red. Esta red se puede unir a otras
redes o al resto de la Internet a través de puentes, encaminadores y otros tipos de
enlaces.
Los protocolos token ring y token bus se comportan de modo análogo. El campo
de datos contiene el paquete IP. Cada paquete IP está compuesto de una cabecera y
un campo de datos.
En el origen del protocolo TCP/IP, el TCP era el protocolo usado, pero luego se
extendió el protocolo IP con nuevos protocolos como son el Protocolo de Control de
Mensajes de Internet (ICMP), los protocolos de resolución de direcciones directo e
inverso (ARP y RARP) y el protocolo de Datagramas de Usuario (UDP).
A cada servidor de la red TCP/IP se le asigna al menos una dirección IP, que
es un número de 4 octetos. En la red Internet no hay dos ordenadores con el mismo
número IP. En caso de necesidad se pueden asignar más números IP a ese ordenador.
Además cada dirección IP tiene un nombre asociado. Ese nombre está formado por el
nombre del servidor, que es único dentro de una subred, y por el nombre del dominio,
que identifica a la subred dentro del conjunto de las subredes de Internet. La forma
de asignar IP, nombres y nombres de dominio en Internet sigue una serie de criterios
que permiten el encaminamiento de los paquetes IP por la red y la traducción de
nombres de ordenadores en números IP.
GVA-ELAI-UPM
PFC0075-2003
r 289
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
Organización tipo B Los dos primeros octetos del IP están fijos. La organización
dispone de 65536 direcciones IP para asignar. Suelen ser organizaciones de
tamaño medio (universidades, grandes empresas).
Organización tipo C Se fijan los tres primeros octetos, dejando 256 posibles direc-
ciones.Se utilizan en pequeños proveedores de servicios Internet (ISP).
La mayor parte de los clientes TCP/IP tienen versión para NT. Se está haciendo
un gran esfuerzo a su vez para dotar a NT de todos los servidores tı́picos de Internet.
Hay servidores de dominio público de FTP, DNS, Gopher, TELNET, SMTP, POP3
Y WEB, aparte de las propias incluidas en el NT Server. además existen versiones
comerciales de dichos servidores, normalmente más potentes y seguras.
GVA-ELAI-UPM
PFC0075-2003
r 291
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
En este cuadro se pueden señalar las opciones a instalar. Las más comunes son
las utilidades de conectividad (clientes ftp, telnet, finger, etc.), y son básicamente las
únicas necesarias. En este cuadro de diálogo también se puede seleccionar la config-
uración automática vı́a el protocolo DHCP. En NT 4.0 el cuadro de diálogo se ha
modificado de manera que ahora la configuración del protocolo TCP/IP está organi-
zada por bloques funcionales. En el caso de configuración manual debemos conocer
una serie de parámetros. El primero es la dirección IP del ordenador. En NT se puede
asignar una dirección IP a cada adaptador de red instalado, e incluso a un mismo
adaptador se le pueden asignar varias direcciones IP. Esto último se usa en Internet
para crear servidores “virtuales”. Luego se debe incluir una de las tres máscaras de
subred posibles, para redes de tipo A, B o C. Si la red en la que se halla conectado
el ordenador está conectada con otras redes vı́a una pasarela (gateway), que puede
ser un puente o encaminador, hay que incluir su dirección en la casilla para puerta
de enlace.
Como nombre de host, NT por defecto usa el de Windows, pero deberı́a coincidir
con el que se le ha asignado en el servidor de nombres. En la lista “Orden de búsqueda
del servicio de nombres de dominio” debemos proporcionar una lista con las direc-
ciones IP de los servidores de nombres que debe usar. Se pueden incluir servidores
de nuestra red y de otras, aunque suelen ser más lentos. Debemos añadir a la casilla
“nombre de dominio” el nombre de dominio de la subred local. Si no se proporciona
un dominio, el protocolo TCP/IP usa por defecto el dominio local.
Podemos añadir otros dominios para que se usen por defecto, añadiendo entradas
a la lista “orden de búsqueda del sufijo de dominio”.
Se pueden configurar varias opciones avanzadas para cada adaptador de red o pul-
sando el botón avanzadas del cuadro de diálogo “Configuración de TCP/IP”,
en la sección Dirección IP (ver figura A.16).
GVA-ELAI-UPM
PFC0075-2003
r 293
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
que es el Protocolo de Túnel Punto a Punto. Este protocolo permite construir redes
privadas seguras dentro de redes de transmisión públicas, siendo capaz de encapsular
los diferentes protocolos de red empleados en NT, como son NETBEUI, TCP/IP y
IPX/SPX. Este protocolo utiliza cifrado de los paquetes, y algoritmos de clave pública
que hacen muy difı́cil examinar los paquetes enviados a través de una red como puede
ser Internet. En este cuadro se pueden:
Activar el agente de Proxy WINS, para lo cual la red debe disponer de servidor
WINS. Un agente de proxy WINS es un equipo que permite que otros equipos
que no están configurados para acceder a un servidor WINS puedan acceder a
los nombres contenidos en ese servidor WINS. Normalmente esta situación se da
cuando el servidor WINS está en una red remota, por lo que los equipos de la red
local que no tienen activado el cliente WINS no pueden acceder a los nombres
registrados en ese servidor. Al activar el proxy WINS las peticiones de búsqueda
y registro de nombres Windows realizadas en modo local (vı́a broadcast) son
atendidas y redirigidas sobre el servidor WINS por el servidor proxy WINS.
Configurar los parámetros de red de Windows, que funcionan con el protocolo
Netbios sobre TCP/IP. El archivo En NT 4.0 se ha introducido el agente Relé de
DHCP. Normalmente el protocolo DHCP funciona sobre una red local, ya que
se trabaja siempre en modo de difusión de paquetes (broadcast). En este modo
los paquetes no pueden saltar los encaminadores, salvo que éstos soporten el
protocolo de reenvı́o de paquetes BOOTP. Si es necesario que en una red se
tenga acceso a un servidor DHCP remoto, se puede instalar un relé DHCP,
que es un servicio que se conecta con un servidor DHCP remoto para realizar la
configuración dinámica en la red local. Se pueden añadir en el cuadro de diálogo
de Relé DHCP varios servidores DHCP, ası́ como configurar los parámetros de
funcionamiento del relé.
GVA-ELAI-UPM
PFC0075-2003
r 295
APÉNDICE A. ADMINISTRACIÓN DE SISTEMAS Fernando Ballesteros Herranz
[BARBA] Barba Mir, C. A propósito del estándar DICOM 3.0. Hospital Clı́nico
Universitario Lozano Blesa (Zaragoza).
http://www.hcu-lblesa.es/mane/noticia/didcom3.htm
[BATE] Bates, Jon. & Tompkins, Tim. Microsoft Visual C++ 6. 2000, Prentice
Hall.
[CASCA] Cascales, B. & Lucas, P. & Mira, JM. & Pallarés, A. &
Sanchez-Pedreño, S. LATEXuna imprenta en sus manos. 2000, ADI
[HORI] Hori, S. & Prior, F. & Dean Bidgood, W. & Parisot, C. & Claeys,
G. DICOM: An introduction to the standard.
http://www.dicomanalyser.co.uk/html/introduction.htm
297
BIBLIOGRAFÍA Fernando Ballesteros Herranz