Muchas veces he tenido la necesidad de querer guardar una imagen especifica en un proyecto, pero mi dilema siempre fue que era lo mejor, si guardarla en el servidor, como un copia y pega, ó guardarla en la misma base de datos. Claro que ambos procedimientos tienes sus pros y contras, ventajas y desventajas, que pasare a detallar a continuación.
- Si lo guardas en el Servidor de manera física(no en BD) evitas que la base de datos se sobre cargue de imágenes ya que si guardas una imagen de bastante resolución pues hará que ocupe bastante espacio en la BD.
- Pero el riesgo que puedan borrase fácilmente o que el espacio asignado en el servidor tenga un limite muy bajo. o que la carpeta donde estas guarda la imagen sea borrada o el nombre sea cambiado.
- Si lo guardas en BD te ahorras el tiempo de administrar las imágenes, ya que te aseguras que estarán en el servidor de base datos donde para eliminar hay muchas reglas que evitarían eso.
- Si lo Guardas en BD habría un tiempo de demora en procesar esa petición ya que la imagen dependiendo de su tamaño en resolución tiene que ser procesada para mostrarla en tu proyecto
Bueno todo esto ya queda en sus manos, es criterio y decisión de cada uno, el mio es guardarla en la BD ya que mi proyecto no sera una galería de imágenes, y solo guardare unas cuantas por lo que me conviene realizar el almacenamiento en la BD.
Buena, esta vez les enseñare a guardar esas imágenes de cualquier formato ya sean JPG,BMP,PNG para esto utilizaremos el lenguaje de programación Visual Studio .Net y SQL Server, las versiones no importan mucho ya que la sintaxis la trabaje desde la versión 2008 así que hay pocos cambios en adelante.
Mi ejemplo sera construir un formulario para guardar la configuración del Sistema como Nombre de Empresa, Color de Interfaz e Imagen de Fondo del Proyecto(comunmente utilizado en el fondo de un MDIParent)
- ESTRUCTURA DE TABLA EN SQL: Este script tiene los tres campos basics para este ejemplo, en el se encuentra un campo tipo IMAGE el cual almacenara la imagen en bytes, para saber mas de este tipo de campo leer TIPOS DE DATOS
CREATE TABLE sys_Config ( id_Config INT IDENTITY(1,1) PRIMARY KEY ,nom_app VARCHAR(20) ,color_app char(7) ,img_MDI image )
- DISEÑO DE FORMULARIO: Deberás agregar :Tres Labels – Dos Cajas de Texto(txtNombre, txtIMGMdi ) – Un PictureBox(ptcolor) -: Dos Buttons (btImagen, btUp) te debería quedar así.
- CODIFICANDO FUNCIONES: En este ejemplo estoy trabajando en el modelo de programación de 03 capas pero en esta ocasión solo programare desde la Capa Negocio, asumo que las clases de conexión ya las tienen implementadas, el código seria así:
Imports System.Data.SqlClient Public erru As String Public Function UpConf(ByVal NomSys As String, ByVal COLOR As String, ByVal IMGMDI() As Byte = Nothing) As Boolean Try Dim dllBD As New Capa_Datos.Conex Dim ds As New DataSet dllBD.INICIACONEX(DB) Dim dpt As New SqlDataAdapter("UST_UPDATE_CONFIG", dllBD.cn) dpt.SelectCommand.CommandType = CommandType.StoredProcedure dpt.SelectCommand.Parameters.AddWithValue("@NOMSYS", NomSys) dpt.SelectCommand.Parameters.AddWithValue("@COLORSYS", COLOR) dpt.SelectCommand.Parameters.AddWithValue("@MODIMG", MODIMG) dpt.SelectCommand.ExecuteNonQuery() dllBD.CERRARCONEX() UpConf = True dllBD = Nothing ds = Nothing dpt = Nothing Catch ex As Exception erru = Err.Description UpConf = False End Try End Function
Bien ahora el código en el formulario para cada botón, los cuales tendrán las funciones de abrir los cuadros de dialogo, para elegir el color para el MDI y la imagen de fondo del MDI, también estará el código que convierte a byte la imagen para luego pasarla a la Capa Negocios (CapaNeg, en la clase cls-conf. Como dije asumo que la clase conexión a la base de datos ya la tienen funcionando.
'CODIGO PARA ABRIR UN CUADRO PARA ELEGIR COLOR Private Sub ptColor_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ptcolor.Click Dim verFolder As New ColorDialog Dim result As DialogResult = verFolder.ShowDialog() If result = Windows.Forms.DialogResult.OK Then ptcolor.BackColor = verFolder.Color End If verFolder = Nothing End Sub 'CODIGO PARA ABRIR UN CUADRO PAA ELEGIR UNA IMAGEN DE NUESTRA BIBLIOTECA Private Sub btImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btImage.Click Dim verFolder As New OpenFileDialog verFolder.Filter = "Todas las Imagenes|*.jpg;*.gif;*.png" verFolder.Title = "IMAGEN para Pantalla Principal" verFolder.ShowDialog() If verFolder.FileName <> "" Then txtIMGMdi.Text = verFolder.FileName End If verFolder = Nothing End Sub 'CODIGO PARA REALIZAR LA ACTUALIZACION, GRABAR DATOS EN LA BD Private Sub btUp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btUp.Click Dim add As Boolean, imgmdi As String Dim Config As New CapaNeg.clsConf If ptcolor.BackColor.Name <> "Control" And txtIMGMdi.Text <> "" Then add = Config.UpConf(txtNombre.Text, ptcolor.BackColor.Name, Image2Bytes(Image.FromFile(txtIMGMdi.Text))) ElseIf ptcolor.BackColor.Name <> "Control" And txtIMGMdi.Text = "" Then add = Config.UpConf(txtNombre.Text, ptcolor.BackColor.Name, Nothing) ElseIf ptcolor.BackColor.Name = "Control" And txtIMGMdi.Text <> "" Then add = Config.UpConf( txtNombre.Text, Nothing, Image2Bytes(Image.FromFile(txtIMGMdi.Text))) ElseIf ptcolor.BackColor.Name = "Control" And txtIMGMdi.Text = "" Then add = Config.UpConf(txtNombre.Text, Nothing, Nothing) End If If add = False Then MsgBox("Error Actualizando. Datos: " & Config.erru, MsgBoxStyle.Critical, "Error del Servidor") Else MsgBox("¡ACTUALIZACIÓN CORRECTA!" & vbNewLine & "Para que todos cambios surtan efecto se recomienda cerrar todas las terminales.", MsgBoxStyle.Information, "Bien hecho!") If ptcolor.BackColor.Name <> "Control" Then mdPrincipal.MenuStrip.BackColor = ptcolor.BackColor mdPrincipal.ToolStrip.BackColor = ptcolor.BackColor End If If txtIMGMdi.Text <> "" Then mdPrincipal.BackgroundImage = System.Drawing.Bitmap.FromFile(txtIMGMdi.Text) End If Config = Nothing add = Nothing End Sub ' FUNCION PARA TRANSFORMAR IMAGENES EN BYTES PARA SER GUARDADA EN LA BD Public Function Image2Bytes(ByVal img As Image) As Byte() Dim sTemp As String = Path.GetTempFileName() Dim fs As New FileStream(sTemp, FileMode.OpenOrCreate, FileAccess.ReadWrite) img.Save(fs, System.Drawing.Imaging.ImageFormat.Png) fs.Position = 0 ' Dim imgLength As Integer = CInt(fs.Length) Dim bytes(0 To imgLength - 1) As Byte fs.Read(bytes, 0, imgLength) fs.Close() Return bytes End Function Public Function Bytes2Image(ByVal bytes() As Byte) As Image If bytes Is Nothing Then Return Nothing ' Dim ms As New MemoryStream(bytes) Dim bm As Bitmap = Nothing Try bm = New Bitmap(ms) Catch ex As Exception System.Diagnostics.Debug.WriteLine(ex.Message) End Try Return bm End Function
- Por ultimo lo que nos quedaría es adecuar este código en su proyecto, ya que como podemos ver no es nada difícil solo es cuestión de ingenio, cualquier duda la pueden hacer e los comentarios. También les dejo un link de mucha ayuda, se trata de SQLFiddle y es una pagina en a cual podran probar su código SQL antes de meterlo al SQL Server o cualquier otro motor de base de datos, muy util cuando no tienen el servidor a la mano, con esto harian una preprueba, muy fácil de utilizar y con soporte para varios motores de base de datos.