miércoles, 15 de octubre de 2014

Adiós Yorick, &, 355

Hace ya bastantes años, escribí algo parecido a esto, movido por la misma sensación que tengo ahora. En aquella ocasión fue un libro, en esta, un cómic, o mejor, su versión mas culta, una novela gráfica.
La sensación es la de haber perdido algo. A mis amigos. Personajes creados en la mente de un escritor, y en este caso ademas, en la mente de una dibujante.
Personajes con los que empece una aventura hace un tiempo, y a los que he acompañado durante toda su vida. Amigos con los que he sufrido, he reído, me he frustrado y he crecido con ellos.
Y es que a medida que avanzas en una historia, sientes un deseo irrefrenable de seguir adelante, de saber como acabara, a la vez que disfrutas del camino que recorres con ellos… pero cuando llegas al final, a la conclusión. Cuando obtienes las respuestas que estabas buscando durante todo ese tiempo que les acompañaste, siempre te invade una sensación de tristeza, de fin.
Una sensación de no volver a verlos nunca mas. De haber vivido algo maravilloso que no volverá a repetirse nunca. Un desamor.
No recuerdo bien, pero alguna vez leí a alguien que decía que si le preguntaban por un deseo, el suyo seria olvidar una película para poder volver a verla por primera vez.
No es un mal deseo.

martes, 3 de diciembre de 2013

Extraer imagen de un RTF cargado en un RichTextBox (Visual Basic .Net)

Hace poco me encontré con este problema y después de mirar diferentes ejemplos y documentación llegue a la siguiente solución.
En documentos RTF las imágenes incrustadas se identifican con un tag “{\pict\”. Solo hay que buscarlo y extraer de dicho tag la cadena hexadecimal que guarda la información de la imagen, transformarla a un array binario y cargarlo en un nuevo objeto imagen con las dimensiones que también hemos extraído del tag.
Espero que a alguien le sea útil. Al final del código os dejo el proyecto ejemplo para descargar.
Imports System.IO
Imports System.Text

Public Class Form1

#Region "Variables y Constantes"

    'twip (TWentIeth of a Point) es un punto, una unidad de medida de pantalla.
    'Segun documentacion microsoft: http://www.microsoft.com/en-us/download/details.aspx?id=10725 
    'En un rtf el ancho y el largo de la imagen se guarda en twips 
    'Un twip equivale aprox. a 26.15 pixels
    Const TWIP As Decimal = 26.450704225352109

#End Region

#Region "Eventos"

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load

        Me.RichTextBox1.LoadFile("c:\documento.rtf")

    End Sub

    Private Sub ButtonExtraer_Click(sender As System.Object, e As System.EventArgs) Handles ButtonExtraer.Click

        'Extraemos los datos
        '-------------------
        Dim imagenHex As String

        imagenHex = ExtraerImagenHexadecimal(RichTextBox1.Rtf)

        Dim elementos As String()

        elementos = ExtraerDatosImagen(RichTextBox1.Rtf)

        Dim ImgWidth As Integer = (CInt(elementos(3).Replace("picw", "")) / TWIP)
        Dim ImgHeight As Integer = (CInt(elementos(4).Replace("pich", "")) / TWIP)

        Dim imagenBuffer As Byte()

        imagenBuffer = PasarABinario(imagenHex)

        'Generamos y Exportamos la imagen
        '--------------------------------
        Dim image As Image

        Dim MemoryStream As Stream = New MemoryStream(imagenBuffer)

        image = System.Drawing.Image.FromStream(MemoryStream)

        Dim rect As New Rectangle(0, 0, ImgWidth, ImgHeight)

        Dim thumb As Bitmap = New Bitmap(ImgWidth, ImgHeight)

        Dim pint As Graphics = Graphics.FromImage(thumb)

        pint.DrawImage(image, rect)

        thumb.Save("c:\Imagen.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

        MemoryStream.Close()

    End Sub

#End Region

#Region "Procediminetos y Funciones"

    ''' 
    ''' Extrae la imagen en hexadecimal del texto del rtf
    ''' 
    ''' 
    ''' 
    ''' 
    Public Function ExtraerImagenHexadecimal(ByVal texto As String)

        Dim pictTagIdx As Integer = texto.IndexOf("{\pict\")
        Dim startIndex As Integer = texto.IndexOf(" ", pictTagIdx) + 1
        Dim endIndex As Integer = texto.IndexOf("}", startIndex)

        Return texto.Substring(startIndex, endIndex - startIndex)

    End Function

    ''' 
    ''' Extrae los Datos de la imagen
    ''' 
    ''' 
    ''' 
    ''' 
    Public Function ExtraerDatosImagen(ByVal texto As String) As String()

        Dim pictTagIdx As Integer = texto.IndexOf("{\pict\")
        Dim startIndex As Integer = texto.IndexOf(" ", pictTagIdx)
        Dim endIndex As Integer = texto.IndexOf("}", startIndex)

        Dim cadena As String

        cadena = texto.Substring(pictTagIdx, startIndex - pictTagIdx)

        Dim elementos As String() = cadena.Split("\")

        Return elementos

    End Function

    ''' 
    ''' Pasa la cadena Hexadecimal a un array binario
    ''' 
    ''' 
    ''' 
    ''' 
    Public Function PasarABinario(ByVal imageDataHex As String) As Byte()

        If imageDataHex Is Nothing Or imageDataHex.Trim = "" Then

            Throw New ArgumentNullException("imageDataHex")

        End If

        Dim hexDigits As Integer = imageDataHex.Length
        Dim dataSize As Integer = hexDigits / 2
        Dim imageDataBinary(dataSize) As Byte

        Dim hex As New StringBuilder(2)

        Dim dataPos As Integer = 0

        Dim c As Char

        For i As Integer = 0 To hexDigits - 1

            c = imageDataHex(i)

            If Char.IsWhiteSpace(c) Then

                Continue For

            End If

            hex.Append(imageDataHex(i))

            If hex.Length = 2 Then

                imageDataBinary(dataPos) = Byte.Parse(hex.ToString(), System.Globalization.NumberStyles.HexNumber)

                dataPos = dataPos + 1

                hex.Remove(0, 2)

            End If

        Next

        Return imageDataBinary

    End Function

#End Region

End Class

Proyecto de ejemplo para descargar:

martes, 3 de septiembre de 2013

Yo corro, Yo vuelo




Yo corro.

Y no es el camino, la ruta o el asfalto, ni las preocupaciones, ni el stress que voy dejando atrás.

Soy yo que avanzo.

Kilometro a kilometro y minuto a minuto, uno tras otro se enfilan en círculo alimentándome.

Vital proteína para un corazón que aprendió a latir lento para llegar más lejos, para tardar menos, para pedir más.

Tanto más que hoy no alcanza con lo de ayer y al que mañana no le alcanzará con lo de hoy.

Porque sigo avanzando.

Segundero rugoso y constante que acelera su pulso al ritmo de mi aliento, al ritmo de mis piernas que quieren ser alas, cada vez que despegan y cada vez que braceo.

La vista tiembla, el aire escasea.

Y pueden más 40 años de tesón, disciplina y voluntad gritando un inexplicable si, que 70 kilos de masa, fibra y tendón suplicando el irrefrenable basta y un incontenible no.

1.000 kilómetros cada carrera o más aún.

O a caso mis piernas no han tragados rutas enteras antes que el cronometro se ponga en cero, antes de pulsar el botón que da inicio a ese instante supremo que termina cuando vuelvo a apretarlo.

A reír si fui más rápido, a esperar el próximo si no lo fui tanto.

Y 1.000 kilómetros más, y 1.000 más.

Corro porque quiero, y hasta cuando no quiero corro porque si sigo quiero, tanto que finalmente sigo aunque ya casi no puedo.

Metro al cubo de alma que rompe la barrera del latido.

Trasformado en verbo, en acción.

Que lejos de poder decirse con la boca es necesario poder pensarse y sentirse, y solo aquellos que hayan sido verbos podrían intentarlo gritar, pero con el cuerpo.

Soy yo que corro.

Porque mi vida ya dejo de prestar momentos para eso.

Mi vida dejaría de ser sin ese instante,

Ese donde soy verbo, Ese en el que dios, el cielo y la tierra corren en mi, Ese en el que soy yo, Ese en el que yo vuelo.

viernes, 19 de julio de 2013

Gasolina

Ayer llegue a casa con un par de rayas en el deposito de la moto.
-«Tengo que echar gasolina»- pensé, pero ya sabéis lo de -«déjalo para luego mejor»-.
Así que me puse a otras cosas, y después, por la tarde noche, cuando me decidí a coger la moto para ir a la gasolinera, sorpresa, se puso a llover.
Me dije -«va… con dos rayitas llego hasta el curro y luego ya si acaso echo»-.
Esta mañana a mucho menos de medio camino se me ha encendido la reserva…
-«Que pronto !!!»-. Y aun me quedaban unos cuantos kilómetros para llegar…
-«Confía… confía en que aguante el deposito… y una mierda. A la primera gasolinera paro, aunque voy un poco pillado de tiempo para llegar a la hora al curro»-.
Paro. Cojo la manguera pero no va.
-«Hay que ir a la caja a decir que voy a echar gasolina. Pues pago 15 euros justos y ya no vuelvo, que tengo prisa»-.
Me meto en la tienda y hay cola.
-«Tengo prisa, vaaaaaamos.»-
Me voy acercando al mostrador y veo al dependiente, que al lado tiene a una compañera explicándole como debe hacer las cosas.
-«Debe ser su primer día… que suerte, vamos despacito»-.
Y entonces me fijo, el tío debe ser de mi edad, mas o menos. Me llama poderosamente la atención las gotas de sudor que le llenan toda la calva, -«como suda»-, y le miro las manos temblorosas, pero que muy temblorosas.
-«Es su primer día y esta como un flan»- pienso. Y le sigo mirando el temblor de las manos, -«igual lleva buscando curro una eternidad, y al fin le ha salido esto. Esta de los nervios y es incapaz de controlarse. El miedo a hacerlo mal y perder el curro debe ser gordo. Tal y como están las cosas uno no puede permitirse fallos. Que mal lo debe estar pasando»-.
Así que espero pacientemente mi turno y le repito dos veces el numero de surtidor y los euros que quiero echar porque el pobre no se entera. Los nervios no le dejan.
Al fin, pago y me voy despidiéndome educadamente y deseándole suerte.