# Uso del PictureBox en Visual Basic 2010



## juanma2468 (May 20, 2013)

Hola gente, he estado buscando por la web, pero no he podido encontrar exactamente lo que quiero. He desarrollado una placa que adquiere datos (imagenes) de 900 pixeles de un sensor optico, el cual lo envio por USB mediante una aplicacion CDC, lo cual genera un puerto virtual COM en la PC. Para la interfase de comunicacion estoy utilizando Visual Basic 2010, ya he logrado la parte de la conexion del puerto COM, pero ahora es donde viene lo que no se como hacer. Tengo que representar esos 900 bytes en una matriz de 30x30 como una imagen en pixeles, preferentemente en escala de grises.
En visual basic V6.0 habia una manera de hacerlo que era PictureBox1.Pset(x,y), pero en 2010 ya no es mas asi, y la verdad es que estoy algo perdido con esto. Si alguien ha tenido que hacer algo similar o sabe puntualmente como realizar dicha matriz de pixeles, pues se lo agradeceria mucho. les adjunto mi proyecto para que puedan ver lo que he hecho hasta ahora, desde ya muchas gracias.


----------



## ByAxel (May 20, 2013)

Hola.
Debes de crear un objeto Bitmap, y dibujar bit a bit con el mètodo SetPixel().
Al terminar de dibujar bit a bit, lo envias al PictureBox como imagen.

Si necesitas dibujar algo manualmente, crea un objeto Graphics. con las propiedades del Bitmap y trazas lo que sea con las libreria de GDI+.
Saludos.


----------



## juanma2468 (May 21, 2013)

Gracias ByAxel por responder. Si no fuera mucho pedir, podrias detallarme un poco como seria el codigo.
Por otro lado, como le indico que los bytes que leo quiero que los ponga como escala de grises y no como color RGB? Desde ya muchas gracias. Saludos


----------



## ByAxel (May 21, 2013)

Bueno generalmente trabajo en C# pero no es difícil de comprender.

Creas un objeto Bitmap con el tamaño de la matriz que tienes (30x30) es algo pequeño, no? 

using System.Drawing;
Bitmap bmp = new Bitmap(30,30);

// Dentro del un for que recorra la matriz.
bmp.SetPixel(X, Y, Color.Gray); // Color.FromArgb(0,0,0); puedes spesonalizar el color, tonalidades.

pictureBox.Image = bmp;

Saludos.


----------



## juanma2468 (May 22, 2013)

Nuevamente gracis por responder, gracias a tu ayuda pude realizar lo que  queria en parte, ya pude crear el objeto Bitmap, pero no exactamente  como me lo indicaste ya que me saltaban ciertos errores, lo resolvi de  la siguiente manera, primero declare una variable como Dim imagen As  Bitmap (30,30) y luego hice Picturebox.Image = Imagen.SetPixel(i,j,  Color.FormArgb(i+j,i+j,i+j)) dentro de un bucle por y me grafico la  imagen dentro del picturebox.
Ahora tengo otras inquietudes. Hay  alguna manera de modificar el tamaño de asignacion del pixel, como un  factor de escala o zoom? Porque si bien es una imagen chica, necesito  que se vea mas grande, aunque implique un cierto pixelado, eso no  importa. Por otro lado, creo que no me cirve del todo el Color.FormArgb,  porque es para ingresar con 3 valores interos y yo poseo solo 1 para  escala de grises, seria logico pensar que debiera haber una intruccion  para estos casos no?
Y la ultima inquietud es, yo mando los 900 byte  por el puerto COM, pero en el programa declare una variable Datos como  String, es posible leer la rafaga de bytes pero que funcione como  Integer, porque al momento de queres usar los datos en la funcion  Color.FormArgb me dice que el dato no puede ser Char, entonces lo que  hice fue convertirlos a intero mediante la funcion DatosInteger =  Cint(val(Datos(i+j)) y me salto error de que me excedi en el valor de la  matriz, que paso? si en teoria nunca superaria el valor 60 y posee 900  valores Datos, en el bucle lo use luego asi Picturebox.Image =  Imagen(i,j, Color.FormArgb(i+j,i+j,DatoInteger)). Será que estoy leyendo  mal los datos, utilizo la intruccion Datos = PuertoSerie.ReadExisting(). Bueno espero no haberte preguntado demaciado. Desde ya muchas gracia por todo.


----------



## ByAxel (May 22, 2013)

Para el metodo FormArgb(), indica que es un còdigo RGB (rojo, verde y  azul), como ves son bàsicos para hacer mezclas de colores y soportan  valores del 0 al 255; Argb, indica que tambien soportan niveles de  transparencia. Para grises solo basta que los tres valores sean los  mismos.

Para el caso de tipos distintos puedes usar; en mi caso C# por ejemplo  VariableInt = (int)ValorChar; o Convert.ToInt(ValorChar). Busca  similares.

Para el caso del tamaño hay varias formas que se me ocurren, por ejemplo.
1: Hago que el bitmap sea proporcionalmente mas grande que la matriz  (60, 60), ya es el doble y al momento de pintar, pinto 2x2 pixeles con  un mismo dato de la màtriz.
2: Se puede cambiar el formato del pixel de varias formas, como cambiar  la representaciòn del tamaño (pixel, inch, display, etc).
3: GDI+

Resiva la ayuda el lìnea MSDN en español.

Saludos.


----------

