gillardg
Messages postés3275Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 septembre 2014
-
20 juin 2009 à 23:48
gillardg
Messages postés3275Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 septembre 2014
-
21 juin 2009 à 13:56
j'ai donc commencé par me créer une liste d'images (Pix), avec la couleur dominante,
le problème que je rencontre c'est au moment de comparer le pixel de l'image principale avec la couleur dominante des images de (pix)
impossible de trouver 2 couleurs les mêmes pourtant je m'étais dit qu'avec 10000 images ça devrait marcher :)
quelqu'un aurait il une idée??
gillardg
Messages postés3275Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 septembre 20142 21 juin 2009 à 09:30
Bonjour,
bonjour , je pensais que l'image était parlante :) 1 chaque image à une couleur dominante que l'on peut déduire avec un algo simple et arbitraire
je fais donc un tableau avec la structure thumb
avec 10000 images :)
'struct thumb = filename + dominant color
Public
Structure thumb
Dim FilePath AsString
Dim colo As Color
EndStructure
maintenant j'ouvre une image on va l'apeler bmp
que je mets dans un tableau de structure pixel
'struct pixel = position + color
PublicStructure pixel
Dim x AsInteger
Dim y AsInteger
Dim col As Color
EndStructurepour créer une mosaique à partir de bmp : mosaic qui sera une représentation de bmp ou chaque pixel de l'image sera un carré de 50*50 ( thumb )
mosaic sera donc 50 X plus grand
pour chaque pixel trouver dans tableau thumb couleur correspondante ( c'est la que j'ai un problème car tout le reste fonctionne )
j'ai un tableau de structure contennant 10000 images qui ont chacune une couleur dominante
j'ai un tableau de pixel contenant 10000 pixel ce qui me donnera une mosaic de 5000*5000
mais impossible de trouver les couleurs correspondantes
j'ai pensé peut être limiter le nombre de couleurs aux couleur WEB mais comment trouver la couleur web la plus proche de la couleur thumb et la couleur web la plus proche de la couleur pixel ??
mettre thumb
dans mosaic
position = pixel.x*50 pixel.y*50
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 21 juin 2009 à 11:29
Tu souhaite donc remplacer un pixel par une image, ok
Petite correction 10000 * 50 = 500 000 ^^
Pour commencer, tu peux travailler avec les pixels en mode RGB, ou en mode HSB, le problème vien du fait qu'il va faloir substituer des couleurs, car ta palette d'image est restreinte par rapport au couleurs 24Bits (je ne compte pas le Plan Alpha).
Si tu part du principe qu'un pixel est composé de 3Bytes (toujours sans compter le plan A), un pour le Rouge, un pour le vert, et un pour le bleu, cela te donne donc une palette de 255 ^ 3 = 16 581 375, on est donc loin de ta palette de 10 000...
Chacune des images de ton tableau devra donc être marqué pour appartenir non pas à une couleur, mais à une fourchette de couleur à fin de réduire cette palette, pour le calcul, je ne sais pas vraiement, et je t'avoue que ca m'a l'air assez complexe, de plus je n'ai pas le temps de me penché la dessus...
Petit conseil, récupere les pixels de ton image sous forme de System.Drawing.Color, celle ci te donnerai les infos sur le RGB/HSB sans avoir de code à saisir. Pour moi le plus simple serait de travailler avec le HSB étant donné que tu va subtituer des couleurs, je pense qu'il faut prendre en compte que la teinte devrat être respecté, mais ton image aura moins de précision quand à la saturation et à la luminosité.
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
gillardg
Messages postés3275Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 septembre 20142 21 juin 2009 à 12:23
salut , merci pour ta réponse ,
j'ai trouvé plus simple , une petite classe qui trouve la webcolor la plus proche, ça limite évidement le résultat mais c'est pas trop grave :)
voici le code mais c'est pas parfait , à mon sens on peut faire encore mieux
'
' * This code is provided "as is". Without any warranty.
'
Imports System
Imports System.Collections
Imports System.Drawing
Imports System.Reflection
Public NotInheritable Class ColorManagement
Private Shared WebColors As ArrayList
''' <summary>
''' Returns the "nearest" color from a given "color space"
''' </summary>
''' The color to be approximated
''' <returns>The nearest color</returns>
Private Sub New()
End Sub
Public Shared Function GetNearestWebColor(ByVal input_color As Color) As Color
' get the colorspace as an ArrayList
WebColors = GetWebColors()
' initialize the RGB-Values of input_color
Dim dbl_input_red As Double = Convert.ToDouble(input_color.R)
Dim dbl_input_green As Double = Convert.ToDouble(input_color.G)
Dim dbl_input_blue As Double = Convert.ToDouble(input_color.B)
' the Euclidean distance to be computed
' set this to an arbitrary number
' must be greater than the largest possible distance (appr. 441.7)
Dim distance As Double = 500.0
' store the interim result
Dim temp As Double
' RGB-Values of test colors
Dim dbl_test_red As Double
Dim dbl_test_green As Double
Dim dbl_test_blue As Double
' initialize the result
Dim nearest_color As Color = Color.Empty
For Each o As Object In WebColors
' compute the Euclidean distance between the two colors
' note, that the alpha-component is not used in this example
dbl_test_red = Math.Pow(Convert.ToDouble((CType(o, Color)).R) - dbl_input_red, 2.0)
dbl_test_green = Math.Pow(Convert.ToDouble((CType(o, Color)).G) - dbl_input_green, 2.0)
dbl_test_blue = Math.Pow(Convert.ToDouble((CType(o, Color)).B) - dbl_input_blue, 2.0)
temp = Math.Sqrt(dbl_test_blue + dbl_test_green + dbl_test_red)
' explore the result and store the nearest color
If temp < distance Then
distance = temp
nearest_color = CType(o, Color)
End If
Next o
' done :-)
Return nearest_color
End Function
''' <summary>
''' Returns an ArrayList filled with "WebColors"
''' </summary>
''' <returns>WebColors</returns>
''' <remarks>Many thanks to Julijan Sribar for his excellent article (http://www.codeproject.com/cs/miscctrl/MultiTabColorPicker.asp)</remarks> Private Shared Function GetWebColors() As ArrayList
Dim color As Type = (GetType(Color))
Dim propertyInfos() As PropertyInfo = color.GetProperties(BindingFlags.Public Or BindingFlags.Static)
Dim colors As New ArrayList()
For Each pi As PropertyInfo In propertyInfos
If pi.PropertyType.Equals(GetType(Color)) Then
Dim c As Color = CType(pi.GetValue(CObj(GetType(Color)), Nothing), Color)
colors.Add(c)
End If
Next pi
Return colors
End Function
End Class
Vous n’avez pas trouvé la réponse que vous recherchez ?
gillardg
Messages postés3275Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 septembre 20142 21 juin 2009 à 12:27
décidément la freetxtbox n'aime pas chrome , ou est ce le contraire ???
svp pourrais on avoir une freetextbox compatible chrome ??mdr
je vais poser la question à google pour voir si on peut rendre chrome compatible avec la freetextbox
gillardg
Messages postés3275Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 septembre 20142 21 juin 2009 à 13:27
ça réduit à 141 :(
mais j'ai pas d'autres idées pour l'instant.
si tu vois un moyen simple de faire une palette de disons 2560 couleurs, je suis preneur :)