Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: juanedwin en 18 Enero 2022, 22:03 pm



Título: Como fusionar una archivo de imagen y de texto en uno con vb.net framework3.5
Publicado por: juanedwin en 18 Enero 2022, 22:03 pm
saludos, tengo un archivo de imagen lo cargo en un picturebox o un control image y tengo unos datos en un textox (cadena de texto), quisiera poder de alguna manera exportarlo esos 2 componentes imagen y texto en un archivo, y de igual manera hacerlo a la inversa coger ese archivo exportado y volver a su posicion inicial es decir cargar la imagen en el picturebox  y el texto al textbox. saludos


Título: Re: Como fusionar una archivo de imagen y de texto en uno con vb.net framework3.5
Publicado por: Serapis en 19 Enero 2022, 15:34 pm
Crea una simple estructura con estos campos:

SizeImagen  entero32
SizeTexto  entero32
Opcionalmente sus nombres, si hubieran de ser de interés para lo que se haga.

Ahora creas un fichero nuevo con una extensión de tu interés, preferiblemente que no recoja ninguna aplicación para no inducir a errores.

El fichero destino tendrá, en este orden:
1 - La imagen
2 - El texto
3 - La estructura

Es decir, llenas la estructura con el tamaño de la imagen y la del texto. Luego lees la imagen en un array y lo vuelcas al fichero destino, luego lees el texto, y lo escribes detrás, finalmente escribes la estructura.

A la hora de leerlo, se hace la operación inversa (se leen en orden inverso), basta posicionar punteros de lectura y crear el array del tamaño correcto, son simples matemáticas de suma y resta. NET dispone de varios objetos para leer sin necesidad de tener que guardarlo de nuevo a otro fichero... Pero si tus conocimientos son limitados, al menos debeieras ser capaz de llegar a eso.

Hay una ventaja... la imagen al ir al comienzo de dicho fichero, puede ser leído (es lo normal), sin importar lo que haya detrás el decodificador de la imagen sabrá hasta donde leer y donde parar. Luego para cargar la imagen basta con pasar la ruta de dicho fichero.


Título: Re: Como fusionar una archivo de imagen y de texto en uno con vb.net framework3.5
Publicado por: juanedwin en 21 Enero 2022, 20:55 pm
Gracias, por tu respuesta, me diste una idea, aunque no pude realizar tu propuesta, es que tengo conocimiento muy basico, asi que busque y resolvi con el siguiente codigo, quisiera ver si esta bien codificado, no se eso de las buenas formas de programar, resolvi con este codigo :
Código
  1. Private Sub btnExportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExportar.Click
  2.        Try
  3.            ' Obtengo los bytes de la imagen y del texto
  4.            Dim archivoimagenByte = IO.File.ReadAllBytes("C:\Users\luchito\Desktop\villancicos huaraz.png")
  5.            Dim archivotexto = System.Text.Encoding.UTF8.GetBytes(tbOriginal.Text.ToCharArray)
  6.            ' Convierto los bytes de imagen y texto en string
  7.            Dim exportar1 As String = Convert.ToBase64String(archivoimagenByte)
  8.            Dim exportar2 As String = Convert.ToBase64String(archivotexto)
  9.            ' Creo un archivo con una extension no usada
  10.            ' y escribo las dos variables separadas por enter
  11.            Using sw As New IO.StreamWriter("c:\exportar.iop", False)
  12.                sw.WriteLine(exportar1 & vbCrLf & exportar2)
  13.            End Using
  14.        Catch
  15.            MsgBox(Err.Description)
  16.        End Try
  17.    End Sub
  18.  
  19.    Private Sub btnImportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImportar.Click
  20.        ' Obtengo la lectura del archivo exportado
  21.        Dim sr As New IO.StreamReader("c:\exportar.iop")
  22.        ' Separo los datos de la imagen y texto y lo asigno a la variable memoria
  23.        Dim memoria() = sr.ReadToEnd().Split(vbCrLf)
  24.        sr.Close()
  25.        ' Convierto el texto de imagen en array de bytes al igual que el texto
  26.        Dim imagenByte() As Byte = Convert.FromBase64String(memoria(0))
  27.        Dim texto() As Byte = Convert.FromBase64String(memoria(1))
  28.        ' Armo la imagen con los bytes y el texto tambien
  29.        Using ms As New IO.MemoryStream(imagenByte, 0, imagenByte.Length)
  30.            pbCopia.Image = Bitmap.FromStream(ms)
  31.            tbCopia.Text = System.Text.Encoding.UTF8.GetString(texto)
  32.        End Using
  33.    End Sub


Título: Re: Como fusionar una archivo de imagen y de texto en uno con vb.net framework3.5
Publicado por: Serapis en 22 Enero 2022, 14:39 pm
Te vale...

Yo hubiera operado exclusivamente con bytes y sin necesidad de la codificación a y desde Base64.
Pero tratándose de  contenido de pequeño tamaño (una imagen comprimida y el texto de un textbox), no pecará demasiado de lentitud.

Nota que la conversión a Base64 permite el 'splitado' posterior correctamente con un 'separador' que no forma parte de la codificación de Base64 (retorno de carro y avance  de línea en el ejemplo). Es adecuado sin embargo que conozcas que un split, exige buscar (byte a byte prácticamente) la secuencia a lo largo de todo el contenido (imagina si ocupara cientos de Mb.), en tanto que si se guarda un valor con el tamaño de uno u ambos contenidos, el punto de unión entre ambos contenidos se conoce de forma absoluta, sin necesidad de búsqueda, de ahí que sea más eficiente la forma que te señalé.

Cuando pongas código, al poner código y usar las etiquetas 'code' puedes elegir desde la ventana de edición del mensaje, en el combobox 'código GeSHi', el lenguaje usado así se colorea la sintaxis y lo hace más legible.


Título: Re: Como fusionar una archivo de imagen y de texto en uno con vb.net framework3.5
Publicado por: juanedwin en 25 Enero 2022, 16:02 pm
tienes razon, sin embargo no he podido realizar o encontrar como realizar eso(tu primer comentario), asi que hice con otro metodo que creo es mas eficiente que mi propuesta inicial, no se si estara bien pero aqui va.
Código
  1. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
  2.        Dim archivoimagenByte = IO.File.ReadAllBytes("C:\Users\luchito\Desktop\9.jpg")
  3.        Dim archivoBinary As BinaryWriter = New BinaryWriter(File.Open("c:\jj.jj", FileMode.Create))
  4.        archivoBinary.Write(archivoimagenByte.Length)
  5.        archivoBinary.Write(archivoimagenByte)
  6.        archivoBinary.Write(TextBox1.Text)
  7.        archivoBinary.Close()
  8.    End Sub
  9.    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
  10.        Dim archivoBinary As BinaryReader = New BinaryReader(File.Open("c:\jj.jj", FileMode.Open))
  11.        Dim pictureLength = archivoBinary.ReadInt32
  12.        Dim imgByte = archivoBinary.ReadBytes(pictureLength)
  13.        Using ms As MemoryStream = New MemoryStream(imgByte, 0, imgByte.Length)
  14.            PictureBox2.Image = Bitmap.FromStream(ms)
  15.        End Using
  16.        TextBox2.Text = archivoBinary.ReadString
  17.        archivoBinary.Close()
  18.    End Sub