Autor
		 | 
		
			Tema: [RETO] GetMaskColor   (Leído 2,857 veces)
		 | 
	 
 
	
		
			
				
					
						| 
							LeandroA
							
						 | 
						
							
							 
							
Hola esta es una función que debo realizar así que la pongo como un reto para quienes estén aburridos, les cuento de que se trata, la idea es obtener el color de mascara de una imagen, como pueden ver en la siguiente  a simple vista reconocemos que es un color Magenta, lo que intentaremos es obtenerlo mediante código, para no complicar las cosas usaremos un PictureBox sin bordes (BordeStyle = none), AutoSize = True  y ScaleMode = vbPixels para obtener el color utilizaremos el api GetPixel Private Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long entonces en el picture pondremos una de las imagenes que se encuentran abajo de todo.  la imagen es una tira de iconos, nosotros debemos verificar en cada esquina de ese icono cual es el color, el color que se repita mas veces sera el color de mascara como muestro en esta imagen   con puntos azules y rojos son los puntos donde debemos comprobar el color almacenarlo en algún array o lo que sea y luego ir sumando para al final ver cual es el que se repitio mas veces.      como son todos iconos cuadrados una ayuda para obtener el tamaño de cada icono y la cantidad de iconos Private Sub Form_Load()     Dim lWidth As Long     Dim lHeight As Long     Dim NumIcon As Long
      lWidth = (Picture1.ScaleWidth \ Picture1.ScaleHeight)     If lWidth = 0 Then lWidth = 1     lWidth = Picture1.ScaleWidth \ lWidth     lHeight = Picture1.ScaleHeight          NumIcon = Picture1.ScaleWidth \ lWidth          Debug.Print lWidth, lHeight, NumIcon End Sub 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						| 
							seba123neo
							
						 | 
						
							
							 
							
Hola, esta hecho asi nomas, debe tener algun error, pero es la idea no ? Option Explicit   Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long   Private vArrColores() As Variant   Private Sub Form_Load()     Dim lWidth As Long     Dim lHeight As Long     Dim NumIcon As Long       lWidth = (Picture1.ScaleWidth \ Picture1.ScaleHeight)     If lWidth = 0 Then lWidth = 1     lWidth = Picture1.ScaleWidth \ lWidth     lHeight = Picture1.ScaleHeight       NumIcon = Picture1.ScaleWidth \ lWidth       lWidth = lWidth / 15     lHeight = lHeight / 15       Dim i As Integer     Dim vCont As Integer       vCont = 0       ReDim vArrColores(NumIcon * 4)       For i = 0 To NumIcon - 1           'Verifica la esquina Izquiera superior         If i > 0 Then             Debug.Print Picture1.hdc, (lWidth * i) + 1, 0             vArrColores(vCont) = GetPixel(Picture1.hdc, (lWidth * i) + 1, 0)         Else             Debug.Print Picture1.hdc, lWidth * i, 0             vArrColores(vCont) = GetPixel(Picture1.hdc, lWidth * i, 0)         End If           vCont = vCont + 1           'Verifica la esquina Izquiera inferior         If i > 0 Then             Debug.Print Picture1.hdc, (lWidth * i) + 1, lHeight - 1             vArrColores(vCont) = GetPixel(Picture1.hdc, (lWidth * i) + 1, lHeight - 1)         Else             Debug.Print Picture1.hdc, lWidth * i, lHeight - 1             vArrColores(vCont) = GetPixel(Picture1.hdc, lWidth * i, lHeight - 1)         End If           vCont = vCont + 1           'Verifica la esquina Derecha Superior         If i > 0 Then             Debug.Print Picture1.hdc, lWidth * (i + 1) - 1, 0             vArrColores(vCont) = GetPixel(Picture1.hdc, lWidth * (i + 1) - 1, 0)         Else             Debug.Print Picture1.hdc, lWidth - 1, 0             vArrColores(vCont) = GetPixel(Picture1.hdc, lWidth - 1, 0)         End If           vCont = vCont + 1           'Verifica la esquina Derecha Inferior         If i > 0 Then             Debug.Print Picture1.hdc, lWidth * (i + 1) - 1, lHeight - 1             vArrColores(vCont) = GetPixel(Picture1.hdc, lWidth * (i + 1) - 1, lHeight - 1)         Else             Debug.Print Picture1.hdc, lWidth - 1, lHeight - 1             vArrColores(vCont) = GetPixel(Picture1.hdc, lWidth - 1, lHeight - 1)         End If           vCont = vCont + 1           Debug.Print ""     Next       Call Ordenar_Matriz(vArrColores, LBound(vArrColores), UBound(vArrColores) - 1)       Debug.Print "------------RESULTADO COLORES------------"       Dim q As Integer     Dim vColorTemp As Long     Dim vContTemp As Long       Do Until q = UBound(vArrColores) - 1           vColorTemp = vArrColores(q)         vContTemp = 0           Do Until vColorTemp <> vArrColores(q)             vContTemp = vContTemp + 1             If q <> UBound(vArrColores) - 1 Then q = q + 1         Loop           Debug.Print "COLOR " & vColorTemp & " REPETIDO: " & vContTemp & " VECES"     Loop End Sub   Private Sub Ordenar_Matriz(El_Vector() As Variant, Limite_Inferior As Long, Limite_Superior As Long)       Dim i As Long, j As Long, x As Variant, y As Variant       i = Limite_Inferior     j = Limite_Superior       x = El_Vector((Limite_Inferior + Limite_Superior) / 2)       While i <= j           While (El_Vector(i) < x) And (i < Limite_Superior)             i = i + 1         Wend           While (x < El_Vector(j)) And (j > Limite_Inferior)             j = j - 1         Wend           If i <= j Then             y = El_Vector(i)             El_Vector(i) = El_Vector(j)             El_Vector(j) = y             i = i + 1             j = j - 1         End If       Wend       If Limite_Inferior < j Then Ordenar_Matriz El_Vector(), Limite_Inferior, j     If i < Limite_Superior Then Ordenar_Matriz El_Vector(), i, Limite_Superior End Sub   
 
 saludos. 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						| 
							LeandroA
							
						 | 
						
							
							 
							
Aca esta mi función Option Explicit Private Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long   Private Type BuferColor     Color As Long     Count As Long End Type   Private Sub Form_Load()     Picture1.AutoRedraw = True     Me.BackColor = GetMaskColor(Picture1) End Sub   Private Function GetMaskColor(oPic As PictureBox) As Long     Dim i As Long, j As Long, x As Long     Dim lWidth As Long, lHeight As Long     Dim NumIcon As Long     Dim aColors() As Long     Dim BC() As BuferColor     Dim bFind As Boolean     Dim lMax As Long, ArrSize As Long       lWidth = (oPic.ScaleWidth \ oPic.ScaleHeight)     If lWidth = 0 Then lWidth = 1     lWidth = oPic.ScaleWidth \ lWidth     lHeight = oPic.ScaleHeight       NumIcon = oPic.ScaleWidth \ lWidth       ArrSize = (NumIcon * 4) - 1       ReDim aColors(ArrSize)         For i = 0 To NumIcon - 1         aColors(j) = GetPixel(oPic.hdc, x, 0)         aColors(j + 1) = GetPixel(oPic.hdc, x + lWidth - 1, 0)         aColors(j + 2) = GetPixel(oPic.hdc, x, lHeight - 1)         aColors(j + 3) = GetPixel(oPic.hdc, x + lWidth - 1, lHeight - 1)         j = j + 4         x = x + lWidth     Next       ReDim BC(ArrSize)     x = 0       For i = 0 To ArrSize        bFind = False        For j = 0 To x             If BC(j).Color = aColors(i) Then                 BC(j).Count = BC(j).Count + 1                 bFind = True                 Exit For             End If        Next        If Not bFind Then BC(x).Color = aColors(i): x = x + 1     Next       For i = 0 To x - 1         If BC(i).Count > lMax Then             lMax = BC(i).Count             GetMaskColor = BC(i).Color         End If     Next   End Function   
 
 Seba la idea es obtener un color final, puede que alla un empate en la cantidad de colores  pero almenos es una aproximación Saludos.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	 |  
 
	 
	
 
			 
			
				
					
						| Mensajes similares | 
					 
					
						 | 
						Asunto | 
						Iniciado por | 
						Respuestas | 
						Vistas | 
						Último mensaje | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Reto ;)
							 
							Ingeniería Inversa
						 | 
						
							NeoKiller
						 | 
						
							3
						 | 
						
							3,587
						 | 
						
							 
							
								15 Agosto 2004, 23:12 pm 
								por NeoKiller
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Reto!!
							 
							Ingeniería Inversa
						 | 
						
							HaCkZaTaN
						 | 
						
							2
						 | 
						
							3,581
						 | 
						
							 
							
								10 Septiembre 2004, 09:30 am 
								por Ðevastador
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Reto vB
							 
							Ingeniería Inversa
						 | 
						
							nhouse
						 | 
						
							2
						 | 
						
							4,119
						 | 
						
							 
							
								16 Marzo 2005, 09:41 am 
								por 4rS3NI(
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							reto en VB6
							 
							Ingeniería Inversa
						 | 
						
							ellolo
						 | 
						
							1
						 | 
						
							3,116
						 | 
						
							 
							
								15 Abril 2005, 10:03 am 
								por UnpaCker!
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Un reto !!!
							« 1 2 3 » 
							Programación Visual Basic
						 | 
						
							VirucKingX
						 | 
						
							24
						 | 
						
							10,493
						 | 
						
							 
							
								 8 Mayo 2006, 23:36 pm 
								por Kizar
							
						 | 
					 
				 
			    |