miércoles, 22 de abril de 2009

Estructura de Datos de arrchivos de Imagenes

BMP (.bmp)

BMP (Bitmapped File Format) es probablemente el formato de fichero para imágenes más simple que existe. Aunque teóricamente permite compresión (en imágenes de 4 y 8 bits puede usar RLE), en la práctica nunca se usa, guardando las imágenes descomprimidas, lo que significa mayor velocidad de carga pero también mayor peso del fichero gráfico. Admite de entrada cualquier tipo de resolución y profundidades de color de 1, 4, 8 y 24 bits.



La estructura de los ficheros BMP es sencilla, estando formados por una cabecera que contiene las características generales de la imagen (tamaño, número de colores y paleta de colores si es necesaria) y por la información de la imagen en sí, píxel a píxel, de izquierda a derecha, comenzando desde la última línea inferior, motivo por el cual las imágenes en formato BMP se trazan en pantalla de abajo hacia arriba.

BMP es un formato muy utilizado, válido para MAC y PC. Es el estándar de imagen de mapa de bits en sistemas operativos DOS y Windows e IBM OS/2, siendo usado habitualmente en aplicaciones como Word, Excel, PowerPoint, etc. Las versiones de Windows e IBM OS/2 son incompatibles entre sí, aunque hay programas gráficos, como Paint Shop Pro, que pueden trabajar con ambas.

Sus principales ventajas son su sencillez y la calidad de la imagen. Su gran desventaja, el enorme tamaño de los ficheros.

Es soportado tan solo por Internet Explorer.

GIF (.gif)

El formato GIF (Graphic Interchange Format) es uno de los más habituales en imágenes de mapa de bits.

Fue creado por la empresa Compuserve (uno de los principales proveedores de acceso a Internet de los Estados Unidos) en junio de 1987 con objeto de poder transferir imágenes de hasta 256 colores (8 bits) a través de líneas de datos de modo eficaz, existiendo en la actualidad dos versiones del mismo, la original GIF87a y la más reciente GIF89a.

Ambas versiones implementan una rutina de compresión sin pérdidas muy eficaz, basada en la reducción del número de colores y el uso del algoritmo LZW modificado (consistente en no detectar sólo las repeticiones de un color, sino en detectar las repeticiones de ciertas secuencias) consiguiendo de esta forma reducir los archivos a un tamaño mucho menor que otros formatos, lo que hace los ficheros GIF idóneos para su uso en Internet.

Tanto es así que todos los navegadores web actuales soportan el formato perfectamente. Por desgracia, el algoritmo LZW empleado está patentado por Unisys (que compró a Compuserve), lo que produce constantes problemas con las licencias.

La estructura de todo fichero GIF está basada en bloques, que pueden contener información diversa: una imagen, instrucciones acerca de cómo exhibirla, texto, información característica de alguna aplicación, un marcador que determina el final del archivo, comentarios (con información acerca de la imagen en cuestión), etc.



Los ficheros GIF utilizan el modo de color indexado, pudiendo trabajar con dos paletas diferentes, una global y otra local. La paleta global determina los colores de todas las imágenes almacenadas en el GIF (puede haber varias en un mismo fichero), mientras que la local determina específicamente la paleta de cada imagen del GIF (en el caso de haber una sola imagen, la única paleta disponible será la global). Se pueden alcanzar los 256 colores como máximo, pudiendo elegir entre los predefinidos (2, 4 , 8, 16, 32, 128 ó 256) o personalizados (por ejemplo, 12 colores).

La limitación principal que tiene el formato GIF es que tan solo puede manejar 256 colores, lo que hace que una imagen con más de 256 o con transiciones suaves de colores deba reelaborarse con una trama de los colores disponibles, con lo que puede perder calidad. Aunque todo depende del tipo de imagen, ya que a veces puede conseguirse un GIF fotográfico de calidad aceptable (aunque suele tener más peso que la misma imagen en formato JPG).

El formato GIF está pues especialmente indicado en imágenes con menos de 256 colores en las que muchos puntos consecutivos tengan el mismo color, se repitan secuencias de colores o contengan principalmente textos. Además, la variante GIF89a, creada en 1989, permite la creación de imágenes transparentes, de animaciones y de imágenes con entrelazado, elementos gráficos muy útiles, sobre todo en la web.

GIF transparente

Una característica muy útil del formato GIF es la opción de hacer transparente un color determinado de la paleta (usando para ello un canal alfa de 1 bit), con lo que ese color no se verá en pantalla, siendo reemplazado por el fondo de la página. Con ello se consigue que la imagen parezca flotar sobre el cuerpo de la página.



No todas las imágenes son apropiadas para conseguir este efecto. Es condición indispensable que la imagen tenga un fondo de color uniforme y que los bordes de los elementos gráficos de la imagen no se hayan pixelizado (rastrillado) con el fondo.

Cuando dibujamos, por ejemplo, un círculo de color rojo sobre un fondo amarillo, los programas gráficos de mapas de bits suelen aplicar la técnica conocida como antialias o rastrillado, por la cual, y para evitar el efecto negativo de dientes de sierra, se crean alrededor del borde del círculo unos píxeles intermedios entre el color de éste y el color del fondo. Es decir, en el caso que nos ocupa, unos píxeles de diferentes tonos de naranja.

En estas circunstancias, si definimos el color de fondo como transparente, éste no será visible en pantalla, pero sí lo serán los píxeles intermedios, por lo que si la imagen la colocamos sobre un fondo verde, se apreciarán los mismos de forma clara, creando un efecto negativo.

Una solución a este problema es asignar como color de fondo del GIF el mismo que el del fondo de la página, con lo que nos píxeles del rastrillado no se notarán apenas. Claro que esto es posible sólo si la zona de la página sobre la que se va a situar el GIF transparente es de color uniforme.

Hay otro aspecto que hay que tener en cuenta y es que el formato GIF tiene dos subformatos diferentes. Con el más común de ellos, el GIF 87a, no se pueden conseguir colores transparentes, por lo que habrá que utilizar un programa gráfico que permita salvar la imagen en formato GIF 87a, que sí permite este efecto.

Un uso muy extendido y útil de este tipo de ficheros en crear un GIF transparente de 1x1 píxeles y destinarlo a rellenar las celdas sin contenido de una tabla. En muchas ocasiones, si una celda está vacía no coge adecuadamente el tamaño especificado mediante sus atributos width y height. Situando en ella un GIF del tipo mencionado, la celda sí que se mostrará con las dimensiones indicadas. Además, una vez se haya descargado de Internet una vez, el usuario tendrá la imagen en la memoria caché del navegador, pudiendo se utilizada las veces que se quiera sin tener que descargarla de nuevo.

GIF entrelazado

Normalmente, un fichero GIF contiene los datos de cada línea de la imagen de una manera ordenada, de tal manera que al ser cargada por el navegador aparecerá dibujada línea a línea desde arriba hasta abajo.

Se puede cambiar este comportamiento si se ha guardado la imagen como un GIF entrelazado (interlaced GIF). En este caso, las líneas quedan guardadas no de una manera consecutiva, sino en saltos de cuatro en cuatro, y al llegar al final recomienza desde el principio con otra secuencia diferente, también de cuatro en cuatro, así hasta completar la imagen.

Ejempo de GIF entrelazado en esta ventana.

Por lo tanto, un GIF entrelazado se visualiza en cuatro fases, en cada una de las cuales se muestran diferentes líneas de la imagen. El tiempo de carga de una imagen entrelazada y de la misma no entrelazada es el mismo, pero la entrelazada permite que el usuario pueda ver un esbozo de la imagen antes de que ésta acabe de bajar de Internet, volviéndose poco a poco más nítida hasta mostrase tal como se creo.

La mayoría de los programas gráficos actuales ofrecen la posibilidad de guardar una imagen GIF en modo entrelazado, como Photoshop y Paint Shop Pro. En cuanto a su compatibilidad en la web, todos los navegadores comunes interpretan estos ficheros adecuadamente.

GIF animado

Un gif animado consiste en una serie de imágenes en formato GIF89a colocadas secuencialmente, cada una de las cuales se muestra en pantalla durante un intervalo de tiempo determinado.



Cada imagen de la animación se suele conocer con el nombre de fotograma o frame, por semejanza con los fotogramas que forman una película, y puede tener definido un color de su paleta como transparente.



Una secuencia GIF animada puede mostrase una sola vez, repetirse un cierto número de veces (denominadas loop) o repetirse indefinidamente (loop infinito).
Se construyen con programas específicos para ello (Adobe ImageReady, Microsoft GIF Animator, Ulead Gif animator, Animagic, GIF Construction Set, etc.) o con aplicaciones gráficas que implementan esta utilidad, como Paint Shop Pro, Xara o Macromedia Fireworks, y se insertan en las páginas web como una imagen cualquiera, mediante la etiqueta IMG del lenguaje HTML.

Los GIFs animados son soportados por todos los navegadores web, por lo que son muy indicados en este medio, teniendo siempre en cuenta que al tratarse de un formato de mapa de bits, si la animación es muy grande, larga o compleja, el tamaño del fichero resultante puede ser excesivo para que sea práctico.
Uno de los usos más corrientes de las animaciones GIF en las páginas web es la creación de los típicos banners publicitarios, equivalentes en este medio a las vallas publicitarias tradicionales.

JPEG (.jpg / .jpeg)

JPEG es, junto con GIF, uno de los formatos estándares en las páginas web, lo que ha hecho que su uso se haya disparado enormemente. Sus ficheros son válidos tanto para PC como para MAC, es soportado por los navegadores más importantes (Internet Explorer y Netscape Navigator) y puede trabajar en Escala de grises, RGB y CMYK.



Este formato de mapa de bits fue desarrollado por el Joint Photographic Experts Group, asociación de fotógrafos profesionales de Estados Unidos que buscaba un formato gráfico que permitiera el almacenamiento de imágenes fotográficas de calidad con unos pesos de fichero configurable y relativamente bajo.

Este objetivo lo consigue usando el algoritmo de compresión con pérdidas JPEG, basado en el hecho de que el ojo humano no es perfecto y no es capaz de captar toda la información que se puede almacenar el una imagen de 24 bits. El formato JPEG intenta eliminar la información que el ojo humano no es capaz de distinguir, consiguiendo con ello factores de compresión cercanos a 20:1 sin pérdida apreciable de calidad (puede llegar hasta 100:1 y más). Este algoritmo es además configurable, por lo que podemos elegir cuanta compresión queremos dar al fichero. Lógicamente, cuanto más grande sea ésta, menos calidad tendrá la imagen final.

La sobrecompresión produce muestras de color borrosas, así como una imprecisión en las zonas de mayor contraste. Un indicador directo de la sobrecompresión es la presencia de áreas grises alrededor del texto negro sobre fondo blanco. Experimentando con el grado de compresión, podremos llegar a un porcentaje que suponga el mejor compromiso entre calidad y tamaño de fichero. Los programas gráficos permiten esta optimización de forma interactiva, mostrando una simulación del resultado con cada grado de compresión aplicado.



Una desventaja de trabajar con este formato es que las imágenes siempre sufren algún tipo de pérdida, por lo que nunca vuelven a tener la calidad original. Por ello es conveniente que una vez escaneada la imagen se almacene una copia en algún formato que permita compresión sin pérdidas, como BMP, con lo que dispondremos de la imagen almacenada con su máxima calidad.

Si se abre un archivo JPEG, se modifica y luego se guarda de nuevo como JPEG, se producirá una nueva compresión del fichero, lo que provocará una apreciable degradación del archivo. Por esta razón es conveniente realizar las modificaciones necesarias en la imagen original antes de guardarla en formato JPEG.

El archivo JPEG se comprime al guardarlo en disco, pero debe ser descomprimido para utilizarlo en una aplicación. Esto significa que la cantidad de memoria que se necesita para manejar la imagen puede ser mayor que el tamaño del archivo guardado en varios órdenes de magnitud. Un archivo JPEG de 1 Mb puede descomprimirse fácilmente en una imagen de 100 Mb. Por eso, al abrir archivos JPEG, se produce una reducción en las prestaciones debido al tiempo requerido para procesar la compresión y la descompresión.

JPEG es un formato especialmente adecuado para imágenes con muchos colores y con gradaciones de tonos (imágenes de tono continuo), como las fotografías o las digitalizaciones de alta calidad. Se usa para almacenar imágenes de tipo vectorial o dibujos sencillos se observará como la compresión disminuye enormemente y las modificaciones hechas sobre la imagen original son apreciables a simple vista.

En el caso de imágenes a color trabaja con profundidades de color de 24 bits separados en tres canales (RGB), por lo que permite casi 16,8 millones de colores (color verdadero). En el caso de imágenes en escala de grises trabaja con un solo canal de 8 bits.

No permite el uso de transparencias (no maneja canales alfa) ni animaciones, pero sí que permite el uso de compresión progresiva, que muestra la imagen gradualmente, mientras la descarga el explorador Web, utilizando series de lecturas para mostrar versiones cada vez más detalladas de toda la imagen, hasta que se han descargado todos los datos. Con ello se obtiene un efecto similar al entrelazado de los ficheros GIF.

Ejemplo de JPEG progresivo en esta ventana.

PNG (.png)

El formato PNG (Portable Network Graphic) es un formato de mapa de bits de libre distribución, válido para PC y MAC, desarrollado para su uso en la web como alternativa a los formatos GIF y JPG, sobre todo al primero de ellos, propiedad de la empresa Unisys Corporation, más simple y menos completo



PNG utiliza un esquema de compresión sin pérdidas para reducir el tamaño del archivo, manteniendo intacta la calidad original de la imagen.

Puede trabajar en modo Escala de Grises (con un canal alfa), en modo Color Indexado (8 bits, hasta 256 colores, paletas de colores) y en modo RGB (24 bits, 16,8 millones de colores y 48 bits, con 24 bits para canales alfa), por lo que admite 256 niveles de transparencia.

Las transparencias conseguidas con PNG son de mayor calidad que las puede conseguir el formato GIF, ya que, al trabajar con muchos más colores, genera transparencias de fondo sin bordes dentados.

También permite imágenes entrelazadas (de visualización progresiva) y detección de errores, pero no implementa animaciones, punto en el que se encuentra en desventaja respecto al formato GIF.

Ejemplo de PNG entrelzado en esta ventana.

Según sus desarrolladores, un archivo PNG que almacene la información en 8 bits tiene un tamaño de 10 a 30 veces menor que un GIF con las mismas características, siendo a la vez capaz de almacenar con 48 bits imágenes en color real con transparencias, de calidad igual o mayor que sus equivalentes en formato JPEG.

Sin embargo, en la práctica el formato PNG adolece de bastantes errores. En general, los ficheros PNG tienen un tamaño mayor que sus equivalentes en GIF o JPEG, en imágenes de pocos colores cambia a veces alguno de ellos inexplicablemente, aspecto muy negativo, sobre todo cuando el color afectado es el de fondo.

Es de suponer que en un futuro, y puesto que cuenta con el apoyo del W3C, el formato PNG consiga una elevada calidad en todo tipo de imágenes para la web, con ficheros de peso reducido y sin errores en la interpretación del color. Mientras tanto, los diseñadores web siguen utilizando preferentemente GIF y JPEG.

SVG (.svg)

SVG (Scalable Vector Graphic) es un nuevo formato de gráficos vectoriales para la web desarrollado por el W3C con vistas a ofrecer a los desarrolladores un formato gráfico de alta calidad y totalmente integrado con los lenguajes HTML y XML.

SVG maneja gráficos vectoriales que almacena mediante un lenguaje de etiquetas propio, semejantes a la que se utilizan en HTML, por lo que pueden ser editados y modificados con cualquier editor de texto simple.



Podemos pues definir el formato SVG como un puente entre diseño gráfico y programación, entre arte y tecnología. Efectivamente, debido a su naturaleza puramente matemática, un gráfico SVG es una sucesión de objetos y puntos posicionados y orientados en el lienzo de trabajo, elementos que son definidos por fórmulas matemáticas y que pueden ser accedidos por código de programación para modificar sus propiedades.

Por ejemplo, el código para definir una elipse con fondo azul claro es el siguiente:


"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">




Maneja 24 bits de profundidad de color, pudiendo además usarse en su definición cualquiera de los sistemas estándar (RGB, CMYK, etc.).

Entre las ventajas del formato SVG podemos citar que trabaja con gráficos vectoriales editables, admiten curvas Bézier, transparencias, suavizados y rastrillados, admite textos editables y fuentes TrueType y Type 1, pueden incluir sonidos y etiquetas explicativas, permite la creación de animaciones en escala de tiempo y que es una tecnología de código libre, no propietaria, con las ventajas que eso representa para los desarrolladores.

Como pega, decir que en la actualidad, y al no ser aún un estándar, para visualizar los gráficos SVG en los navegadores web hace falta instalar un plugin especial en nuestro ordenador, salvo que ya tengamos instalado un programa de creación SVG. Este plugin es pesado (varios megas) y además exige un trabajo elevado a la CPU de las máquinas. Sin embargo, en un futuro próximo, cuando el lenguaje XML sea un estándar "de facto", los gráficos SVG se integrarán perfectamente en los navegadores web, sin necesidad de software adicional.

Una de las aplicaciones gráficas que permite crear este tipo de ficheros y trabajar con ellos es WebDraw, de la casa Jasc Software, cuya versión shareware se puede descargar desde la dirección http://www.jasc.com/download_4.asp.

El plugin se puede descargar desde la dirección http://www.adobe.com/svg/viewer/install/

SWF (.swf)

SWF (Shockwave Flash) es el formato de salida del programa de gráficos vectoriales y animaciones Macromedia Flash, resultado de la compresión de los ficheros FLA de trabajo de esta aplicación.



Su posibilidad de uso en las páginas web y su compatibilidad con los navegadores más comunes (previa instalación del plugin necesario, aunque los navegadores más importantes lo traen ya por defecto) ha revolucionado el mundo de la web, ya que es posible ofrecer a los usuarios unos gráficos vectoriales de calidad, que pueden ser escalados (cambiados de tamaño) sin pérdidas de calidad y que permiten al usuario interactuar con ellos, así como complejas animaciones basadas en fotogramas.



Además, los ficheros SWF pueden ser visualizados independientemente de la web, en una ventana propia, permitiendo la construcción de verdaderas aplicaciones multimedia interactivas, como juegos, presentaciones, etc.

El formato SWF produce ficheros de un tamaño verdaderamente reducido, sobre todo si las imágenes que contiene son de naturaleza vectorial, ya que no almacenan información píxel a píxel, sino fórmulas matemáticas. Incluso la interactividad de los objetos está definida mediante un lenguaje propio de script, Action Script), que apenas carga el fichero. No obstante, el tamaño aumentará mucho si se introducen en el fichero imágenes de mapa de bits.

Dentro de un archivo SWF se pueden incluir elementos vectoriales y de mapa de bits, textos en fuentes escalables, sonidos y vídeos, pudiendo programarse acciones de respuesta a eventos y animaciones mediante código de script.

Está especialmente recomendado en el caso de imágenes o animaciones de gran tamaño (el tamaño no tiene importancia en caso de vectores), para logotipos de calidad, en caso de imágenes ampliables con detalles, por ejemplo, como mapas y planos, en la construcción de banners animados, etc.

El principal inconveniente que presenta es la necesidad de un plugin específico para ver las imágenes en él contenidas, ya que, aunque se puede descargar libremente de la web de Macromedia, obliga al usuario a la instalación de un software adicional. Por otra parte, y en lo que a la web se refiere, los gráficos SWF presentan diversos problemas relacionados con aspectos como usabilidad, programación, etc.

jueves, 5 de marzo de 2009

Librerias API de Java

AWT

Abstract Windows Toolkit (AWT) es el original juego de herramientas GUI de Java. Sus principales ventajas son que viene con cada versión de la tecnología Java, incluyendo aplicaciones de Java en navegadores web antiguos, y es muy estable. Esto significa que usted no necesita instalar nada, puede depender de que esté disponible en todo el mundo a encontrar un entorno de tiempo de ejecución Java, y tendrá las características que usted espera.

AWT es un conjunto de herramientas muy simples con pocos componentes GUI, con administradores de diseño, y eventos. Esto se debe a que Sun Microsystems decidió utilizar un mínimo común denominador (LCD) para un enfoque AWT. Sólo se definen los componentes GUI de Java para todos los entornos host que se utilizarían. Como resultado de ello - y por desgracia - algunos componentes de uso común, tales como tablas, árboles, barras de progreso, y otros, no son compatibles. Para aplicaciones que necesitan más tipos de componentes, es necesario crear desde cero. Esta es una gran carga.

El contenido de AWT:

Object

CheckboxGroup

*Component

Button

Canvas

CheckBox

Choice

Container

Panel

Applet

ScrollPane

Window

Dialog

Frame

Label

List

TextComponent

TextArea

TextField

MenuComponent

MenuItem

CheckboxMenuItem

Menu

PopupMenu

*LayoutManager

FlowLayout

GridLayout

*LayoutManager2

BorderLayout

CardLayout

GridBagLayout

EventObject

AWTEvent

ActionEvent

AdjustmentEvent

ComponentEvent

ContainerEvent

FocusEvent

InputEvent

KeyEvent

MouseEvent

MouseWheelEvent

PaintEvent

WindowEvent

HierarchyEvent

InputMethodEvent

InvocationEvent

ItemEvent

TextEvent

AWT proporciona un rico entorno gráfico, en especial en Java V1.2 y más allá. A través del objeto Graphics2D, Java3D y Java2D y servicios, muchas aplicaciones gráficas de gran alcance, tales como el dibujo y la cartografía y paquetes, junto con JavaSound, competitiva juegos interactivos, se pueden crear.

SWING

Swing de Java, también conocido como parte de la Java Foundation Classes (JFC), fue un intento de resolver la mayor parte de las deficiencias de AWT. En Swing, Sun creó un muy bien diseñado, flexible y potente conjunto de herramientas GUI. Desafortunadamente, esto significa que Swing necesita tiempo para aprender, y es a veces demasiado complejo para situaciones comunes.

Swing está construido sobre las partes de AWT. Todas las partes de Swing son también parte de AWT. Swing utiliza el modelo AWT de evento y clases de apoyo, tales como colores, imágenes y gráficos. Los componentes Swing, los administradores de diseño, y los acontecimientos se resumen a continuación. Como puede ver, estos conjuntos son mucho más amplios que no sean las proporcionadas por el AWT y compara bien con el conjunto SWT.

Object

*Component

Container

*JComponent

*AbstractButton

JButton

JMenuItem

JCheckBonMenuItem

JMenu

JRadioButonMenuItem

*JToggleButton

JCheckBox

JRadioButton

Box

Filler

JColorChooser

JComboBox

JDesktopIcon

JFileChooser

JInternalFrame

JLabel

JLayeredPane

JDesktopPane

JList

JMenuBar

JOptionPane

JPanel

JPopupMenu

JProgressBar

JRootPane

JScrollBar

JScrollPane

JSeparator

JSlider

JSplitPane

JTabbedPane

JTable

JTableHeader

*JTextComponent

JEditorPane

FrameEditorPane

JTextPane

JTextArea

JtextField

JPasswordField

JToolBar

JToolTip

JTree

JViewport

ScrollableTabViewport

Panel

Applet

JApplet

Window

Dialog

JDialog

Frame

JFrame

JWindow

*LayoutManager

CenterLayout

*LayoutManager2

BoxLayout

OverlayLayout

SpringLayout
EventObject

AWTEvent

AncestorEvent

ComponentEvent

InputEvent

KeyEvent

MenuKeyEvent

MouseEvent

MenuDragMouseEvent

InternalFrameEvent

Más allá de los muchos componentes, el diseño pesebres(mangers), y eventos, Swing tiene muchas características que lo hacen más potente que AWT. Algunos de los más importantes son:

Modelo de separación de la vista y el controlador
Para todos los componentes con los modelos (como botones, listas, tablas, árboles, texto enriquecido), el modelo es independiente de los componentes. Esto permite que el modelo pueda ser adaptado a las necesidades de la solicitud y que sea compartido por múltiples puntos de vista. Modelos por defecto de tipo de componente se proporcionan por comodidad.

Aspecto Programable
La mirada de cada uno de los componentes (apariencia) y Listenings (cómo reacciona a la entrada de eventos) es controlado por una aplicación dinámica reemplazable. Esto permite que el aspecto en su totalidad o en parte de una GUI basada en Swing pueda cambiar.

Renderizadores y editores
La mayoría de los elementos que muestran el modelo de contenido, tales como listas, tablas, y los árboles, pueden procesar elementos de modelado de casi cualquier tipo. Esto se hace mediante la cartografía de un render o editor para cada componente y tipo de modelo tipo. Por ejemplo, una tabla con una columna que contiene valores java.util.Date puede tener un código especial para presentar el valor de fecha de edición y la fecha valor. Cada columna puede tener diferentes tipos.



Accesibilidad
La creación de una interfaz gráfica que es accesible a las personas con discapacidad es importante. Swing ofrece una amplia infraestructura y API para permitir la accesibilidad de los GUIs. Este apoyo es independiente pero se integra con el administrador de accesibilidad, si lo hubiere.

Como AWT, Swing apoya la eliminación automática de los componentes GUI. Swing también apoya los métodos de construcciones de AWT de abajo hacia arriba y de arriba hacia abajo.

A diferencia de AWT, los componentes Swing no son hilo de seguridad, lo que significa que tienes que estar al tanto de que hilo actualiza la GUI de tu aplicación. Si incurrió en un error usando el hilo, un comportamiento impredecible, incluyendo problemas de interfaz de usuario, no se sorprenda, ya que pueden ocurrir. Existen rutinas de utilidad para ayudar a manejar cuestiones de roscado.

Como AWT, Swing, una de las ventajas es que viene con la tecnología Java. Esto significa que usted no necesita instalarlo. Lamentablemente, Swing ha evolucionado mucho, así que es fácil llegar a depender de las características previstas en las versiones más recientes del lenguaje Java, que pueden forzar a los usuarios a actualizar sus runtimes de Java.

SWT

SWT es un juego de herramientas de bajo nivel GUI comparables en concepto con los de AWT. JFace es un conjunto de componentes y mejoras de los servicios públicos para que la construcción de GUIs con SWT sea más fácil. Los constructores de SWT aprendieron de la implementación de AWT y Swing, y trataron de construir un sistema que tuviera las ventajas de ambos sin sus desventajas. En muchos sentidos, tuvieron éxito.

SWT se parece mucho a AWT en la medida en que se basa en una aplicación de pares. Supera el problema del LCD que tenia el AWT mediante la definición de un conjunto de controles adecuados para que la mayoría de aplicaciones de oficina o herramientas de desarrollo y, tiempo después, en un host-a-host, creando emulaciones (como Swing) para los controles no suministrados por el anfitrión . Para la mayoría de los administradores modernos, casi todos los controles se basan en sus compañeros nativos. Esto significa que una GUI basada en SWT tiene un aspecto, un sentir , y un rendimiento de verdadero administrador. Con esto se evita la más generalizada de las denuncias con AWT y Swing. Algunos administradores tienen la funciones de bajo nivel, por lo que los suministros SWT hereden, con frecuencia emulan, las versiones (a menudo con "C" como la primera letra de su nombre) para permitir el comportamiento esperado.



Object

*Dialog

ColorDialog

DirectoryDialog

FileDialog

FontDialog

MessageDialog

PrintDialog

*Widget

Menu

*Item

CoolItem

!CTabItem

MenuItem

TabItem

TableColumn

TableItem

TableTreeItem

ToolItem

TrayItem

TreeColumn

TreeItem

*Control

Button

Label

ProgressBar

Sash

Scale

Scrollable

Composite

~Browser

Canvas

*~AbstractHyperlink

~Hyperlink

~ImageHyperlink

*~ToggleHyperline

~TreeNode

~Twistie

AnimatedProgress

!CLabel

Decorations

Shell

FormText

StyledText

TableCursor

!CBanner

!CCombo

Combo

CoolBar

!CTabFolder

~ExpandableComposite

~Section

~FilteredList

~FilteredTree

~Form

Group

~PageBook

ProgressIndicator

!SashForm

!ScrolledComposite

TabFolder

Table

TableTree

ToolBar

Tray

Tree

ViewForm

List

Text

Slider

*Layout

FillLayout

FormLayout

GridLayout

RowLayout

!StackLayout
EventObject

SWTEventObject

TypedEvent

AimEvent

!BidiSegmentEvent

ControlEvent

!CTabFlolderEvent

DisposeEvent

DragSourceEvent

DragTargetEvent

!ExtendedModifyEvent

focusEvent

HelpEvent

KeyEvent

TraverseEvent

VerifyEvent

!LineBackgroundEvent

!LineStyleEvent

MenuEvent

ModifyEvent

MouseEvent

PaintEvent

SelectionEvent

TreeEvent

ShellEvent

!TextChangedEvent

!TextChangingEvent








C#
El espacio de nombres System.Drawing proporciona acceso a funcionalidad de gráficos básica de GDI+. Se ofrece una funcionalidad más avanzada en los espacios de nombres System.Drawing.Drawing2D, System.Drawing.Imaging y System.Drawing.Text.
La clase Graphics proporciona métodos para dibujar en el dispositivo de pantalla. Clases como Rectangle y Point encapsulan primitivos de GDI+. La clase Pen se utiliza para dibujar líneas y curvas, mientras que las clases derivadas de la clase abstracta Brush se utilizan para rellenar el interior de las formas.
La clase Graphics proporciona métodos para dibujar objetos en el dispositivo de pantalla. Graphics se asocia a un determinado contexto de dispositivo.
Se puede obtener Graphics llamando al método Control.CreateGraphics en un objeto que herede de System.Windows.Forms.Control, o controlando el evento Control.Paint de un control y obteniendo acceso a la propiedad Graphics de la clase System.Windows.Forms.PaintEventArgs.
Sintaxis
public sealed class Graphics : MarshalByRefObject, IDeviceContext, IDisposable

viernes, 27 de febrero de 2009

Codigo deFiguras Primitivas en Java con Documentacion

mport java.awt.*;
import java.awt.event.*;

// Clase de control del ejemplo
class java1516 extends Frame {

// Función de control de la aplicación
public static void main( String[] args ) {
// Se instancia un objeto de la clase
new java1516();
}

// Contructor de la clase
public java1516() {
this.setTitle( "Tutorial de Java, Gráficos" );
this.setSize( 475,275 );
this.setVisible( true );

// Clase anidada que permite terminar la ejecución de la animación
this.addWindowListener(
// Definición de la clase anónima para controlar el cierre de
// la ventana
new WindowAdapter() {
public void windowClosing( WindowEvent evt ) {
// Se concluye el programa
System.exit( 0 );
}
} );
}

// Se sobrecarga el método paint()
public void paint( Graphics g ){
g.setColor( Color.red );

// Trasladamos el origen de coordenadas que se sitúa en la
// esquina superior izquierda, para evitar el problema que se
// produce con insets. De este modo el origen de coordenadas sí
// que lo dejamos situado en la zona cliente del objeto Frame
// que es la que se utiliza para pintas
g.translate( this.getInsets().left,this.getInsets().top );

// Línea simple
g.drawLine( 10,0,50,50 );
g.setColor( Color.black );
g.drawString( "drawLine",10,62 );
g.setColor( Color.red );

// Se crean dos arrays de coordenadas para pintar una
// polilínea
int x1Datos[] = {80,130,80,130};
int y1Datos[] = {0,50,50,0};
g.drawPolyline( x1Datos,y1Datos,4 );
g.setColor( Color.black );
g.drawString( "drawPolyline",70,62 );
g.setColor( Color.red );

// Rectángulo
g.drawRect( 150,0,50,50 );
g.setColor( Color.black );
g.drawString( "drawRect",150,62 );
g.setColor( Color.red );

// Rectángulo relleno
g.fillRect( 220,0,50,50 );
g.setColor( Color.black );
g.drawString( "fillRect",225,62 );
g.setColor( Color.red );

// Rectángulo redondeado
g.drawRoundRect( 300,0,50,50,10,10 );
g.setColor( Color.black );
g.drawString( "drawRoundRect",280,62 );
g.setColor( Color.red );

// Rectángulo redondeado relleno
g.fillRoundRect( 385,0,50,50,10,10 );
g.setColor( Color.black );
g.drawString( "fillRoundRect",375,62 );

// Pinta un rectángulo 3D, sobresaliendo de la pantalla
// No parece demasiado 3D
g.setColor( Color.gray );//draw the 3D stuff in gray
g.draw3DRect( 10,90,55,25,true );
// Rectángulo 3D, pulsado
g.draw3DRect( 70,90,50,25,false );
g.setColor( Color.black );
g.drawString( "draw3DRect",30,140 );

// Rectángulo 3D relleno. Se ha puesto un fondo gris
// con lo cual se puede apreciar mucho mejor el efecto
// de tres dimensiones
// Fondo gris
g.setColor( Color.gray );
g.fillRect( 145,75,130,55 );
g.fill3DRect( 155,90,50,25,true );
// Rectángulo 3D relleno, pulsado
g.fill3DRect( 215,90,50,25,false );
g.setColor( Color.red );
// De todos modos, la apariencia de tres dimensiones
// con 3DRect no es demasiado buena, porque es necesario
// seleccionar muy bien la paleta de colores para que
// se genere la ilusión de 3D
g.setColor( Color.black );
g.drawString( "fill3DRect",180,140 );
g.setColor( Color.red );

// Pinta un ángulo de 255 grados inscrito en un rectángulo
g.drawRect( 300,77,50,50 );
g.drawArc( 300,77,50,50,0,225 );
g.setColor( Color.black );
g.drawString( "drawArc",305,140 );
g.setColor( Color.red );

// Angulo relleno de 255 grados inscrito en un rectángulo
g.drawRect( 385,77,50,50 );
g.fillArc( 385,77,50,50,0,225 );
g.setColor( Color.black );
g.drawString( "fillArc",395,140 );
g.setColor( Color.red );

// Elipse, con el eje grande horizontal
g.drawOval( 10,165,50,25 );
// Círculo
g.drawOval( 70,150,50,50 );
g.setColor( Color.black );
g.drawString( "drawOval",35,218 );
g.setColor( Color.red );

// Elipse rellena, con el eje grande vertical
g.fillOval( 170,150,25,50 );
// Círculo relleno
g.fillOval( 210,150,50,50 );
g.setColor( Color.black );
g.drawString( "fillOval",185,218 );
g.setColor( Color.red );

// Polígono
int x2Datos[] = {300,350,300,350};
int y2Datos[] = {150,200,200,150};
g.drawPolygon( x2Datos,y2Datos,4 );
g.setColor( Color.black );
g.drawString( "drawPolygon",290,218 );
g.setColor( Color.red );

// Polígono relleno
int x3Datos[] = {385,435,385,435};
int y3Datos[] = {150,200,200,150};
g.fillPolygon( x3Datos,y3Datos,4 );
g.setColor( Color.black );
g.drawString( "fillPolygon",385,218 );
}
}

domingo, 15 de febrero de 2009

Metodos de sincronizacion

SEMÁFOROS

Se usan en exclusión mutua y sincronización.
¿Qué aportan?
• Simplicidad en protocolos de sincronización
• No son necesarios bucles de espera
Un semáforo es una variable entera no negativa que puede
actualizarse sólo con dos procedimientos: P y V, o wait y signal.
Wait(S) Si S>0 se decrementa S en 1
Si S<=0 se bloquea hasta que S>0, y al desbloquearse se
decrementa en 1.
Signal(S) ++S
¡Son indivisibles!

Mutex

Cuando dos o más subprocesos tienen que obtener acceso a un recurso compartido al mismo tiempo, el sistema necesita un mecanismo de sincronización para garantizar que sólo uno de los subprocesos utilice el recurso en ese momento. Mutex es un primitivo de sincronización que otorga acceso exclusivo al recurso compartido a un solo subproceso. Cuando un subproceso adquiere una exclusión mutua (mutex), el siguiente subproceso que intenta adquirir dicha exclusión mutua se suspende hasta que el primer subproceso libera la exclusión mutua.

Barrera(Barriers)

Enunciado. Un proceso crea N hilos. El comportamiento de cada uno consiste en la ejecución de un bucle con tres partes:

A

BARRERA

B

En cada iteración del bucle los hilos ejecutarán A sin realizar ninguna sincronización; a continuación todos ellos esperan a que el resto llegue a la BARRERA. Una vez que todos han llegado a la barrera (todos han ejecutado A), continúan ejecutando B y el bucle se repite.

Salidas. Cada hilo deberá informar del número de iteración junto con el punto del bucle que acaba de ejecutar.

Finalización. Ejecutar la iteración un cierto número de veces

Esquema del problema

Muchos problemas de cálculo se pueden resolver de acuerdo al siguiente esquema:

Ejemplos:

–procesamiento de imágenes

–funciones definidas sobre mallas de puntos

–resolución de sistemas de ecuaciones

–problemas de optimización, etc.

La ejecución de “esperar al resto de procesos” es una sincronización, este tipo se denomina “sincronización por barrera”.

http://it.aut.uah.es/danihc/DHC_files/menus_data/SCTR/Sinc_Com_Variables.pdf
http://msdn.microsoft.com/es-es/library/system.threading.mutex(VS.80).aspx
http://www.mitecnologico.com/Main/BarrerasBarrier

Planificacion de Procesos

Planificación de Plazo Fijo



En la planificación de plazo fijo se programan ciertos trabajos para terminarse en un tiempo específico o plazo fijo. Estas tareas pueden tener un gran valor si se entregan a tiempo, y carecer de él si se entregan después del plazo. Esta planificación es compleja por varios motivos:

El usuario debe informar por adelantado de las necesidades precisas de recursos del proceso. Semejante información rara vez está disponible.

-El sistema debe ejecutar el proceso en un plazo fijo sin degradar demasiado el servicio a los otros usuarios y debe planificar cuidadosamente sus necesidades de recursos dentro del plazo. Esto puede ser difícil por la llegada de nuevos procesos que impongan demandas imprevistas al sistema.

-Si hay muchas tareas a plazo fijo activas al mismo tiempo, la planificación puede ser tan compleja que se necesiten métodos de optimización avanzados para cumplir los plazos.

-La administración intensiva de recursos requerida por la planificación de plazo fijo puede producir un gasto extra substancial.

Planificación Primero en Entrar-Primero en Salir (FIFO, First In First Out)



Cuando se tiene que elegir a qué proceso asignar la CPU se escoge al que llevara más tiempo listo. El proceso se mantiene en la CPU hasta que se bloquea voluntariamente.

La ventaja de este algoritmo es su fácil implementación, sin embargo, no es válido para entornos interactivos ya que un proceso de mucho cálculo de CPU hace aumentar el tiempo de espera de los demás procesos . Para implementar el algoritmo sólo se necesita mantener una cola con los procesos listos ordenada por tiempo de llegada. Cuando un proceso pasa de bloqueado a listo se sitúa el último de la cola.

Planficación por Turno Rotatorio (Round Robin).


Este es uno de los algoritmos más antiguos, sencillos y equitativos en el reparto de la CPU entre los procesos, muy válido para entornos de tiempo compartido. Cada proceso tiene asignado un intervalo de tiempo de ejecución, llamado cuantum o cuanto. Si el proceso agota su cuantum de tiempo, se elige a otro proceso para ocupar la CPU. Si el proceso se bloquea o termina antes de agotar su cuantum también se alterna el uso de la CPU. El round robin es muy fácil de implementar. Todo lo que necesita el planificador es mantener una lista de los procesos listos.

Planificación por Prioridad al más corto (SJF, Short Job First).



Al igual que en el algoritmo FIFO las ráfagas se ejecutan sin interrupción, por tanto, sólo es útil para entornos batch. Su característica es que cuando se activa el planificador, éste elige la ráfaga de menor duración. Es decir, introduce una noción de prioridad entre ráfagas. Hay que recordar que en los entornos batch se pueden hacer estimaciones del tiempo de ejecución de los procesos.

La ventaja que presenta este algoritmo sobre el algoritmo FIFO es que minimiza el tiempo de finalización promedio

Planificación por Prioridad al Tiempo Restante más Corto (SRTF, Short Remaining Time First).

Es similar al anterior, con la diferencia de que si un nuevo proceso pasa a listo se activa el dispatcher para ver si es más corto que lo que queda por ejecutar del proceso en ejecución. Si es así el proceso en ejecución pasa a listo y su tiempo de estimación se decrementa con el tiempo que ha estado ejecutándose.

Planificación a la Tasa de Respuesta más Alta



Brinch Hansen desarrolló la estrategia de prioridad a la tasa de respueta más alta (HRN, highest-response-ratio-next) que corrige algunas deficiencias de SJF, particularmente el retraso excesivo de trabajos largos y el favoritismo excesivo para los trabajos cortos. HRN es un disciplina de planificación no apropiativa en la cual la prioridad de cada proceso no sólo se calcula en función del tiempo de servicio, sino también del tiempo que ha esperado para ser atendido. Cuando un trabajo obtiene el procesador, se ejecuta hasta terminar.

Planificación por el Comportamiento


Con este tipo de planificación se pretende garantizar al usuario cierta prestación del sistema y tratar de cumplirla. Si en un sistema tenemos 'n' usuarios lo normal será garantizar a cada uno de ellos al menos 1/n de la potencia del procesador. Para ello necesitamos del tiempo consumido por el procesador y el tiempo que lleva el proceso en el sistema. La cantidad de procesador que tiene derecho a consumir el proceso será el cociente entre el tiempo que lleva en el sistema entre el número de procesos que hay en el sistema. A esa cantidad se le puede asociar una prioridad que vendrá dada como el cociente entre tiempo de procesador que ha consumido y el tiempo que se le prometió (el tiempo que tiene derecho a consumir). De tal modo que si esa proporción es de 0'5 significa que tan sólo ha consumido la mitad del tiempo prometido pero si es de 2 quiere decir que ha consumido más de lo debido, justamente el doble.

http://wwwdi.ujaen.es/~lina/TemasSO/PLANIFICACIONDEPROCESOS/6AlgoritmosdePlanificacionI.htm

jueves, 12 de febrero de 2009

Operadores de bits

~ Complemento a uno
<< Desplazamiento a izquierda
>> Desplazamiento a derecha
& AND; compara dos bits
^ XOR (OR exclusivo); compara dos bits
| OR inclusivo; compara dos bits
El primero es un operador unario, los restantes son binarios. Los tres primeros realizan manipulaciones en los bits del operando. Los restantes realizan comparaciones lógicas entre los bits de ambos operandos, similares a las que realizan los operadores lógicos entre objetos booleanos.
~ Complemento a uno
Este operador unitario invierte cada bit del operando; 0 es convertido en 1 y viceversa.
Ejemplo
int s1 = ~2;
La representación binaria de los los complementos a uno de los decimales 0, 1 y 2 son los que se expresan (para simplificar los representamos como un octeto):
0 == 0000 0000 ~ 0 == 1111 1111
1 == 0000 0001 ~ 1 == 1111 1110
2 == 0000 0010 ~ 2 == 1111 1101
<< Desplazamiento a izquierda
Este operador binario realiza un desplazamiento de bits a la izquierda. El bit más significativo (más a la izquierda) se pierde, y se le asigna un 0 al menos significativo (el de la derecha). El operando derecho indica el número de desplazamientos que se realizarán.
Sintaxis
expr-desplazada << expr-desplazamiento
El patrón de bits de expr-desplazada sufre un desplazamiento izquierda del valor indicado por la expr-desplazamiento. Ambos operandos deben ser números enteros o enumeraciones
Ejemplo
long x = 10;
int y = 2;
long z = x << y;
El resultado del desplazamiento de 2 bits sobre el unsigned long x es asignado al unsigned long y sin que sea necesario ningún "casting" para el tipo resultante.
Según las premisas anteriores, los desplazamientos izquierda de valor unitario aplicados sobre los números 0, 1, 2 y -3, producen los siguientes resultados:
0 == 0000 0000 0 << 1 == 0000 0000 == 0
1 == 0000 0001 1 << 1 == 0000 0010 == 2
2 == 0000 0010 2 << 1 == 0000 0100 == 4
-3 == 1111 1101 -3 << 1 == 1111 1010 == - 6
>> Desplazamiento a derecha
Sintaxis
expr-desplazada >> expr-desplazamiento
Ejemplo:
long x = 10;
long z = x >> 2;
El patrón de bits de expr-desplazada sufre un desplazamiento derecho del valor indicado por la expr-desplazamiento. El bit menos significativo (a la derecha) se pierde, pero hay que advertir que si expr-desplazada es un entero con signo y es negativo, el resultado depende de la implementación.
Por lo demás, el comportamiento de este operador es análogo al anterior (desplazamiento izquierda). Por ejemplo:
0 == 0000 0000 0 >> 1 == 0000 0000 == 0
2 == 0000 0010 2 >> 1 == 0000 0001 == 1
-2 == 1111 1110 -2 >> 1 == 1111 1111 == -1 (C++Builder & GNU-C++)
-16 == 1111 0000 -16 >> 2 == 1111 1100 == -4 (C++Builder & GNU-C++)
& AND lógico
Este operador binario compara ambos operandos bit a bit, y como resultado devuelve un valor construido de tal forma que cada bits es 1 si los bits correspondientes de los operandos están a 1. En caso contrario devuelve 0 (ver ejemplo).
Sintaxis
AND-expresion & equality-expresion
Ejemplo:
int x = 10, y = 20;
int z = x & y;
En este caso el resultado del AND lógico entre los enteros 10 y 20 se aplicaría al entero z.
Según las reglas del enunciado, el operador & aplicado entre los valores 2 y -2 resultaría:
2 == 0000 0010
-2 == 1111 1110
------------------
0000 0010 == 2
^ XOR OR exclusivo
El funcionamiento de este operador binario es parecido al AND lógico , salvo que en este caso el resultado es 1 si ambos bits son complementarios (uno es 0 y el otro 1). En caso contrario devuelve 0.
expr-OR-exclusiva ^ AND-expresion
Ejemplo:
int x = 10, y = 20;
int z = x ^ y;
Según el enunciado, el operador ^ aplicado entre los valores 7 y -2 resultaría:
7 == 0000 0111
-2 == 1111 1110
------------------
1111 1001 == -7
| OR inclusivo
Este operador binario tiene un funcionamiento parecido a los anteriores (AND y XOR), salvo que en este caso el resultado es 1 si alguno de ellos está a 1. En caso contrario devuelve 0 (ver ejemplo).
Sintaxis
expr-OR-inclusiva | expr-OR-exclusiva
Ejemplo:
int x = 10, y = 20;
int z = x | y;
Según el enunciado, el operador | aplicado entre los valores 6 y 13 resultaría:
6 == 0000 0110
13 == 0000 1101
------------------
0000 1111 == 15

Campos de Bits

Los campos de bits, o simplemente campos, son grupos de un número determinado de bits, que pueden o no tener un identificador asociado. Representan un artificio que permite utilizar miembros de tamaño arbitrario en estructuras, uniones y clases; independiente de la posibilidad que proporcionan los tipos básicos cuyo tamaño está predeterminado por el lenguaje. Por ejemplo, en ocasiones es necesario almacenar semáforos (flags) con determinados estados del programa, para los que en realidad solo hace falta un bit, pero incluso una variable bool ocupa un octeto. Los campos de bits permiten utilizar cada bit de un octeto independientemente, aumentando así su capacidad de representación.

Nota: esta técnica, de manejo independiente de bits en una palabra, ha sido ampliamente utilizada desde siempre en la programación, no solo de C/C++; casi todos los lenguajes ofrecen la posibilidad de operadores "bitwise", que permiten esto de forma más o menos artesanal.