de diez, solo que no se como hacer para utilizar la fucnion RGB, es decir, tengo la imagen en el picturebox pero no tengo ni idea como hacer para leer un tipo de dato RGB, analizar toda la imagen y luego sacar el color promedio, es decir es como si tuviera un archivo pero no se como leerlo, lo abri pero no se como accederlo, no se si me explico.
Lo que vos me pones seria si yo pudiera idear una funcion que recorra la imagen byte por byte y realizar ese trabajo, el tema es que no se commo hacer leer la imagen y determinar cada pixel en el formato bmp RGB24.
Me podrias indicar algo asi, no se si es muy complicado porque deconozco totalmente el tema de tratamiento de imagenes. Gracias igual
No entiendo que quieres decir con eso de que n0 sabes como utilizar la función RGB... Como no lo entiendo 'hablo' y espero que con ello captes las dudas que tengas al respecto.
Los colores van desde el 0 hasta el 16777215 o lo que es lo mismo se usan 256 intensidades para cada uno de los 3 colores base Rojo, Verde y Azul. Veamos si tenemos 3 colores base y 256 tonalidades por cada uno color máximo 256^3, una forma de expresar esto mismo sería decirlo todo en una sola cifra o expresarlo con sus componentes, así para el negro será rojo=0 Verde=0 Azul=0.
Ahora avanzando hasta el color 250, será Rojo=250 V=0, A=0 qué pasa cuando sobrepaso al valor 280, 280-256= 24 280/256=1'algo entonces Rojo=24, V01,A=0
Si te fijas bien matemáticamente estamos usando una base decimal cuyo valor es 256, la base decimal se basa en valores de 10 con un rango del 0-9,
El primer dígito expresa unidades, el 2º decenas y el tercero centenas, si cambiamos a la base 256, es exactamente igual: unidades= rojo, decenas= verde, centenas=azul
imagina, que los colores fueran en decimal 3 colores, pero sólo con 10 tonos, entonces los números irían desde el 0 al 999, como en este caso cada color se expresa con una cifra posicional sería muy fácil descubrir sus componentes: si dijéramos color 628, sabríamos que tendría 6 de azul, 2 de verde y 8 de rojo, esto lo hemos calculado así:
rojoAb= (10^0) * 8= 1* rojo
verdeAb= (10^1) * 2 = 10 * verde
AzulAb= (10^2) * 6 = 100 * azul
Ab sería indicador de absoluto...
Color= azulAb + verdeAb + rojoAb = 600 + 20 + 8
Bueno esto mismo hacemos con los colores en base 256
vamos a suponer que tenemos 230 de rojo, intensidad de verde= 42, intensidad de azul= 100
IntensidadAbsolutaDelColor= (base^(orden-1)) * intensidad
RojoAb= (256 ^0) * rojo= 1* 230 = 230
VerdeAb=(256^1) * verde = 256 * 42 = 10752
AzulAb= (256^2) * azul= 65536 * 100 = 6553600
Color= azulAb + verdeAb + rojoAb = 6553600 + 10752 + 230 = 6564582
Si hiceramos una funcion equivalente a la RGB sería así:
' para componer un color (long) desde sus componentes
Public Function MiRGB(byval Rojo as byte,byval Verde as byte, byval Azul as byte) as long
mirgb= (rojo + (verde * 256) + (azul *65536))
end function
' para extraer los componentes de un color:
public type RVA ' iniciales de: Rojo Verde, Azul, que es lo mismo que RGB pero en español
Rojo as byte
Verde as byte
Azul as byte
end type
friend function LongaRGB(byval Color as long) as ColRGB
colrgb.Rojo = color mod 256 ' imagina en decimal 628, cuantas unidades tenemos? hacemos un mod de 2 cifras es decir 628 mod 100=8
colrgb.Azul= color 65536 ' imagina en decimal 628 cuantas centenas tenemos, dividimos (entera) entre 100; 628 100= 6 . Es una división entera, byte y long también son enteros...
colrgb.Verde = (color 256) mod 256 ' imagina como aíslo las decenas en base decimal ?: hay 2 formas según el orden, deshacerse de las unidades, deshacerse de las centenas: 628 10= 62, ahora tomo las unidades que antes eran las centenas 62 mod 10 = 2
end function
No sé si necesitas más aclaraciones sobre la función RGB... yo te acabo de explicar el 'padrenuestro' de los colores, cuando algo te resulte complejo en base 256 piénsalo en decimal y luego cambia el valor de las bases
base^0=1, base^1=base , base^2= base*base
en decimal (base 10): 10^0=1; 10^1=10; 10^2=100
en base 256: 256^0=1; 256^1=256; 256^2=65536
____________________________
La siguiente cuestión que creo entender, como tomar colores del picture y ponerlos..
Los formularios y picture tiene 2 funciones para ese cometido : point, interroga por el color en unas cordenadas que se deben especificar, y pSet (pointSet) especifica que el color debe asignarse a unas cordenadas determinadas
dim color as long
' tomar un color
color= picture1.point(200,180) ' esto es: color= color del picturebox en las cordenadas 200,180
' poner un color
picture1.pset(200,180)= color ' valor que tiene esta variable
picture1.pset(200,180)= 1234567 ' valor inmediato
picture1.pset(200,180)= RGB(230,42,100) ' le pasa el valor que se calcula
dim Rojo as byte, Verde as byte, Azul as byte
Rojo=230, Verde=40, Azul=110
picture1.pset(200,180)= RGB(Rojo ,Verde +2 ,Azul -10)
Estas funciones son lentas, si se va a hacer un uso intensivo para tomar o asignar colores, es mejor usar las API SetPixel y GetPixel...
Para analizar toda la imagen tienes que barrer sus cordenadas, como las cordenadas son una malla, una cuadrícula, necesitas 2 bucles anidados entre sí
recorrer verticales a lo alto desde 0 hasta el alto de la imagen (o del picturebox, según el tipo de ajuste de la imagen)
recorrer horizontales a lo ancho desde 0 hasta el ancho de la imagen (o del picturebox, según el tipo de ajuste de la imagen)
tomarcolor del punto en horizontales, verticales
total= total + valordelpuntoactual ' como esto suma y suma, total deberás declararlo como double si no quieres tener desbordamiento
fin recorrer horizontal
fin recorrer vertical
' ojo, entiendo que quieres buscar el promedio de toda la imagen
promedio= total (horizontales* verticales)
Todo esto se puede acelerar mucho, pero conociendo a fondo las API para trabajar directamente con las imágenes, pero como estás muy verde y qque para ti lo importante es aprender VB (cupongo) y no tanto resolver el problema, creo que esto debería serte más que suficiente....
Practica para obtener colores de una imagen y modificarlos con point y pset, por ejemplo usando point lee un picturebox y con pset escribe en otro picturebox. Importante: Al trabajar con imágenes acuérdate de poner scalemode=vbpixels (3) para los picturebox .....
cuando domines y entiendas los colores y la función RGB, etc, podrás hacer cualquier cosa, como intercambiar los verdes por los rojos (intercambiar canales), variar luminosidad, umbralizar, etc....
nota: cuando en alguna parte pongo 'tono' referido a un color base en realidad debería poner intensidad referido a ese color, ya que tono en realidad siempre se aplica a un color compuesto por los 3 base... es un pequeño vicio que cualquiera podría entender, pero que a un neófito o novato puede confundir...