Autor Tema: COMO LEER PIXEL A PIXEL UNA IMAGEN???  (Leído 9336 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nechevel

  • PIC10
  • *
  • Mensajes: 24
COMO LEER PIXEL A PIXEL UNA IMAGEN???
« en: 02 de Diciembre de 2004, 16:21:00 »
Hola amigos foristas !!!!!

Tengo una inquietud que no he podido resolver y es la siguiente: cargo en un formulario una imagen en blanco y negro, No en escala de grises, de cualquier tipo(.BMP, .JPG, .JPEG, .ICO, .CUR, .WMF, etc) y con una resolución máxima de 16 x 64 pixels. El objetivo es poder leer pixel a pixel la imagen y enviar vía serial el dato correspondiente: 0 --> blanco y 1 --> negro, a la memoria eeprom de un 16F628A.

Quisiera también saber como puedo convertir una imagen en color a una en blanco y negro, ya que esto lo estoy haciéndo en Corel Draw, pero me gustaría hacerlo directamente en Visual Basic.

Cualquier ayuda que me puedan brindar será bienvenida y de antemano les agradezco por tomarse el tiempo y la molestia de leer este Post.

Saludos Cordiales. NavidadDivertidoNavidad

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: COMO LEER PIXEL A PIXEL UNA IMAGEN???
« Respuesta #1 en: 03 de Diciembre de 2004, 08:55:00 »
Los mas simples de leer son los BMP, pues como su nombre indica, son mapas de bits... y en el caso de tener una profundidad de color de 1 bit, pues el archivo deberia tener esta apariencia:

10101010101010101111... ... ...

Donde los 1s y los 0s seran blanco y negro respectivamente, o al reves...

Los demas formatos, al ser compresiones (caso del JPG por ejemplo) precisarian de un tratamiento especial, del que poca cosa te puedo decir yo...

salu2

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: COMO LEER PIXEL A PIXEL UNA IMAGEN???
« Respuesta #2 en: 03 de Diciembre de 2004, 18:15:00 »
Sencillo pana nechevel,
usa GETPIXEL para obtener lo que necesites, abre tu archivo como binario "Open ............ For Binary As ........." y cheka que tipo de imagen es, una ves identificado puedes proceder a chekar su pixelaje, no te olvideds de cargarlo en una picturebox con formato de pixel(sea la imagen que sea) para que puedas aprovechar las propiedades scaleheight y scalewidth para fijar una rutina de lectura de pixeles:
If GetPixel(Picturexxx.hdc, X&, Y&Giño  = vbblack then...............
Donde x,y son las coordenadas del pixel que iran aumentando en un bucle for por ejemplo:
 For X& = 0 To (Picturexxxx.ScaleWidth)
          For Y& = 0 To (Picturexxxx.ScaleHeight)
                          If GetPixel(Picturexxxx.hdc, X&, Y&Giño  = vbblack then...............no te Para cambiar el color es el mismo proceso pero con el SETPIXEL:
                  SetPixel Picturexxxx.hdc, X&, Y&, vbBlack
Los valores entregados por ambos(getpixel y setpixel) son valores RGB
Salu2 pana

Desconectado nechevel

  • PIC10
  • *
  • Mensajes: 24
RE: COMO LEER PIXEL A PIXEL UNA IMAGEN???
« Respuesta #3 en: 03 de Diciembre de 2004, 18:26:00 »
Hola Manex y Lager.

Gracias por sus aportes. este fin de semana voy a intentar probar lo que me han comentado a ver como me vá.

Lager dos preguntas:
1. Cómo abro un archivo como binario "Open ............ For Binary As ........." y cheko que tipo de imagen es???
2. Tienes alugún ejemplo donde se utilize Getpixel ó Setpixel, para entender un poco más su funcionamiento?????

Cualquier avance o duda que me surja, se las comento.

Saludos. NavidadDivertidoNavidad

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: COMO LEER PIXEL A PIXEL UNA IMAGEN???
« Respuesta #4 en: 03 de Diciembre de 2004, 18:42:00 »
me imagino que ya has acargado en tu forma una imagen con commondialog, si no es asi, estudiate un poco como usarlos commondialog, usa el commondialogX.showopen para abrir un archivo X, puedes agregar filtros para determinados archivos cuando sea necesario.
despues caragas el archivo a ABRIR, para brir cualquier archivo acuerdate que tienes que guardarlo en buffer en una variable previamente dada de alta, como no sabes que vas a abrir ni su nombre es logico que tengas que usar variables determinantes de dichos objetos por ejemplo:
Open CommonDialogX.FileName For Binary As FileNumber , donde commonidalogX es el NOMBRE DL ARCHIVO SELECCIONADO EN EL MENU  previo  llamado por SHOWOPEN.
En fin te recomiendo que estudies apertura de archivos, que seria lo mas complicado a la hora de procesar  y revizar QUE tipo de archivo es, ya que el convertir o obtener pixeles es de lo mas sencillo  y se lleva a cabo en un solo paso..
Los ejemplos de su uso recien te los puse, comparas obtienes, etc.. solo tu imaginacion es el limite, para chekar que imagen es tienes que revizar headers de valores, justo los que guardaste a la hora de abrir el archivo y compararlos con estandares  asi por eejmplo para un archivo PNG tienes valores de  137,80 y 78 tambien hay forma de clacular el ancho y el alto sin necesiad de cargarlo en un picturebox, usando los datos de buffersize y del header, etc...
Fuera de eso que no es complicado no debes de tener ningun problema para hacer lo que quieres hacer pana
Salu2 pana

Desconectado felipito1

  • PIC16
  • ***
  • Mensajes: 118
RE: COMO LEER PIXEL A PIXEL UNA IMAGEN???
« Respuesta #5 en: 13 de Diciembre de 2004, 00:55:00 »
El COREL TRACE permite convertir una imagen en blanco y negro, luego pasarla a la resoluciòn que desee ejemplo 16x64, claro entre màs alta resoluciòn , mejor definiciòn y luego pasarla a bmp para hacer el tratamiento que dice manex_1987

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: COMO LEER PIXEL A PIXEL UNA IMAGEN???
« Respuesta #6 en: 17 de Diciembre de 2004, 20:35:00 »
Si la cuestion es pasar una imagen a blanco y negro se puede usar el Corel Photo Paint, el Pint estándar de Windows o cualquier otro.
El Corel Trace sirve para transformar un mapa de bits a imagen vectorial, cosa que en VB no te servirá de nada.
Aunque no comprobé a fondo el ejemplo de Lager me doy cuenta que quizás se pueda pasar una imagen en colores a monocromática (blanco y negro).
La cosa sería así:

En vez de usar:
If GetPixel(Picturexxx.hdc, X&, Y&) = vbblack then...

Se podría intentar con:
If GetPixel(Picturexxx.hdc, X&, Y&) > RGB (128,128,128) then
color = blanco
else
color = negro
end if

Esta teoría yo no la probé, la principar falla que puede tener es que RGB no devuelva un número, en realidad es una funcion para devolver colores a partir de los 3 colores primarios.
Miro un poco más la documentacion y vemos...

Otra cosa... creo que para usar GetPixel hay que declarar API"s, o no?

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: COMO LEER PIXEL A PIXEL UNA IMAGEN???
« Respuesta #7 en: 17 de Diciembre de 2004, 20:57:00 »
Como bien dice el pana Colores2, asi puede ser usado, el ejemplo que puse fue sustancial y tiene que ser modificado y adecuado a lo que se requiere.
Para usar el get o el set pixel(escribir un pixel del color que se quiera) se usan las sig librerias:
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long

Si las buscan asi en el MSDN , encuentran una cantidad de ejemplos y de formas de obtener lo que quieren panas, claro que la mejor opcion es la que elijan y prueben .
Aqui un trozo  del codigo que emplee para el G.t.p de todopic hecho especialmente para todos los panas de este foro:
               If GetPixel(Picture2.hdc, X&, Y&) >= 6500000 Then "valor no tan oscuro
                SetPixel Picture2.hdc, X&, Y&, vbBlack
                 Else
                SetPixel Picture2.hdc, X&, Y&, vbGreen - 22000 " podria ser vbWhite
                End If
La imagen (el formato que sea) hay que cargarlo como bien saben en un picturebox en calidad de PIXELES, <--- con esto mismo pueden saber su tamaño con sacle heigh o scale width para procesar CADA pixel como  quieran.
Hay un par de formas mas de hacer esto(sin libresrias), pero se sacrifica con mas codigo y al final resulta de lo mismo o hasta peor, pero se gana VELOCIDAD del procesamiento.

Un abrazo panas

Desconectado chips_ruiz

  • PIC10
  • *
  • Mensajes: 2
RE: COMO LEER PIXEL A PIXEL UNA IMAGEN???
« Respuesta #8 en: 20 de Septiembre de 2005, 17:09:00 »
Oye disculpa, pero las funciones que pusiste, me dan como resultado un -1, no se si es mucha molestia que me digas los pasos despues de asignar el Open nombre_archivo For Binary As #File, es que trato de saber separar una imagen sus colores, por ejemplo:

Si tengo esta imagen Sonrisa Gigante como saber el rango de la sonrisa, lo demas no me importa solo la sonrisa.

Espero me puedas ayudar.

Atte.
        Chips

Bytes!!

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: COMO LEER PIXEL A PIXEL UNA IMAGEN???
« Respuesta #9 en: 21 de Septiembre de 2005, 11:42:00 »
En que parte te da un -1 ???
Posteá el cógido de la función que usaste y el lugar donde falla y/o encontrás el -1.
Ta vez así te podamos ayudar...Giño


 

anything