• Viernes 8 de Noviembre de 2024, 08:30

Autor Tema:  Borrar lineas en Picturebox  (Leído 5720 veces)

CarMol

  • Nuevo Miembro
  • *
  • Mensajes: 6
  • Nacionalidad: ve
    • Ver Perfil
Borrar lineas en Picturebox
« en: Miércoles 13 de Mayo de 2009, 04:41 »
0
Saludos Foristas.
  Por favor necesito ayuda con este proyecto.
  En Visual Basic 6.0 estoy haciendo un programa donde en un picturebox coloco una imagen (mapa de ciudad) y sobre ella dibujo unas lineas (con picture1.line ...), todo bien hasta aqui. Ahora necesito borrar parte de las lineas sin borrar la imagen de fondo, luego al finalizar de llenar las lineas (son rutas en la ciudad) necesito guardar las lineas que estan dibujadas sobre la imagen, (solo las lineas no la imagen de fondo).
  Gracias amigos, espero su ayuda o sugerencias.....

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Borrar lineas en Picturebox
« Respuesta #1 en: Miércoles 13 de Mayo de 2009, 12:14 »
0
Cuando quieres borrar una pizarra, qué es lo que haces ?....

Quitas lo que hay encima dejando lo que está debajo. Pero qué pasa cuando hay 2 'capas' es decir que no queremos llegar a la pizarra...? , que hay que restaurar
lo que estaba debajo. Para lograr esto se necesita 'saber' que había debajo, es decir tenemos que tener guardado de alguna manera lo que había debajo para poder consltarlo
y a partir de elló reconstruirlo.

Hay varias formas unas más cómodas que otras , unas más complejas que otras y unas más costosas que otras...

a ) Por ejemplo lo más cómodo sería usar alguna librería que ya hiciera eso, pero quizás no sea fácil de adquirir, de usar o de aprender a usar, o simplemente la licencia de uso tiene consideraciones que no entran en nuestros propósitos respecto del proyecto que estemos haciendo.

b ) Casi lo más sencillo de hacer utilizando 4 líneas de código ( lo mas sencillo se describe 2 puntos más abajo pero necesitas explicaciones de este punto y el siguiente) , pero para obtener resultados buenos debes entender como opera si no te romperás la cabeza y sólo darás vueltas y vueltas... El código que te expongo ahora va en esa dirección...

Crea una nueva aplicación, añade 2 botones y un picturebox, carga desde diseño una imagen al picturebox, copia el código (de más abajo) , ejecútalo... los dos botones dan 4 combinaciones posibles en función del orden pulsado, por tanto podrás observar 4 situaciones diferentes del gráfico.

Prueba a hacer cambios, si lo entiendes mo necesitarías más ayuda...
Código: Visual Basic
  1.  
  2.  
  3. Const ini = 100
  4. Dim iniX As Integer
  5. Dim iniY As Integer
  6.  
  7. Private Sub Command1_Click()
  8.     For k = 0 To 29
  9.         Picture1.Line (iniX, iniY)-(iniX, iniY + 300), 16777215 - vbRed  ' quiero poner rojo, pero como utilizo el 'XOR'...
  10.         iniX = ini + (k * 20)
  11.     Next
  12. End Sub
  13.  
  14. Private Sub Command2_Click()
  15.     iniX = 100: iniY = 100
  16.     For k = 0 To 29 Step 2  ' solo toca las líneas pares
  17.         Picture1.Line (iniX, iniY)-(iniX, iniY + 20 + (10 * k)), vbBlue ' estas líneas van creciendo en longitud
  18.         iniX = ini + (k * 20)
  19.     Next
  20. End Sub
  21.  
  22. Private Sub Form_Load()
  23.     Dim img As IPictureDisp
  24.    
  25.     Me.ScaleMode = vbPixels
  26.     iniY = 100
  27.  
  28.     With Picture1
  29.         .AutoSize = True
  30.         .AutoRedraw = True  ' prueba a desactivar esta línea, y verás lo que ocurre...
  31.         .Refresh
  32.         .ScaleMode = vbPixels
  33.         .DrawMode = vbXorPen
  34.         .DrawWidth = 15 ' para ver mejor qué es lo que hace, lo normal es que vayas a utilizar 1 o 2...
  35.    
  36.         Set img = .Picture
  37.         .Width = 700        ' bucle de 30 * 20 distancia entee líneas  + 100 de ini=700, así quedan todas visibles...
  38.         .Height = 500       ' 100 de iniy(margens superior) + 300 de alto de línea mayor, más 100 de margen inferior = 500
  39.         .PaintPicture img, 0, 0
  40.         .Picture = .Image
  41.     End With
  42.     Set img = Nothing
  43. End Sub
  44.  
  45.  
Personalmente me crearía una clase que contuviera una colección de estructuras de tipo 'Linea' con algunos métodos para manejar la colección y dibujar-ocultar ...

c ) Puedes usar el control line, en vez del método line del contenedor, al efecto deberías crear una matriz de controles line, donde el primer control tiene índice 0, y no está visible... un botón debería indicar 'Crear nueva línea' y haces un load line(0) y luego un  visible=true para esa línea, deberías tener un conjunto de controles para modificar el ancho, alto, posición horizontal y posición vertical , color...

Luego a la gora de quitar líneas es un unload él control línea que sobra.
Para guardar el resultado en vez de guardarlo como gráfico (esto depende de dónde y cómo lo vayas a usar después ) puedes guardarlo como un conjunto de estructuras de tipo línea que recogen las propiedades que la definen (x,y, dx ,dy , color.... visible )  nº de líneas ... es decir quedarían guardadas como un gráfico 'vectorial' no como un gráfico 'pintado' ...  la ventaja es que podrías manipularlo fácilemtne en una nueva carga, por ejemplo escalnado, además actualizarlo sería más fácil si por ejemplo un día toda una cuadra de calles ahora es un único edificio, otra ventaja es el tamaño que ocupa en disco, bastante poco en comparación con una imagen de ANCHO x ALTO píxeles...

si en cambio las quieres guardar como gráfico basta que cree un 2º picturebox oculto, con uaotredraw= true, y dibujas con picture2.line la serie de líneas que son visibles en el gráfico actual con las propiedades que tiene cada línea  usando for each c in picture1.controls : if typeof(c) is line then... with c  picture2.lines( .x , .y) - ( .x1, .y1), .backcolor ...etc... después hacees el picture2.picture= su image y luego salvas las imagen del picture2....

Este modelo es bastante más sencillo de hacer que el modo anterior, pués no tienes que preocuparte de lo que tienes que hacer para controlar cuando y como ocultar líneas en un momento dado, basta eliminarlas o hacerlas invisibles.


d )  cualquier método que te permita recordar las lineas trazadas, al quitar  líneas lo que harás será borrar el contenido gráfico y redibujar sólo aquellas líneas que se quieren dibujar. La diferencia de este modo con los 2 anteriores, es que requiere redibujar por completo todas las líneas 'válidas' si sólo son unos pocos cientos 8incluso miles) es rapido pero si hay decenas de miles  castiga bastante al procesador con cada repintado... Los mértodos descritos anteriores permiten alterar sólo las líneas de interés las demás no habría porqué tocarlas ( en el código de ejemplo, se toca todo porque es de eso, de ejemplo, de hecho el código del botón 2 sólo toca las 'líneas' pares...). Este métod tiene la ventaja de que es el más sencillo de programar, porque no necesitas saber ni entender como funciona la transparencia, simplemente borras todo y trazas de nuevo. con todo necesitas tener que 'recordar' las líneas que se han dibujado, para reconsruirlo.

Luego hay otras formas un poco más o menos complejas... pero que no vamos a entrar en detalles, porque si no tienes cierto nivel mínimo de programación (en vb6 por lo menos) te iba a ser muy costoso realizarlo...
«Ma non troppo»
----> ModoVacaciones = False<----

CarMol

  • Nuevo Miembro
  • *
  • Mensajes: 6
  • Nacionalidad: ve
    • Ver Perfil
Re: Borrar lineas en Picturebox
« Respuesta #2 en: Miércoles 13 de Mayo de 2009, 22:17 »
0
Muchas gracias Nebire, por tu respuesta. Es muy explicativa voy a probarla y te comento luego. En otro foro me dijeron que lo tratara como el programa Photoshop con varias capas de imagenes pero no he podido terminar este proyecto. Nuevamente muchas gracias