none
importar imagenes dinamicas RRS feed

  • Pregunta

  • tengo una aplicación en visual net con basedatos sql server express

    tengo unas imagenes asociadas a una tabla de articulos y tengo que sacar un impreso con datos del articulo y sus imagenes (varias). El tema es que las tenia en una tabla de sql pero me temo que ocupan mucho y la version express no me lo permite y ademas se ralentizara

    he consultado en el foro de crystal reports como se pueden meter imagenes que estan en un campo texto "c:\imagenes\imagen1.jpg" y mas... pero nadie me contesta

    me pregunto si igual se podria hacer en word, excel...

    alguien tiene una idea que darme?

    datos de una tabla sql + fichero imagen que es obtenga con su ruta (c:\imagenes\imagen1.jpg)

    gracias


    Aran

    martes, 12 de junio de 2018 13:20

Respuestas

  • "aticnet" escribió:

    > he consultado en el foro de crystal reports como se pueden meter imagenes que estan
    > en un campo texto "c:\imagenes\imagen1.jpg" y mas... pero nadie me contesta
    >
    > alguien tiene una idea que darme?
    >
    > datos de una tabla sql + fichero imagen que es obtenga con su ruta (c:\imagenes\imagen1.jpg)

    Hola:

    Yo, de Crystal Reports, poco te voy a poder ayudar, pero si por casualidad el informe de Crystal Reports admite un objeto DataTable, donde el campo (objeto DataColumn) que almacena las imágenes es del tipo System.Byte() (una matriz de byte), la solución sería sencillísima, ya que lo único que tienes que hacer es obtener un objeto Image con la ruta del archivo gráfico y la conviertes a System.Byte(). Una vez que tengas la matriz de bytes, añadirías un nuevo registro al objeto DataTable, y finalmente se lo asignarías éste al informe de Crystal Reports en el supuesto que este lo admita, claro está.

    Para obtener una matriz de bytes correspondiente al archivo gráfico, bien te puede servir la siguiente función:

    Imports System.Drawing.Imaging

    ''' <summary> ''' Devuelve una matriz de bytes con el contenido del archivo gráfico especificado. ''' </summary> ''' <param name="path">Ruta completa del archivo gráfico.</param> ''' <param name="format">ImageFormat que especifica el formato al que se desea convertir la imagen.</param> ''' <returns></returns> Friend Shared Function ConvertToBytes(path As String, format As ImageFormat) As Byte() If (String.IsNullOrWhiteSpace(path)) Then Throw New ArgumentException("El valor de la ruta del archivo no es válido.") End If Dim buffer As Byte() = New Byte(0 - 1) {} Dim img As Image = Image.FromFile(path) Using ms As New IO.MemoryStream() img.Save(ms, format) Return ms.ToArray() End Using End Function


    Y para obtener un objeto Imagen correspondiente a una matriz de bytes, esta otra:

        ''' <summary>
        ''' Convierte una matriz de Byte en un objeto Image utilizando opcionalmente la información
        ''' de administración del color que pudiera estar incrustada en la matriz especificada. El
        ''' objeto System.Drawing.Image obtenido mediante éste método, tendrá que ser destruido
        ''' explícitamente mediante una llamada a su método Dispose a fin de liberar la memoria
        ''' ocupada por el mismo.
        ''' </summary>
        ''' <param name="data">Matriz de Byte que se desea convertir.</param>
        ''' <param name="useEmbeddedColor">Valor true para utilizar la información de administración
        ''' del color incrustada en la matriz especificada; en caso contrario, false.</param>
        ''' <returns></returns>
        Friend Shared Function ConvertToImage(data As Byte(), useEmbeddedColor As Boolean) As Image
            If (data Is Nothing) Then
                Return Nothing
            End If
            Dim ms As New IO.MemoryStream(data)
            Dim image As Image = Image.FromStream(ms, useEmbeddedColor, True)
            ms.Position = 0
            Return image
        End Function

    Y si necesitas crear manualmente el objeto DataTable, adapta a tus necesidades la siguiente función:

        Friend Shared Function CreateDataTable() As DataTable
    
            Dim dt As New DataTable("Imágenes")
    
            ' Crear el campo que conformará la clave principal del objeto DataTable.
            Dim dc As New DataColumn("Id", GetType(System.Int32))
            dt.Columns.Add(dc)
    
            ' Especificar la clave principal
            dt.PrimaryKey = New DataColumn() {dc}
    
            ' Crear el campo que almacenará una matriz de bytes.
            dc = New DataColumn("Imagen", GetType(System.Byte()))
            dt.Columns.Add(dc)
    
            ' Devolver el objeto DataTable creado.
            Return dt
    
        End Function

    ¡Bueno! Ahora para añadir al objeto DataTable la imagen cuya ruta aparece escrita en un control TextBox, simplemente ejecutarías lo siguiente:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Obtener el objeto DataTable
                Dim dt As DataTable = CreateDataTable()
    
                ' Añadir un nuevo registro al objeto DataTable
                Dim row As DataRow = dt.NewRow()
                row("Id") = 1
                row("Imagen") = ConvertToBytes(TextBox1.Text, ImageFormat.Jpeg)
                dt.Rows.Add(row)
    
                ' Enlazar el objeto DataTable con un control DataGridView.
                DataGridView1.DataSource = dt
    
                ' Mostrar la imagen en un control PictureBox.
                PictureBox1.Image = ConvertToImage(DirectCast(row("Imagen"), Byte()), True)
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Observa que en el ejemplo he utilizado un control PictureBox para verificar que se muestra correctamente la imagen existente en el campo Imagen del objeto DataTable.

    Hasta aquí ya tienes en memoria un objeto DataTable que puede tener 1, 2, 20 registros con 1, 2, 20 imágenes. Ahora ya solo quede que el informe de Crystal Reports admita un objeto DataTable, cuestión que ignoro por completo. ¿Que lo admite? Pues estupendo. ¿Que no? Tendrás que buscarte otra alternativa. ;-)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 13 de junio de 2018 15:46
    Moderador