martes, agosto 21, 2007

Un día de ego subido :-DDD

Hoy como hago periódicamente, reviso si alguien ha enlazado mis fotos de flickr, y me he llevado la sorpresa que 2 personas al hacer referencia a las fiestas de San Lorenzo en sus blogs, han utilizado fotos mías, además creo que bastante bien usadas, ya que han puesto la fuente de las mismas.

Con lo cual yo contento, porqué alguien piensa que mis fotos pueden representar mis fiestas y porqué se demuestra que normalmente la gente intenta ser agradable y cumplir las normas.

Gracias a Caelio (seguro que su mujer le ha recordado la fecha, ya que por lo que cuenta en su blog es oscense o "fatica") y a Eolas (me enlazan en francés) por acodarse de mi pueblo.

Ya puestos, fotico al canto de este año. También de la ofrenda de flores y frutos al santo, El gaitero de Castejón de Monegros con la gaita aragonesa, también llamada de boto.

Salududus

Gaita de Boto

lunes, agosto 06, 2007

Viaje a Soria e iluminación

En el verano, no me apetece nada programar, con lo cual se está convirtiendo esto en un fotoblog.

Aunque tengo que reconocer que estoy contento porqué al ir apuntando las cosas aquí, cuando retome el tema mas adelante, podré continuar, simplemente releyendome las entradas del blog. Fenomenal ¿no?

Estuve de boda en Soria y aproveché en hacer algo de turismo, hay muchas cosas bonitas, pero no me salieron grandes fotos, me imagino que además de la torpeza del fotógrafo, la luz del mediodía tan dura me hizo las fotos "sosas", sin embargo pasando alguna foto a sepia creo que me ha gustado.

¿Me debo estar volviendo un pijo de la luz?

Río Duero


La lectura del blog strobistenespañol me debe estar afectando. Un día me fuí al puente de piedra para hacer fotos al atardecer, aun sin quitar el flash de la zapata ni cosas de esas que hacen en el grupo me quedó algo bastante curioso que a mi me gustó.

Detalles al anochecer II


Otro campo más que aprender. De momento el jueves empiezan las fiestas de San Lorenzo, a ver si nos vemos por Huesca

martes, julio 17, 2007

Muchos días sin pasarme por aqui

Tengo abandonadas todas mis actividades de programación, al fin y al cabo esto es una "diversión", en las que muchas veces cuando sabes como puedes hacer las cosas, estas pierden su interés.

Lo que si que he hecho en mis minivacaciones son fotos, bastantes fotos, y me he quedado bastante impresionado como funcionan los polarizadores circulares, no esperaba tanto cambio, pero estoy muy contento de haberme comprado uno, y me imagino que me va a acompañar mucho tiempo.

Os pongo una muestra de la estación de esqui de Cerler. He tratado un poco por zonas el cielo oscureciendolo y el resto dándole mas luminosidad. pero el resultado de partida ya me gustaba mucho.

Un saludo

La estación de esqui en verano

sábado, junio 23, 2007

Técnicas de enfoque

Muchos días sin pasarme por aqui, he estado enfermo y aunque este fin de semana ya estoy mejor, me apetece mas ir a hacer fotos que programar, además estoy esperando que me llegue un objetivo nuevo.... ¡¡¡ Que ganas!!!

Una vez disculpado, una anotación de un artículo muy majo que he leido sobre distintas técnicas para mejorar el enfoque en photoshop. Es un artículo antiguo de quesabesde.

Lo dejo anotado porqué lo recuperaré y experimentaré un poco.

http://www.quesabesde.com/camdig/articulos.asp?articulo=120

Salududus

sábado, junio 16, 2007

Otra foto

Bueno, esta semana no me ha apetecido programar mucho, pero hoy he estado probando herramientas open source para tratar raws y generar un hdr, la aplicaciones en cuestión son
  • ufraw
  • qtpfsgui

y este es el resultado

Sala capitular Monasterio Veruela

Tengo que mejorar, el que me ha quedado un poco de ruido en las zonas oscuras, me imagino que seré yo y no las herramientas.

Si alguien sabe como.... ahí teneis los comentarios

miércoles, junio 13, 2007

Mas opciones

Mirando como extraer los datos de los ficheros CR2, me he encontrado con dos herramientas que me pueden ir mucho mejor para todo lo que estoy haciendo.

Para extraer los thumbnails de los ficheros CR2 el dcram, algo tan sencillo como:

dcraw -e img_1222.cr2

Nos extrae el thumbnail adecuado. En cuanto al Tiff y el jpeg, lo podemos transformar a traves de la librería Pil.

Una cosa que me ha hecho plantearme también la forma de sacar la información es el script en perl exiftool. Me parece bastante mas completa la información que el exifprobe. con lo que estoy dudando en cambiarme.

Una cosa que me planteo, es que si toda la información de la foto, está en ella misma, no voy a sacar casi ningún dato de la misma, cuando quiera extraré los datos de la misma on-line, me imagino que la cargaré poco a poco.

Me gustaría abstraer el tipo de fichero independiente de que sea Tiff, CR2 o Jpeg, con lo que me tendré que mirar el polimorfismo en python.

De momento crearé una clase para el manejo de ficheros fotograficos, solo con la extracción de los de los thumbnails y que llame a un método u otro cuando dependiendo del tipo de foto.

Extraer los thumbnails

He tomado alguna nota sobre las marcas del fichero exif, para la extracción de los diferentes thumbnails, parece ser que las marcas necesarias son StripOffsets con la posición donde empieza el jpeg y StripByteCounts con la longitud del mismo.

Me llama la atención que en los CR2 parece que hay hasta 4 jpegs incluidos en la foto.

En cuanto a los ficheros Tiff, parece ser que los abre directamente la librería gráfica PIL, pero tengo que asegurar que se puede cuando las profundidades de color son 16 bits por canal y además hay capas guardadas.

Son mis lineas de investigación ahora...

martes, junio 12, 2007

Buenas nuevas y próximos pasos

Hola,

No he programado mucho este fin de semana, solo lo suficiente para ya tener importadas un número de fotos con exif, y los ficheros quedan en distintos directorios, por año/mes/día.

El próximo paso está claro, la creación de los thumbnails, para los jpeg, es muy sencillo, solo hace falta utilizar la librería de manejo de imágenes de python PIL (python imaging library) en cuanto a los ficheros Tiff y a los CR2 de canon tengo que extraer los jpeg embebidos. No creo que sea muy complicado porque la utilidad exifprobe te dice tanto la longitud como la posición de inicio el jpeg incustrado. Ya os contaré.

La verdad que tengo muchas ganas de continuar, ya que luego ya empiezo con la programación de las vistas, hoy he estado pensando como hacerlo, he pensado que una buena forma, sería tipo calendario en la que pudieramos tener una vista en tipo año, en la que se pudiera seleccionar el mes, con miniaturas pequeñas, 4 o 5 por fila y luego una vista mes, en la que selecionaramos el día en la que pondríamos solo uno por fila, con comentarios al lado.

He mirado las opciones de ir cargando las fotos poco a poco a través de AJAX utilizando seguramente el serializador de JSON de django.

Además estoy mirando el tema de los test de regresión....

Muchas cosas y tan poco tiempo, ya os cuento

viernes, junio 08, 2007

Script interesante

Hoy no he hecho nada, pero he leido una cosa que creo que puede ser interesante.

Uno de los problemas que tengo al utilizar django, es como depurar cosas sin necesidad de utilizar el web, como llamar a las clases que utiliza para los modelos, sin tener que preparar ninguna vista, además de poder utilizar el depurador del eclipse, con ejecución paso a paso y todas esas cosas.

Pues puede que en este artículo: script for run a django task tenga parte de la solución. Como importar el entorno de django en un programa normal de python y así poder depurar mejor las clases que vas a utilizar en tu web.

Como tengo que investigarlo lo apunto aqui para que no se me olvide.

Saludos

jueves, junio 07, 2007

La interfaz admin de django

Una de las cosas por las que me encanta django, es por el interfaz que te crea automaticamente si quieres visualizar a través de web tu base de datos. Solo hace falta añadir una subclase Admin a las clases heredadas de los modelos.
Por ejemplo en mi caso:

class Photo(models.Model):
date_time_original = models.DateTimeField()
make = models.CharField(maxlength=50)
model = models.CharField(maxlength=50)
exposure_time = models.CharField(maxlength=50, null=True)
iso = models.CharField(maxlength=50, null=True)
f_number = models.CharField(maxlength=50, null=True)

class Admin:
pass

Esto ya me crea la infraestructura necesaria para visualizar, añadir y borrar registros en la base de datos a través de un interfaz web.

Pero hoy me he encontrado un problema, o simplemente viene de no haberme leido toda la documentación o de estar usando la versión de desarrollo.

No es es capaz de visualizarme en el interfaz de administración los campos de tipo FileField o CharField
este campo consigue darme error en el interfaz de administración
file = models.CharField(maxlength=100, null=True)

Continuaré investigando a ver como se soluciona el tema, pero claro, eso será otro rato libre que tenga.

Nota: También me voy a tener que mirar el blogger para que me respete las tabulaciones a la hora de mostrar trozos de código ya que en python es imprescindible

Actualización (8/06 20:00): Como era lógico el problema era mío, no de django, en el momento que empiece a ver las limitaciones del interfaz, será que ya se bastante, hasta entonces me imagino que continuaré pegandomela.

El problema en cuestión es que no se en que circustancias, no se me había actualizado la base de datos aunque había hecho un manage.py flush y syncdb.

Cuando he revisado la estructura de las tablas de la base de datos, he visto que no se me habían actualizado los cambios.

De momento, solución radical, después de cambiar la base de datos, la borro (es un fichero porqué he empezado en sqlite) y la vuelvo a crear.

Ahora funciona bien y ya tengo las 2 tablas casi rellenas, a falta de los tamaños de las fotos, y sacar los thumbnails del los ficheros CR2, solo me queda para una primera importación el mover los ficheros que puedo importar automáticamente a sus lugares de destino.

miércoles, junio 06, 2007

Fotos del Pantano

Como me he pasado los ratos libres desde el domingo hasta hoy editando fotos, pues que mejor que poner una de las que hice en el pantano a los windsurfistas el sábado.

Windsurf en la sotonera (I)

Hoy si puedo continuaré con la aplicación.

Un saludo

lunes, junio 04, 2007

Notas para la manipulación de la base de datos

He estado investigando las posibilidades que me ofrece el API de django a la hora de insertar nuevas fotos en la base de datos.
Me va a ser util el get_or_create() en el cual intentas traerte un registro de la base de datos y sino lo crea.
Interesante también el select_related() que te selecciona además de la tabla en cuestión, las tablas relacionadas mediante foreing_key.

Por otro lado he estado investigando, como mover los ficheros en python, en este caso el módulo necesario es shutil, que implementa todas las funciones necesarias cp, mv....

Un fleco que me queda es comprobar la existencia del directorio, antes de mover y sino, crearlo.

Ahora toca: introducir este código y luego mirar la extracción de los thumnails en los ficheros CR2, así como las dimensiones en los ficheros JPEG

Stay tuned....

sábado, junio 02, 2007

Mas lento de lo previsto

La herramienta de importación me está llevando mas de lo previsto, eso que no he estoy teniendo en cuenta mas que me vaya para mis 2 cámaras fotográficas. Me estoy encontrando que las etiquetas exif que utiliza cuando es un fichero CR2 o TIFF son diferentes que los jpegs. Cosas como las dimensiones de las fotos no se marcan igual, me imagino que en JPEG podrás sacarlas directamente, aunque aún no sé como.

Otra etiqueta que me ha sorprendido el que estuviera distinta en la IXUS 500 y en el EOS 350D, es el iso utilizado en la foto.

Por otro lado estoy contento, porque ya importo correctamente todos los formatos en la base de datos en la tabla PHOTOS, ahora me quedaría la tabla VERSIONS.

También tengo ya en cuenta el que tengan los ficheros CR2 el fichero xmp asociado.

Empiezo a ver cercano el tener mis 5000 fotos totalmente organizadas como yo quiero y con buenos backups.

Luego empezaré con las fotos que están sin datos exif, con una importación manual así como el interfaz web para la visualización y la edición remota.

En fin continuamos currando. De momento esta tarde me voy a hacer fotos al pantano que están mis amigos los surferos, a ver que tal.

jueves, mayo 31, 2007

Progresos, progresos, progresos

Cuando te pones a programar una aplicacioncilla como la que tengo en mente, llega un momento que después de pensarlo, hay que ponerse a ello y tirar lineas de código, además, como te falta todo no sabes por donde empezar.

Yo he decidido lo siguiente:
  1. importar directamente desde el mismo ordenador (de momento sin que sea a través de la web) todos los ficheros fotográficos.
  2. Archivar los ficheros en la estructura descrita anteriormente.
  3. Crear los thumnails asociados.
  4. Visualizar vía web, los ficheros fotográficos.
  5. Manejar distintas revisiones por ficheros.
  6. Visualizar distintas revisiones de un fichero.
  7. Introducir manualmente ficheros.
  8. .....
De momento casi tengo el primer punto, espero a final de semana tener hassta el punto 4 por lo menos. Ya veremos

De momento pongo la última foto que subí a flickr. en la que utilicé unos tubos de expansión que me dejaron.

Agua de Rosas

sábado, mayo 26, 2007

Organización física

Con todo lo expuesto, solo me queda ya un punto para empezar a codificar las primeras lineas de código, que es la organización física de todos los ficheros.

Las principal característica en la que pienso: Tiene que estar agrupado de tal forma que sea fácil hacer backup, para poder disponer de distintas copias.

Personalmente me gusta la organización DirectorioAño/DirectorioMes/DirectorioDía para los negativos, lo que no tengo muy claro que hacer con las versiones, si ponerlas en el mismo directorio que los negativos y renombrar si es necesario, crear un directorio por foto tratada o replicar la estructura para las fotos procesadas como tengo ahora.

Segun voy escribiendo, la opción que me parece mejor es la primera, aunque renombrando el fichero, poniendo un prefijo, con el idFoto y el número que ocupa en la tabla de versiones, teniendo en cuenta que todos los negativos van ha empezar por IMG o _IMG, me permitiría que estando en la misma localización estuvieran separados.

Sigo pensando mientras escribo..... Mejor todas las fotos poner el prefijo adecuado, ya que todas las fotos van a estar en la tabla de versiones el prefijo sería de forma P15V1_IMG_1050.CR2.

Decidido, voy a empezar así, el prefijo para todas las fotos y luego los thumnails simplemente P15V1.jpg.

Ahora, a empezar, que ya tengo tajo :-P

Organización de las tablas

Con la información expuesta en la entrada anterior, creo que existirán dos tablas principales, fotos y versiones.

La tabla de fotos tendría la información descrita en la entrada anterior, y además tendría la información de la foto, ExposureTime, ISO, FNumber, es decir toda la información común a todas las versiones, por si acaso la primera foto que se introdujera en el sistema no fuera la versión original de la foto, siempre que localicemos una foto que YA está en el sistema, comprobaremos que estos campos son iguales, y en caso que no lo séan informaremos, no séa que me haya dejado alguna forma de identificación de la foto.

La tabla de versiones, tendría, la localización física del fichero y del thumbnail mostrado, tamaño de la foto, formato de la misma así como un link con la tabla de fotos. Trataremos el negativo como la versión original, osea que estará reflejada también en esta tabla, que se ordenará dentro de cada foto, por fecha.

Clasificación de las fotos por el exif

Creo que ya tengo un modelo inicial para identificar una foto, así como sus respectivas versiones.

La intención es hacerlo con las etiquetas más generales posibles, para que esté en todos los formatos y en todos los exif.

Una foto se identificará por las etiquetas Make (Marca de la cámara), Model (Modelo de la cámara) y DateTimeOriginal (fecha de la foto), si en un futuro se crearan distintos usuarios de la aplicación, identificaríamos también el usuario de la aplicación.

Negativos y versiones: Los negativos (fotos tal y como salen de la cámara) con las posibles versiones/rebelados de la misma, tendrán los parámetros anteriores iguales, la forma mas facil de ordenarlos es por la etiqueta DateTime, en el caso del negativo será igual a DateTimeOriginal y en el resto de casos será distinta.

jueves, mayo 24, 2007

Para mejorar programando en Python

Para hacer mi programa, no tengo mas remedio que mejorar mis conocimientos de python, lenguaje que me encanta, pero que de momento solo he utilizado para pequeños scripts en el curro para para tratar textos (ficheros, expresiones regulares y demás). Son muchos años programando en C.

He encontrado una forma bastante adictiva de aprender, el python challenge. Un pasatiempo que te dan pistas para resolver distintos niveles, mediante scripts cortos de python.

Voy por el nivel 4 de 33, aun me queda....

Didáctico y adictivo.

Iremos alternando el resolver niveles con ir haciendo cosas para mi aplicación.

martes, mayo 22, 2007

Comunicación entre procesos

Como ya sabeis, intento llamar desde python a la aplicación exifgrep y recoger los resultados de la misma para rellenar los datos de la foto en la base de datos.

Buscando por la documentación de python he encontrado 2 opciones.

  1. Dentro del módulo os está popen3, que executa y devuelve 3 descriptores de fichero en los cuales tienes los flujos de entrada, salida y error de la aplicación llamada. El único problema que he visto es que no se la forma de saber cuando el proceso hijo ha terminado.
  2. Existe otra forma. el módulo popen2 con la clase Popen3, digamos que tiene una propiedad fromchild que te devuelve los datos de salida del proceso hijo, Popen4 devuelve en este flujo tanto error como salida. La ventaja de esta clase es que tiene el método wait() que espera a que termine el proceso hijo. Desventaja, solo está disponible en unix
De momento me decantaré por la segunda opción en un futuro ya veremos. Desde luego, un día y ya mi aplicación no es multiplataforma :-(

Como siempre, si a alguién se le ocurre algo mejor, encantado de escucharos

domingo, mayo 20, 2007

Día 1: Lectura de los datos exif.

Bueno, empecemos con temas ya de programación del wephonizer.....

El primer problema que voy a intentar abordar es la lectura de los ficheros exif asociados con cada foto. Para ello, por lo que he visto, voy a llamar desde python a la la aplicación exifprobe o a su versión exifgrep.

Para ello es muy interesante la información de las siguientes webs:
Para verificar la unicidad del fichero (en el caso de los negativos) y luego para linkar las distintas versiones me estoy fijando en las siguientes etiquetas:
  • DateTimeOriginal
  • Las que marcan la cámara.
Tendrían que intentar ser etiquetas que definieran la foto y a ser posible lo mas génericas posibles. ¿alguna idea?

El nombre

Bueno, ya he decidido un nombre para mi monstruo.
Web Photo Organizer ¿Original no?.
Bueno he decidido acortarlo un poquito y mezclar todas las palabras:

wephonizer

Se puede decir y si lo buscas en google no tiene ningún resultado, con lo que espero que pronto enlace este blog. además tiene cierta similud fonética con un proyecto que estuve involucrado, sentimental que es uno.

sábado, mayo 19, 2007

Las herramientas

Pues eso, las herramientas a utilizar van a ser las siguientes.

  • El servidor va a ser un ordenador con Unbuntu 7.04
  • Como lenguaje de programación python 2.5
  • Para hacer el servidor web, utilizaré django 0.96 (última estable o igual me atrevo con la de desarrollo).
  • La base de datos, al ser bastante pequeña, me conformaré con sqlite que ya lleva el python 2.5 el soporte "de serie"
  • En cuanto a la lectura de los datos exif de las fotos voy a intentar usar el exifprobe, que parece muy completo y que soporta gran cantidad de cámaras de fotos, instalado además desde la distribución.
  • En el caso de hacer una herramienta cliente, utilizaría el entorno kiwi que va sobre gtk y glade también en python.
  • Igual al python habrá que añadirle la librería PIL para manejo de imágnes, en fin ya lo descubriré mas adelante.
De momento empezaremos con esto, todo de la instalación estandar de ubuntu excepto el django.

La aplicación

Quiero hacer una aplicación que tenga las siguientes características:
  1. Maneje al menos los negativos de mi Canon 350D tanto ficheros CR2 como los xmp creados con photoshop
  2. Maneje los ficheros jpg de mi ixus 500 y mi 350D
  3. Organice en el disco duro todos estos negativos con formato fecha por directorios AAAA\MM\DD (año\mes\día\nombre fichero).
  4. Pueda haber distintas versiones (rebelados) de la misma foto y se puedan ver todas las versiones. Se puede hacer dentro de AAAA\MM\DD\NOMBRE_FICHERO\VERSION1...
  5. Dentro de las versiones, se manejaran también ficheros con formato TIFF
  6. Se incluyan todas las etiquetas y rating que se quieran por foto ¿Se puede reconocer las etiquetas puestas por photoshop o f-spot?
  7. Accesible a través de web (incluir todas las fotos que tengo dispersas por todos los ordenadores)
  8. El interfaz web, debe ser capaz de dejarnos navegar en los distintos directorios, tener thumnails de las fotos y añadir nuevas fotos.
  9. Presentaciones de los distintos directorios de fotos?
  10. Backup automático del directorio de fotos, mas la base de datos.
  11. Posibilidad de que exista una aplicación cliente para facilitar la posibilidad de envíos múltiples.
  12. Posibilidad de múltiples usuarios.
Como veis, son muchas cosas para programar yo solo, la aplicación la describiría como un f-spot con interfaz web, para poder subir fotos desde múltiples ordenadores, además de manejar las versiones de la foto de forma distinta.

Ya veremos a donde llega todo esto.

Nuevos tiempos.....

Cuando abrí esta cuenta, no tenía intención de escribir nada, pero ahora he creido que erá buen momento ya que tengo una inquietud y creo que puede valer para exponer las ideas que me vayan surgiendo, y si alguien quiere aportar sus sugerencias, bienvenidas sean.

En este blog, iré comentando los avances, ideas que vaya teniendo para la construcción de una herramienta opensource, para la organización de fotos a través de la web, (OTRA!!!!!!).

De momento, por no tener no tiene ni nombre, solo unas ideas claras, para que quiero que sirva. Cuando tenga un código medio usable, lo haré disponible desde mi casa en donde será el sitio donde haga las pruebas.

En principio solo tengo claro el fín y un poco las herramientas que voy a usar para hacer el código, si a alguien le interesa, que sigua sintonizado..... a ver hasta donde llego.

También iré poniendo enlaces a alguna de las fotos que tengo publicadas en flickr, os dejo la última que puse.

Avenida Cataluña 1 (II)