Sección de tutoriales y manuales vb

Métodos gráficos - 2

Volver - 1 - 2



 

 

 

Sección que explica los aspectos básicos del uso del los métodos PaintPicture, LoadPicture y SavePicture de visual basic , que permiten leer , guardar , dibujar y copiar gráficos e imágenes

 

 

 

 

 

 

1 - Función LoadPicture :

 

Esta función se utiliza para cargar una imagen o gráfico en un control Form, PictureBox o Image.

Esta función requiere como parámetro obligatorio, el path del archivo de imagen a cargar en el objeto.

Por ejemplo lo siguiente carga un gráfico en un control PictureBox:

 

Picture1.Picture = LoadPicture("c:\archivo.bmp")

 

Lo mismo sería para un control Image o Formulario, o cualquier objeto que soporte la carga de un archivo de imagen de formato compatible a las que soporta Visual basic ( BMP, JPG, GIF, WMF, algunos ICO etc..) , no así los archivos PNG o TIFF por ejemplo, ya para estos últimos habría que utilizar el Api de windows o algún componente externo, para poder leerlos.

Nota: En este enlace hay un Módulo de clase que permite visualizar gráficos e imágenes de tipo PNG

 

Para cargar en un control Image:

 

Image1.Picture = LoadPicture("c:\archivo.bmp")

 

Para cargar en un Form:

 

El_Formulario.Picture = LoadPicture( La ruta)

 

También hay otras propiedades de algunos controles, que requieren por lo general el uso de esta función para cargar un archivo gráfico a dicha propiedad, como es el caso de:

La propiedad Icon de los formularios. La propiedad MouseIcon para establecer un icono personalizado al mouse. La propiedad DragIcon que permite establecer el icono que se va a mostrar como puntero en una operación de arrastrar y colocar, y algunas otras.

lo siguiente establece un archivo de ícono al puntero del Mouse para el formulario:

 

Me.MousePointer = vbCustom

Me.MouseIcon = LoadPicture(La_Ruta_Del_Icono)


Para establecer el ícono en un control TextBox:

 

Text1.MousePointer = vbCustom

Text1.MouseIcon = LoadPicture(La_Ruta_Del_Icono)

 

Además de los controles, se pueden cargar archivos con la función LoadPicture, por ejemplo en los siguientes tipos de variables: IPictureDisp, Picture stdPicture.

Aclarar que al cargar un gráfico en la variable, se debe establecer con la instrucción Set, por ejemplo:

 

Dim La_Imagen As Picture

Set La_Imagen = LoadPicture("c:\windows\plumas.bmp")

Picture1.Picture = La_Imagen 

 

Lo anterior carga en el la variable " La_Imagen " el archivo gráfico, y luego se puede pasar dicha variable a un objeto que tenga la propiedad Picture, en este caso se paso un control Picture1.

Para eliminar de la memoria la variable, se utiliza el valor Nothing también con la instrucción Set , por ejemplo:

 

If Not La_Imagen Is Nothing Then
   'Descarga la variable de la memoria
   Set La_Imagen = Nothing
End If 

 

Capturar el error 53.

Cuando cargamos un archivo con la función, y el path del archivo no existe, es decir que no se encuentra el fichero, se produce el error 53.

 

 

Un ejemplo para capturar el error:

 

On Error GoTo errSub


Picture1.Picture = LoadPicture(Ruta)


Exit Sub


'Error
errSub:
  
If Err.Number = 53 Then
   MsgBox "No se puede cargar el archivo, verifique la ruta", vbCritical
End If 

 


 

2 - Método SavePicture:

 

Este método lo que hace es guarda en un archivo en disco, un gráfico cargado en un control Form, PictureBox o un control Image.

Este posee dos parámetros, uno que especifica el Objeto Picture, y otro la ruta del archivo a generar

Savepicture Picture As IPictureDisp,FileName as String

 

Su uso es muy simple. A continuación una serie de ejemplos:

Esto lo que es cargar en un control Image, un gráfico del disco, y luego mediante otro botón, utilizando un control CommonDialog, guarda el archivo cargado en el Image en la ruta especificada:

Colocar un Control CommonDialog1, un control Image1 y dos controles CommandButton, Command1 y Command2:

 

vista del formulario con los controles para el ejemplo

 

Código en el formulario:

'Botón que carga el el archivo de imagen en el control  Image

Private Sub Command1_Click()
On Error GoTo errSub

With CommonDialog1
     
     .DialogTitle = "Seleccionar un archivo"
     .Filter = "Archivos BMP|*.bmp|Archivos JPG|*.bmp|Todos|*.*"
     
     .ShowOpen
     
     If .FileName = "" Then Exit Sub
     
     Image1.Picture = LoadPicture(.FileName)
     
End With

Exit Sub

'Error
errSub:
  
If Err.Number = 53 Then
   MsgBox "No se puede cargar dicho archivo, verifique la ruta", vbCritical
End If
End Sub


'Botón que guarda el contenido del control Image en un nuevo archivo

Private Sub Command2_Click()
With CommonDialog1
     
     .DialogTitle = "Guardar el archivo"
     .Filter = "Todos los Archivos|*.*"
     
     .ShowSave
     
     If .FileName = "" Then
        MsgBox "No se especificó ningún nombre", vbCritical
     End If
     
     If Image1.Picture <> 0 Then
        SavePicture Image1.Picture, .FileName
     Else
        MsgBox "No hay un gráfico cargado para poder guardar", vbExclamation
     End If
End With


End Sub

Private Sub Form_Load()
Command1.Caption = "Abrir"
Command2.Caption = "Guardar"
End Sub 

 

Este otro ejemplo, guarda el contenido del portapapeles de windows, en un nuevo archivo de tipo BMP.

Nota, debe haber una imagen válida en el ClipBoard, si no dará error. Para probar, se puede copiar al portapapeles la imagen de la pantalla presionando la tecla Print Screen, y luego ejecutar el siguiente código para generar el archivo

 

If Clipboard.GetFormat(vbCFBitmap) = True Then

'Guarda la imagen
SavePicture Clipboard.GetData(vbCFBitmap), "c:\Archivo.BMP"
Else
'Error: no coincide el Formato
MsgBox "La imagen del portapales no es válida", vbCritical, "No se pudo guardar"
End If

 

 


3 - El Método PaintPicture de Visual basic

 

La definición de este método es la siguiente:

 

El método PaintPicture permite dibujar el contenido de un archivo de gráficos en un Formulario, en un PictureBox o un objeto Printer.

 

La sintáxis del método es la siguiente:

 

El_objeto.PaintPicture La_Imagen, x1, y1, Ancho1, Alto1, x2, y2, Ancho2, Alto2, Opecode

 

El_Objeto:

Es como se comentó, donde vamos a dibujar el gráfico, puede ser un form, un picture o en el objeto Printer

La_Imagen

Este parámetro es de tipo StdPicture, y es la imagen a dibujar. Los formatos pueden ser un archivo Gif, Bmp, Jpg, Wmf, Dib, Ico . Esta imagen puede estar cargada en un control, por ejemplo en un Picture, Form, Image, o también en una variable de tipo StdPicture, IpictureDisp o de tipo Picture. Ver mas adelante un ejemplo de esto último de como utilizar gráficos cargados en variables

X1 e y1:

Son las coordenadas de destino, es decir la posición Izquierda y Arriba ( Left - Top ), donde se presentará la imagen a dibujar en el objeto destino

Ancho1 y Alto1:

Estos parámetros especifican el ancho y alto que tendrá la imagen a dibujar. Estos parámetros son opcionales, y si se omiten, la imagen se dibujará en el objeto con las dimensiones que tenga.

x2 e y2 :

Son las coordenadas a tomar en la imagen, es decir es la zona de recorte de la misma. Con estos parámetros podemos copiar un trozo del gráfico, si se omite, ya que es opcional, se toma la imagen completa.

Ancho1 y Ancho2:

Al igual que x2 e y2 son opcionales, y determinan el ancho y alto de la imagen en el objeto destino

 

Ejemplos:

 

Cargar en un control PictureBox un gráfico. Luego al presionar un command1, se copiará la imagen del Picture en el formulario.

 

vista del ejemplo 1 utilizando la función paintpicture para copiar una imagen

 

El código del CommandButton sería:

 

Private Sub Command1_Click()
'Copia el gráfico en el formulario
Me.PaintPicture Picture1.Picture, 0, 0
End Sub

 

Como se ve en el código, indicamos que copie la imagen del picture1 en el formulario, es decir en el primer parámetro le pasamos la propiedad Picture del control. Luego, se indica la posición izquierda y Arriba ( Left - Top ) en el objeto destino, en este caso el Form. Los demás parámetros son opcionales, y como en este caso se omitieron, la imagen se copiará con las dimensiones que tenga, es decir una copia exacta.

Si en cambio en ves de especificar 0 para x y 0 para y, le especificaríamos 500, y 500, el resultado sería el siguiente:

 

 

Importante. Los valores para las dimensiones y posiciones del método PaintPicture, ya sea para las coordenadas x1, y1, ancho1, alto1, ancho2 y alto2, depende de la propiedad ScaleMode del objeto destino. En el ejemplo anterior, se asume que se copió en la posición izquierda y Top, usando Twips como medida, por lo que si haces la prueba y cambias la propiedad ScaleMode del formulario, por ejemplo a vbPixels, la imagen se copiará tomando dicho modo de escala, es decir en pixeles. Lo mas común, es trabajar con pixeles, es mas cómodo.

 

Ejemplo 2:

 

Este ejemplo es igual al anterior, pero se utilizarán cuatro controles TextBox para indicar la posición x1, y1, ancho1 y ancho2.

 

vista previa del form con los controles para especificar en tiempo de ejecución los valores de las dimensiones del mapa de bits a copiar

 

Nota: el código no tiene una rutina de error para comprobar que algunos valores sean correctos, es decir si por ejemplo colocamos un valor que no sea numérico, dará error. también se producirá un error en tiempo de ejecución , si pasamos a PaintPicture, en Ancho1 y Alto1, el valor 0

Código fuente en el formulario:

 

Private Sub Command1_Click()


'Limpia el contenido del formulario
Me.Cls


'Copia el gráfico en el formulario con los valores
Me.PaintPicture Picture1.Picture, CSng(Text1), _
                                  CSng(Text2), _
                                  CSng(Text3), _
                                  CSng(Text4)
End Sub

Private Sub Form_Load()
' Modo de escala del formulario en pixeles
Me.ScaleMode = vbPixels
End Sub 

 

Ejemplo 3

 

Lo siguiente copia el gráfico cargado en un PictureBox llamado Pic_Origen, a otro PictureBox llamado Pic_Destino.

 

vista del ejemplo para copiar la imagen desde un picturebox a otro

 

Private Sub Command1_Click()


'Copia el gráfico con el ancho y alto que tenga _
Pic_Destino
Pic_Destino.PaintPicture Pic_Origen, 0, 0, _
                         Pic_Destino.ScaleWidth, _
                         Pic_Destino.ScaleHeight

End Sub

 

Como se ve, en los parámetros que especifican el alto y ancho, se pasó las dimensiones que tenga Pic_destino, ( ScaleWidth y ScaleHeight )

 

Ejemplo 4 - Dibujar con PaintPicture un gráfico centrado

 

Para dibujar una imagen centrada, por ejemplo en un formulario, podemos cargar la misma en una variable, como se comentó antes, que sea de tipo Picture, IpictureDisp o StdPicture, y luego pasarla como parámetro a PaintPicture, y en los parámetros X1 e Y1 ( posición Left y Top ) lo siguiente :

 

'Variable de tipo Picture para cargar mediante LoadPicture en _
 tiempo de ejecución un gráfico
Dim Una_Imagen As Picture

Private Sub Command1_Click()


Dim Pos_x As Single
Dim Pos_y As Single

'Limpia el formulario
Me.Cls


'Carga en la variable la imagen
Set Una_Imagen = LoadPicture("c:\bart.jpg")

' Obtiene la posición x e y para centrar la imagen
Pos_x = (Me.ScaleWidth - ScaleX(Una_Imagen.Width, vbHimetric, vbPixels)) / 2
Pos_y = (Me.ScaleHeight - ScaleY(Una_Imagen.Height, vbHimetric, vbPixels)) / 2

' Dibuja el gráfico centrado en el formulario
Me.PaintPicture Una_Imagen, Pos_x, Pos_y


End Sub

Private Sub Form_Load()
' Modo de escala en pixeles
Me.ScaleMode = vbPixels
Me.Caption = " Dibujar imagen centrada "
End Sub

Private Sub Form_Unload(Cancel As Integer)
'Elimina la imagen/Variable
If Not Una_Imagen Is Nothing Then Set Una_Imagen = Nothing
End Sub
 

 

El resultado al presionar el commandButton sería algo por el estilo:

 

vista del ejemplo para dibujar en el centro del formulario un grafico

 

En el código anterior, se declara una variable de tipo Picture para almacenar el gráfico mediante la función LoadPicture. Pero como es una variable de objeto, se debe utilizar la palabra clave Set.

También como se comentó, el gráfico a cargar debe ser un formato de imagen de los que soporta visual basic: bmp, gif, jpg etc... , no asi los Png o los tif por decir algunos.

Luego en Pos_x y Pos_y se calcula el centro del formulario, restando al ancho del form, el ancho de la imagen dividido por 2

Nota: La propiedad Width y Height de la imagen, no devuelve un valor en pixeles, si no en una medida llamada Himetric. Por ese motivo se utiliza la función Scalex y Scaley para convertir el valor de dicha escala a pixeles, ya que en el FormLoad se estableció el modo de escala del Formulario, que en este caso es donde se va a dibujar, en vbPixels. Aclaro que no se si es la única forma de convertir esto, pero al menos es la que conozco.

 

Ejemplo 5 - Recortar y estirar una imagen - Parámetros X2, y2 , Ancho2 y Alto2

 

Ahora se ve un ejemplo para ver estos parámetros opcionales que no se vieron en los ejemplos anteriores, y que los mismos permiten seleccionar partes de la imagen a copiar en el objeto destino, es decir un área específica. Si no se entiende demasiado, seguro viendo la siguiente imagen se aclara un poco el tema:

 

vista de la porción de imagen seleccionada

 

Para el ejemplo colocar un Picture llamado Pic_Origen y cargarle un gráfico. Agregar otro PictureBox llamado Pic_Destino. También Cuatro TextBox en un arreglo:

Text1(0), Text1(1), Text1(2) y Text1(3), para la posición x, posición y, para el ancho ancho y alto respectivamente.

Estos valores serán en pixeles, y esos mismos valores se utilizarán para la función PaintPicture para dibujar dicha área

 

Código fuente en el formulario:

Option Explicit

Private Sub Dibujar_Imagen(x As Single, y As Single, _
                           ancho As Single, alto As Single)
      
      ' Limpia - Borra los dos picture
      Pic_Destino.Cls
      Pic_Origen.Cls
      

      'dibuja el cuadrado en el Picture Origen
      Pic_Origen.Line (x, y)-Step(ancho, alto), vbRed, B
      
      'Dibuja la porción de imagen en Pic_Destino
      Pic_Destino.PaintPicture Pic_Origen.Picture, 0, 0, , , x, _
                                                             y, _
                                                             ancho, _
                                                             alto

         
End Sub

Private Sub Form_Load()

' Escala en pixeles para los dos Picture Box

Pic_Destino.ScaleMode = vbPixels
Pic_Origen.ScaleMode = vbPixels

'Para que al dibujar con Line y PaintPicture mantenga la imagen
Pic_Origen.AutoRedraw = True
Pic_Destino.AutoRedraw = True

'algunos valores iniciales
Text1(0) = 10
Text1(1) = 10
Text1(2) = 50
Text1(3) = 50

End Sub



Private Sub Text1_Change(Index As Integer)

On Local Error Resume Next
'Llama a la sub que dibuja con PaintPicture
Call Dibujar_Imagen(CSng(Text1(0)), _
                    CSng(Text1(1)), _
                    CSng(Text1(2)), _
                    CSng(Text1(3)))
                    
End Sub
 

 

El ejemplo anterior, al colocar valores en los TextBox para los ejes x e y, el ancho y alto, se dibuja mediante el método Line el recuadro ( área ) en el picture origen, luego se le pasan esos mismos valores a la función PaintPicture que dibuja esa porción de imagen en el otro PictureBox

 

 

Ejemplo 6 - Estirar una imagen haciendo un efecto de Zoom

 

El siguiente ejemplo es similar al anterior, con la diferencia de que se captura un área de un gráfico cargado en un picture, y se dibuja en otro picturebox, pero estirando la imagen como si fuese un zoom. Para capturar el área se utiliza un shape que se posiciona al mover el puntero del mouse sobre el picture que tiene la imagen:

 

vista del ejemplo para estirar la imagen haciendo un zoom mediante paintpicture

 

Colocar dos PictureBox y un control shape. A un Picture renombrarlo a Pic_Origen y cargarle un gráfico. Al otro picture renombrarlo a Pic_destino que es donde se copiará la porción de la imagen. El shape dejarlo con el nombre Shape1

 

Código fuente en un formulario

 

Option Explicit

Dim Ancho As Single
Dim Alto As Single


Private Sub Form_Load()


' Algunas propiedades para el shape

With Shape1

    .Width = 500
    .Height = 500
    .BorderWidth = 2
    .BorderColor = vbRed
        
    'Coloca el shape dentro de Pic_Origen
    Set .Container = Pic_Origen

End With


Ancho = Shape1.Width
Alto = Shape1.Height

End Sub

Private Sub Pic_Origen_MouseMove(Button As Integer, Shift As Integer, _
                                            X As Single, Y As Single)
   
   
   ' Mueve el Shape en el centro del puntero del mouse
   Shape1.Move X - Ancho / 2, Y - Alto / 2
   
   'Dibuja en Pic_Destino
   Pic_Destino.PaintPicture Pic_Origen, 0, 0, _
                            Pic_Destino.ScaleWidth, Pic_Destino.ScaleHeight, _
                            (X - Ancho / 2), (Y - Alto / 2), Ancho, Alto
End Sub
 

 


Dibujar un fondo ( imagen JPG , BMP ) a un formulario o picturebox

Este es un simple código fuente que utiliza la función PaintPicture para dibujar un gráfico JPG para el fondo del formulario y otra imagen para un picbox alineado en la parte superior.

En este caso , se dibuja el fondo en los eventos Resize del formulario y del picturebox superior que actúa como simple menú de opciones.

Descargar

 


 

Nota: En este enlace podés ver un ejemplo simple que hice de como hacer un Scroll en un gráfico mediante la función PaintPicture, para desplazar la imagen cuando la misma es superior ( Alto y ancho ) al contenedor, es decir a al PictureBox o Formulario

Scroll de imagen


Volver al índice

 

 


Buscar en Recursos vb