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.

miércoles, 24 de abril de 2013

Punzadas de dolor

Viene siendo bastante habitual últimamente que sufra punzadas de dolor nostálgico debido a la casualidad.
Hoy, no se como una cosa me ha llevado a otra y he terminado buscando juegos de Spectrum +3 en ebay, a ver que precio tenían por curiosidad. Y por casualidad he dado con un titulo especial… “Bad dudes vs Dragon Ninja”.
Al ver la caratulara del juego he sentido una puñalada de dolor nostálgico directa al corazón que casi me hace derramar unas lagrimitas -mezcla de tristeza, mezcla de felicidad- al recordar aquellas horas empleadas en aquel juego, y aquel tiempo tan feliz.
Aun recuerdo el día… era un viernes, y había ido con mi madre al Alcampo de Moratalaz… recuerdo ver el juego en las vitrinas de la zona de ordenadores y recuerdo como mi madre me lo compraba -previa típica negociación “te vas a portar bien y ya no hay mas cosas hasta nosecuando”- y yo lo sostenía entre mis manos, admirando durante horas interminables el trazado y los detalles del dibujo de la portada. Una portada que estaba metida en una carcasa de plástico duro, como las cintas de cassette de antaño.
Al fin tenia entre mis manos la copia de aquella recreativa en la que tantas monedas de 25 pesetas había gastado un verano en la playa de Benalmadena.
Recuerdo momentos infinitos mirando aquella portada y la ilusión de un niño de tener el tesoro mas preciado del mundo entre las manos. Dios!!! recuerdo esa misma sensación en muchos juegos de mi infancia… y se porque me duele recordar aquello. Lo se porque esa sensación no se vuelve a tener jamas en la vida.
Si, últimamente tengo demasiados recuerdos así. Me hago mayor y empiezan a abundar las nostalgias. Empiezan a abundar las certezas de que hay cosas que no volverán a pasar. Pero si hay algo que duele de verdad entre todos esos recuerdos, es recordar aquellos juegos de Spectrum.
Que tiempo tan feliz :D
Solo espero que mis hijos puedan tener recuerdos como esos cuando sean mayores.

martes, 23 de abril de 2013

Cómics digitales… ¿por qué?

¿Por qué los cómics digitales cuestan lo mismo que los impresos??? no lo entiendo. Los cómics impresos llevan consigo un gasto de tinta, papel, impresión, distribución… por no decir que solo se venden en sitios puntuales como quioscos o tiendas especializadas. El impacto de venta que produce el cómic impreso es mucho mas pequeño que el de su versión digital, que llega a todo aquel que tenga conexión a Internet a través de un ordenador, móvil o tablet. Entiendo que en su día se estableciera un precio justo para recuperar la inversión del cómic impreso pero no entiendo que se traslade ese mismo precio al mundo digital.
Ahora con las versiones digitales, te ahorras todos esos costes, y llegas a todo el mundo. ¿Entonces que quieren que paguemos en la versión digital?, ¿los derechos de autor? o simplemente es la misma historia de siempre, la de que vivimos en un mundo en el que las empresas no se enteran de la misa la mitad, en el que lo que sigue premiando es hacerse rico A COSTA DEL consumidor, no GRACIAS AL consumidor.
Un mundo donde quieren seguir manteniendo el mismo modelo de negocio pero trasladado a Internet, lo que conlleva un montón de ahorro de costes y mayor repercusión mediática ya que todo el mundo puede acceder al material… joder la ecuación perfecta entonces, produzco el mismo producto, me cuesta menos hacerlo, lo llevo a mucha mas gente y encima mantengo el precio. De puta madre “pa” mi bolsillo. Y Encima lloro porque hay piratería.
Venga coño que no somos gilipollas.
Me pueden decir que ahora hay un gasto de creación de webs, de servidores de almacenamiento, etc… si… carísimo todo eso para una empresa que vende un producto a nivel mundial… puf.
Una copia digital que es lo que me están vendiendo, debería costar al menos, la mitad del precio de su versión tangible. Así de simple. Una copia digital no puedo guardarla en un cajón, venderla o hacer con ella lo que me de la gana. No aumentara su valor al cabo de los años como pieza de coleccionismo. Únicamente puedo reproducirla en mi dispositivo.
Una copia digital queda en los servidores de una empresa, la cual si mañana desaparece ¿quien me garantiza que podre tener acceso a ella?. No es lo mismo, ni por asomo, que una copia tangible en papel. NO DEBERÍA TENER EL MISMO VALOR.

viernes, 22 de febrero de 2013

La canción recurrente

Tengo la gran suerte de poder escuchar música en mi trabajo de lo cual me alegro enormemente porque si no fuera  así, quizás mi estabilidad mental se vería seriamente afectada.
Normalmente esto de la música va por venazos, y cuando te pones a escuchar a un cantante o a un grupo, lo escuchas de forma continua. Te da por ahí y pones una y otra vez todos sus discos uno detrás de otro. Y siempre hay alguna canción que te gusta por encima de las demás. A esa canción que no te cansas de escuchar una y otra vez durante el venazo, yo la llamo “la canción recurrente”.
Así que voy a compartir con vosotros mis canciones recurrentes.
Esta semana se lleva el titulo “Allí donde solíamos gritar” de “Love of Lesvian”, espero que os guste.


miércoles, 16 de enero de 2013

La sana costumbre del “Hola”

Pues si, es una sana costumbre el decir “hola” cuando te cruzas con alguien.
Cierto es que en una gran ciudad como Madrid, esto queda un poco desvirtuado pues no vas a ir por la calle diciendo “hola” al primero que pasa, al estilo Micke Dundee en Cocodrilo Dundee. Pero es sano hacerlo, si por la razón que sea, tienes algo en común con la persona que te cruzas. Algo en común tan nimio como que te la encuentras todos los días en la parada del autobús a la misma hora, o tan nimio como que es la persona a la que le compras el pan, o la que lleva a sus hijos al mismo colegio que los tuyos y os cruzáis todos los días… no se, cosas así.
Esa practica es saludable y recomendable. Es síntoma “de buen hacer” y educación,  y establece lazos de complicidad, aunque sean mínimos y con desconocidos. Y sinceramente, no estamos sobrados de buenas maneras.
Si alguien prefiere no seguir esta practica… bueno, pues allá el o ella. Tampoco es una obligación hacerlo, simplemente es como ya he dicho, “de buen hacer”.
Lo que si es totalmente obligatorio, es decir “hola”, cuando alguien te lo ha dicho primero.
Puedes ser tímido y preferir pasar desapercibido por el mundo, puedes preferir no saludar a la gente que conoces, es una opción… pero lo que no puedes hacer es quedarte totalmente callado cuando alguien si que opta por lo contrario. Eso, es de mala educación y si me lo permitís, de persona cerda, -cerda mental, que no higiénica-.
Y es que un “hola”, no cuesta dinero, es totalmente gratis, se pueden regalar miles y aun nos quedaran otros tantos.
Desgraciadamente me encuentro con bastantes personas que optan por la marranería mental. No se porque sera. Quizás estén haciendo oposiciones de cerdadanía.
Y es que como alguien me dijo hace ya muchos años, “un hola no se lo debes negar ni a tu peor enemigo”.