lunes, 12 de mayo de 2014
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
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.
lunes, 2 de septiembre de 2013
Reconstrucción
Porque no siempre se gana...
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, 15 de mayo de 2013
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 
Solo espero que mis hijos puedan tener recuerdos como esos cuando sean mayores.
Suscribirse a:
Entradas (Atom)

