Extraire des valeurs d'un tableau [Résolu]

Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
- - Dernière réponse : cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
- 11 juin 2015 à 21:22
Bonjour et merci de votre aide et du temps consacré
Mon projet et de réaliser une toute petite application pour automatiser la réalisation de patron de livre plié comme montré dans l'exemple sur ce site :
http://www.faitmain-faitcoeur.fr/en-papier/tuto-livre-plie-ecriture/

Donc jusqu'à maintenant :
1) Je charge une photo dans une pictureBox (Image brut sans le traçage de ligne) : çà j'y suis arrivé
2) Je récupère les hauteurs de bande de couleur (départ=>arrivée) de chaque colonne dans un tableau comme le tableau ci-dessous : çà j'y suis arrivé
3) Et donc maintenant il me faudrait extraire le tableau final et là franchement pour moi c'est trop compliqué donc si quelqu'un pouvait me donner des conseil ce serait très gentil.



Voici le problème que je rencontre dans un tableau à deux dimension comme ci-dessous je voudrais extraire des données dans un nouveau tableau.
Donc voici comment mon tableau est formalisé
4 188 193
5 188 193
6 187 193
7 101 116
7 186 193
8 93 124
8 185 193
9 90 127
9 184 193
10 85 131
10 184 192
11 83 133
11 183 192
12 80 137
12 181 192
13 79 139
13 180 192
14 75 141
14 179 192
15 74 143
15 178 192
16 72 145
16 176 192
17 71 146
17 176 191
18 69 148
18 174 191
19 67 149
19 173 191
20 65 151
20 171 191
21 65 152
21 170 191
22 63 154
22 167 191
23 62 155
23 166 191
24 60 157
24 163 191
25 59 157
25 162 191
26 58 191
27 57 191
28 56 191
29 55 191
30 54 98
30 120 191
31 53 94
31 123 192
32 52 88
32 128 192
33 51 86
33 131 192
34 50 82
34 135 192
35 49 80
35 135 192
36 49 78
36 131 193
37 48 76
37 129 193
38 47 73
38 126 193
39 46 72
39 124 193
40 45 70
40 120 191
41 45 69
41 118 189
42 44 67
42 114 185
43 43 66
43 112 183
44 4 8
44 43 64
44 108 179
45 3 8
45 42 63
45 106 177
46 3 9
46 41 61
46 102 175
47 4 10
47 41 60
47 100 176
48 5 11
48 40 59
48 97 177
49 5 12
49 40 58
49 95 177
50 5 14
50 39 57
50 91 178
51 6 14
51 39 56
51 89 161
51 161 178
52 7 16
52 38 55
52 84 157
52 162 179
53 7 18
53 37 54
53 82 155
53 162 179
54 7 20
54 37 53
54 77 151
54 164 180
55 8 22
55 37 52
55 75 149
55 164 180
56 9 25
56 36 51
56 69 145
56 166 181
57 9 27
58 61 139
58 167 182
59 10 34
59 35 49
59 57 137
59 167 182
60 11 134
60 169 183
61 11 132
61 169 183
62 12 128
62 170 183
63 13 126
63 170 184
64 13 122
64 172 184
ect ...
donc Voici les conditions d'extraction :
En colonne 0 : un numéro unique ou répété
Donc en partant du départ du tableau colonne "0":
Si le numéro est unique alors
je récupère la ligne
autrement
Si le numéro est répété alors
je récupères qu'une seule ligne des numéro répété avec comme condition:
à la première ligne de la colonne "0" si le numéro est répété alors
je prends la valeur la plus haute de la colonne "1" et je conserve donc cette ligne.
Ensuite je continu et dans la série d'après quelque soit le nombre de répetition je prend la valeur inférieur à celle d'avant .
Lorsque j'arrive à la valeur la plus petite ; je redémarre avec une valeur la plus haute
jusqu'à arrivé à un numéro unique
comme ceci jusqu'à la fin du tableau.
Merci Bcp
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
1
Merci
Bonjour,
et donc, dans ta série des "donc", jugeant la chose trop "compliquée" pour toi, tu attends quoi, exactement ?
Je te rappelle que l'on ne reçoit ici de l'aide que concernant une difficulté technique, spécifique et parfaitement isolée rencontrée dans le cours de ton développement.
Où est cette difficulté précise et isolée (accompagnée du code au moins tenté pour la résoudre) ?

Merci ucfoutu 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
12369
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
1
Merci
Bonsoir et c'est là que l'on se dit
Oh, quel dommage de ne pas se servir de .Net (VB, C#, etc.. peu importe) pour ce que c'est => Un Langage Objet
Et oui , j'ai déjà dit que ton programme serait bien plus simple à coder avec une collection d'objets, mais bon....

Merci Whismeril 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Whismeril
Messages postés
12369
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
L'idée de base avec l'objet "métier" c'est de concentrer dans une classe les données et action afférents à un "thème".

J'ai décidé que l'objet pour être inialisé de 2 façons, qu'il contient les données col0, col1, col2 et compte, qu'il sait compter les occurrences de col0 et qu'il sait trier et apurer la liste
Imports System.Collections.Generic
Imports System.Linq


Public Class ExempleRoro
    Public Sub New(ByVal Col0 As Integer, ByVal Col1 As Integer, ByVal Col2 As Integer)
        Me.New(Col0, Col1, Col2, 0)
    End Sub

    Public Sub New(ByVal Col0 As Integer, ByVal Col1 As Integer, ByVal Col2 As Integer, ByVal Count As Integer)
        Colonne0 = Col0
        Colonne1 = Col1
        Colonne2 = Col2
        Compte = Count
    End Sub


    Public Property Colonne0() As Integer

    Public Property Colonne1() As Integer

    Public Property Colonne2() As Integer

    Private privateCompte As Integer
    Public Property Compte() As Integer
        Get
            Return privateCompte
        End Get
        Private Set(ByVal value As Integer)
            privateCompte = value
        End Set
    End Property

    Public Overrides Function ToString() As String
        Return String.Format("{0} {1} {2} {3}", Colonne0, Colonne1, Colonne2, Compte)
    End Function

    Public Shared Function Compter(ByVal Liste As List(Of ExempleRoro)) As List(Of ExempleRoro)
        Return (
            From item In Liste
            Let c = Liste.Select(Function(tt) tt.Colonne0).Count(Function(ttt) ttt = item.Colonne0)
            Select New ExempleRoro(item.Colonne0, item.Colonne1, item.Colonne2, c)).ToList()

    End Function

    Public Shared Function SansDoublonsCol0(ByVal Liste As List(Of ExempleRoro)) As List(Of ExempleRoro)
        Return (
            From item In Liste.OrderBy(Function(x) x.Colonne0).ThenByDescending(Function(xx) xx.Colonne1).GroupBy(Function(xxx) xxx.Colonne0)
            Select New ExempleRoro(item.Key, item.ElementAt(0).Colonne1, item.ElementAt(0).Colonne2, item.ElementAt(0).Compte)).ToList()

    End Function


End Class



Et comment on s'en sert
        Dim maListe As New List(Of ExempleRoro)()
        maListe.Add(New ExempleRoro(4, 188, 193)) 'compte 1 affiche la ligne attendue à la fin
        maListe.Add(New ExempleRoro(7, 101, 116))
        maListe.Add(New ExempleRoro(5, 188, 193)) 'compte 1
        maListe.Add(New ExempleRoro(7, 186, 193)) 'compte 2
        maListe.Add(New ExempleRoro(8, 93, 124))
        maListe.Add(New ExempleRoro(9, 90, 127))
        maListe.Add(New ExempleRoro(8, 185, 193)) 'compte 2
        maListe.Add(New ExempleRoro(9, 184, 193)) 'comte 3
        maListe.Add(New ExempleRoro(11, 83, 133))
        maListe.Add(New ExempleRoro(9, 85, 13))
        maListe.Add(New ExempleRoro(10, 184, 19)) 'compte 1
        maListe.Add(New ExempleRoro(11, 183, 19)) 'compte 2

        Dim maListeAvecCompte As List(Of ExempleRoro) = ExempleRoro.Compter(maListe)
        Dim maListeApureeEtTrieeParColonne0 As List(Of ExempleRoro) = ExempleRoro.SansDoublonsCol0(maListeAvecCompte)


C'est vite fait, ça doit pouvoir être amélioré, et peu commenté (je pense que ça parle de soi même)
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
> Whismeril
Messages postés
12369
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
Bonsoir et merci beaucoup de votre aide
Voilà j'ai insérer votre code dans mon projet ;je récupère bien les données unique dans mon fichiers texte ; mais comment puis les récupèrer comme dans ma demande.
En tout cas c'est très sympa de faire partager vos connaissance merci beaucoup

Dim pc As New System.IO.StreamWriter("C:/count/pixelcompter.txt", False)
pc.WriteLine("Begin Count:")
pc.WriteLine()
pc.Close()
Dim img As Bitmap = New Bitmap(PictureBox1.Image)
Dim c As Color
Dim maListe As New List(Of ExempleRoro)()
For i = 0 To img.Width - 1
Dim toppix As Integer = 0
Dim pixlength As Integer = 0
Dim j As Integer
For j = 0 To img.Height - 1
c = img.GetPixel(i, j)
Dim r As Integer = 0
r = Convert.ToInt16(c.R)
Dim g As Integer = 0
g = Convert.ToInt16(c.G)
Dim b As Integer = 0
b = Convert.ToInt16(c.B)
Dim ans As Integer = ((r + (g + b)) / 3)


If (ans > 128) Then
r = 255
g = 255
b = 255
Else
r = 0
g = 0
b = 0
End If
Dim total As Integer = r + g + b
If toppix = 0 Then
If total < 765 Then
toppix = j
pixlength = 1
End If
Else
If total < 765 Then
pixlength += 1
Else

maListe.Add(New ExempleRoro(i, toppix - 1, toppix + pixlength))
toppix = 0
pixlength = 0
End If
End If
Next

Next
Dim maListeAvecCompte As List(Of ExempleRoro) = ExempleRoro.Compter(maListe)
Dim maListeApureeEtTrieeParColonne0 As List(Of ExempleRoro) = ExempleRoro.SansDoublonsCol0(maListeAvecCompte)
For Each element In maListeApureeEtTrieeParColonne0
Dim pce As New System.IO.StreamWriter("C:/count/pixelcompter.txt", True)
pce.WriteLine(element)
pce.Close()
Next

Merci pour tout
Whismeril
Messages postés
12369
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
> cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Tout d'abord, comme je te l'ai écrit plus haut, l'idée est de concentrer tout un thème dans une classe, la partie ou tu lis l'image et fait tes calculs, pourrait être insérée dans la classe, mais ça marche très bien comme ça aussi.
La classe que je t'ai donnée, c'est surtout pour que tu appréhendes l'idée de l'objet, je ne saurais que trop de conseiller de lire avec attention ce cours
http://plasserre.developpez.com/cours/vb-net/?page=introduction#LI

Linq demande un peu d'entrainement, (pour ceux qui ont fait du sql, c'est proche), il faut attention à l'exécution différée
http://blogs.developpeur.org/tom/archive/2007/06/27/linq-l-ex-cution-diff-r-e-des-requ-tes-linq.aspx

Pour ne pas avoir d'effets "de bords" avec ton code, j'ai forcé l'exécution immédiate en castant le résultat en ListOf, avec le ToList()

Par contre ta demande pour prendre un coup le plus grand, un coup le plus petit, ça va complexifier un peut le code.
Pas sûr de le faire en une seule requête, ce qui en soit n'est pas bien grave, un peu de temps d'exécution en plus peut-être.
Whismeril
Messages postés
12369
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
> Whismeril
Messages postés
12369
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
Je n'ai pas trouvé de requête
alors je l'ai fait à l'ancienne
    Public Shared Function SansDoublonsCol0(ByVal Liste As List(Of ExempleRoro)) As List(Of ExempleRoro)

        Dim groupeTrieeParCol0PuisCol1 = Liste.OrderBy(Function(x) x.Colonne0).ThenByDescending(Function(xx) xx.Colonne1).GroupBy(Function(xxx) xxx.Colonne0).ToList()
        'la collection est triée par colO dans l'ordre et col1 en ordre inverse, ainsi le premier enregistrement contient le col1 le plus grand
        'le groupBy génère une collection du type
        'Clé1
        'enregistrement 1 de la clé1
        'enregistrement 2 de la clé1
        '...
        'Clé2
        'enregistrement 1 de la clé2
        'enregistrement 2 de la clé2
        '...

        Dim PlusGrand As Boolean = True
        Dim retour As New List(Of ExempleRoro)()

        For Each item In groupeTrieeParCol0PuisCol1
            If item.Count() = 1 Then
                retour.Add(New ExempleRoro(item.Key, item.First().Colonne1, item.First().Colonne2, item.First().Compte))
            Else
                If PlusGrand Then
                    retour.Add(New ExempleRoro(item.Key, item.First().Colonne1, item.First().Colonne2, item.First().Compte))
                Else
                    retour.Add(New ExempleRoro(item.Key, item.Last().Colonne1, item.Last().Colonne2, item.Last().Compte))
                End If

                PlusGrand = Not PlusGrand
            End If
        Next item

        Return retour
    End Function
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Bonjour et merci beaucoup de votre aide et de votre temps accordé ,
J'ai semble t'il surévaluer mes compétences pour la réalisation d'un tel projet ; merci pour le lien du cours vb net.
Pour le code j'ai inséré votre fonction , çà marche parfaitement à une exception près :
En fin de boucle
extraction brut sans la collection ma liste
(x) (y)
2 // 72 // 76
3 // 70 // 77
4 // 70 // 77
5 // 69 // 78
5 // 122 // 127
6 // 69 // 78
6 // 122 // 128
extraction avec la collection ma liste de départ
(x) (y)
2 // 126 // 130
3 // 128 // 135
4 // 129 // 139
5 // 129 // 140
6 // 130 // 143
6 // 212 // 219
7 // 130 // 14

Là je ne sais pas pour quoi dans une même boucle la valeur (y) change.
Là seule chose que j'ai remarqué est que dans l'extraction "brut" sans la collection ma liste la valeur (y) est prise en partant du haut de mon image ( Ce qui doit être mon cas)
Et que dans l'extraction avec la collection ma liste la valeur (y) est prise en partant du bas de mon image
Je joint le code avec lequel j'ai réaliser les tests

Dim larg As Integer = img.Width
Dim haut As Integer = img.Height
Dim c As Color
Dim maListe As New List(Of ExempleRoro)()
For i = 0 To larg - 1
Dim toppix As Integer = 0
Dim pixlength As Integer = 0
Dim j As Integer
For j = 0 To haut - 1
c = img.GetPixel(i, j)
Dim r As Integer = 0
r = Convert.ToInt16(c.R)
Dim g As Integer = 0
g = Convert.ToInt16(c.G)
Dim b As Integer = 0
b = Convert.ToInt16(c.B)
Dim ans As Integer = ((r + (g + b)) / 3)


If (ans > 128) Then
r = 255
g = 255
b = 255
Else
r = 0
g = 0
b = 0
End If
Dim total As Integer = r + g + b
If toppix = 0 Then
If total < 765 Then
toppix = j
pixlength = 1
End If
Else
If total < 765 Then
pixlength += 1
Else

Dim pce As New System.IO.StreamWriter("C:/count/pixelcompter.txt", True)
pce.WriteLine(" " & i & " " & toppix - 1 & " " & toppix + pixlength)
pce.Close()
maListe.Add(New ExempleRoro(i, toppix - 1, toppix + pixlength))
toppix = 0
pixlength = 0
End If
End If
Next

Next
Dim maListeAvecCompte As List(Of ExempleRoro) = ExempleRoro.Compter(maListe)
Dim maListeApureeEtTrieeParColonne0 As List(Of ExempleRoro) = ExempleRoro.SansDoublonsCol0(maListeAvecCompte)
For Each element In maListe
Dim pce As New System.IO.StreamWriter("C:/count/pixelcount.txt", True)
pce.WriteLine(element)
pce.Close()
Next

Merci de votre avis ; de votre aide et de vos conseil
Commenter la réponse de Whismeril
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
0
Merci
Bonsoir et merci de votre intèret
voici ce qui a été tenté pour récupérer les infos:
'reprise dans la colonne 4 des répétitions

 For i = LBound(Tablo, 2) To UBound(Tablo, 2)
    MonDico(Tablo(0, i)) = MonDico(Tablo(0, i)) + 1
 Next
 For i = LBound(Tablo, 2) To UBound(Tablo, 2)
    Tablo(3, i) = MonDico(Tablo(0, i))
 Next

 'Création Tableau final
 Rep = 0
 Ind = 0
 x = 0
 While Ind < UBound(Tablo, 2)
    If Tablo(3, Ind) = Rep Then
        For i = 0 To 2
            ReDim Preserve tabfin(0 To 2, 0 To x)
            tabfin(i, x) = Tablo(i, Ind + Rep1 - 1) ' et non Ind+Rep1
        Next i
        If Rep1 = 1 Then Rep1 = Rep Else Rep1 = Rep1 - 1
        Ind = Ind + Rep
        x = x + 1
    Else
        Rep = Tablo(3, Ind)
        Rep1 = Rep
    End If
 Wend


Mais en fait je me suis aperçu que ce n'ètait pas sur les répetions qu'il fallait filtrer mais sur l'ensemble de la colonne. Et là j'ai beau chercher je ne trouve vraiment pas.
Après ceci ;si je n'ai pas d'autre piste je mettrai fin à ce projet car un peu trop compliqué pour moi.
En tout cas merci de votre aide et du temps consacré
Commenter la réponse de cs_roro69
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
0
Merci
Salut cs_roro69
le plus dur est de comprendre ce que tu veux faire
Voilà ce que j'ai compris

4 188 193 ' n4 : unique on prend 188
5 188 193 ' n5 : unique on prend 188
6 187 193 ' n6 : unique on prend 187
7 101 116 ' n7 : on prend 186 en colonne 1
7 186 193
8 93 124 ' n8 : on prend 185 car < 186 en colonne 1
8 185 193
9 90 127 ' n9 : on prend 184 car < 185 en colonne 1
9 184 193
10 85 131 ' n10 : on prend 85 car < 184 en colonne 1
10 184 192
11 83 133 ' n11 : on prend 83 car < 85 en colonne 1
11 183 192
12 80 137 ' n12 : on prend 80 car < 83 en colonne 1
12 181 192
13 79 139 ' n13 : on prend 79 car < 80 en colonne 1
13 180 192
14 75 141 ' n14 : on prend 75 car < 79 en colonne 1
14 179 192
15 102 143 ' n15 : on prend 178 car pas de valeur < à 75
-15 178 192
16 72 145 ' n16 : on prend 176 car < 178 en colonne 1
16 176 192
17 71 146 ' n17 : on prend 71 car < 176 en colonne 1
17 176 191

J'ai modifié la ligne avec un tiret pour ce qui suit.
Si à un moment on ne trouve pas dans la série courante une valeur inférieure à celle prise dans la série précédente ( la série avec le n° 15) on prend la valeur la plus haute de la série courante et on continue à la prochaine série et répétant le processus
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Bonsoir merci de votre aide et du temps conscré
Non ce n'est pas comme çà que je souhaites extraire mes données ;il est vrai que j'ai très mal expliquer ma demande; en fait je souhaite alterné plus grand au plus petit
4 188 193 ( unique donc je prend ligne)
5 188 193 ( unique donc je prend ligne)
6 187 193 ( unique donc je prend ligne)
7 101 116
7 186 193 (Là je prend plus grand (colonne1))
8 93 124 (Là je prend plus petit (Colonne1))
8 185 193
9 90 127
9 184 193 (Là je prend plus grand (colonne1))
10 85 131 (Là je prend plus petit (Colonne1))
10 184 192
11 83 133
11 183 192 (Là je prend plus grand (colonne1))
12 80 137 (Là je prend plus petit (Colonne1))
12 181 192
13 79 139
13 180 192 (Là je prend plus grand (colonne1))
14 75 141 (Là je prend plus petit (Colonne1))
14 179 192
15 74 143 ( unique donc je prend ligne)
16 72 145
16 176 192 (Là je prend plus grand (colonne1))
17 71 146 (Là je prend plus petit (Colonne1))
44 4 8
44 43 64
44 108 179 (Là je prend plus grand (colonne1))
45 3 8
45 42 63 (Là je prend intermédiare (colonne1))
45 106 177
46 3 9 (Là je prend plus petit (Colonne1))
46 41 61
46 102 175
47 4 10
47 41 60 (Là je prend intermédiare (colonne1))
47 100 176
48 5 11
48 40 59
48 97 177 (Là je prend intermédiaire (colonne1))
48 100 176
49 40 58
49 95 177 (Là je prend plus grand (colonne1))
50 5 14 (Là je prend plus petit (Colonne1))
50 39 57
50 91 178
51 6 14
51 39 56 (Là je prend intermédiare (colonne1))
51 89 161
51 89 161
51 161 178
52 7 16
52 38 55
52 84 157 (Là je prend intermédiare (colonne1))
52 162 179
53 7 18
53 37 54
53 82 155
53 162 179 (Là je prend plus grand (colonne1))
54 7 20 (Là je prend plus petit (Colonne1))
54 37 53
54 77 151
54 164 180
55 8 22
55 37 52 (Là je prend intermédiare (colonne1))
55 75 149
55 164 180
56 9 25
56 36 51
56 69 145 (Là je prend intermédiare (colonne1))
56 166 181
57 9 27 Unique
58 61 139
58 167 182 (Là je prend plus grand (colonne1))

Un peu compliqué je suis désolé ;;;
Commenter la réponse de vb95
Messages postés
3241
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 novembre 2018
0
Merci
Bonjour

Je récupère les hauteurs de bande de couleur (départ=>arrivée) de chaque colonne dans un tableau comme le tableau ci-dessous : çà j'y suis arrivé

Peux tu montrer ton code ?
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Bonsoir et merci de votre aide et du temps consacré

--Donc voici le code pour récupérer les valeurs départ arrivée:

Dim pc As New System.IO.StreamWriter("C:/Compter/pixelcompter.txt", False)
pc.WriteLine("Begin Count:")
pc.WriteLine()
pc.Close()
Dim img As Bitmap = New Bitmap(PictureBox1.Image)
Dim c As Color

For i = 0 To img.Width - 1
Dim toppix As Integer = 0
Dim pixlength As Integer = 0
Dim j As Integer
For j = 0 To img.Height - 1
c = img.GetPixel(i, j)
Dim r As Integer = 0
r = Convert.ToInt16(c.R)
Dim g As Integer = 0
g = Convert.ToInt16(c.G)
Dim b As Integer = 0
b = Convert.ToInt16(c.B)
Dim ans As Integer = ((r + (g + b)) / 3)


If (ans > 128) Then
r = 255
g = 255
b = 255
Else
r = 0
g = 0
b = 0
End If
Dim total As Integer = r + g + b
If toppix = 0 Then
If total < 765 Then
toppix = j
pixlength = 1
End If
Else
If total < 765 Then
pixlength += 1
Else
Dim pcr As New System.IO.StreamWriter("C:/Compter/pixelcompter.txt", True)
pcr.WriteLine(" " & i & " " & toppix - 1 & " " & toppix + pixlength)
pcr.WriteLine()
pcr.Close()

toppix = 0
pixlength = 0
End If
End If
Next

Next
cs_ShayW
Messages postés
3241
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 novembre 2018
> cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Pourquoi écris tu dans un fichier txt et après tu dois encore lire le fichier et traiter les données

au lieu de
Dim pcr As New System.IO.StreamWriter("C:/Compter/pixelcompter.txt", True)
pcr.WriteLine(" " & i & " " & toppix - 1 & " " & toppix + pixlength)
pcr.WriteLine()
pcr.Close()


traite les données selon tes besoins au fur et mesure
dans la boucle tu as

i , toppix - 1 , toppix + pixlength

d'abord je n'ai pas compris

4 188 193 ( unique donc je prend ligne)

7 101 116
7 186 193 (Là je prend plus grand (colonne1))
8 93 124 (Là je prend plus petit (Colonne1))
8 185 193
Commenter la réponse de cs_ShayW
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
0
Merci
salut cs_roro69

Regarde ce que donne ce code
sur une Form tu mets
- ta PictureBox1
- 3 Listbox (1 , 2 et 3 ) côte-côte et de même dimension
- un bouton Button1 pour lancer le processus

Les listboxs vont afficher les valeurs des 3 colonnes
On a compris pour prendre le plus haut et le plus bas
Problème : pourquoi prend-on à certains endroits les valeurs intermédiaires ?
Essaies d'expliquer avec l'exemple que tu as donné ( voir ci-dessous) en te servant des valeurs des colonnes pour qu'on comprenne ! Merci

15 74 143 ( unique donc je prend ligne)
16 72 145
16 176 192 (Là je prend plus grand que 74(colonne1))
17 71 146 (Là je prend plus petit (Colonne1)) voir remarque
44 4 8
44 43 64
44 108 179 (Là je prend plus grand (colonne1))
45 3 8
45 42 63 (Là je prend intermédiare) pourquoi pas 106 ?
45 106 177
46 3 9 (Là je prend plus petit (Colonne1))
46 41 61
46 102 175
47 4 10
47 41 60 (Là je prend intermédiare) pourquoi pas 100 ?
47 100 176
48 5 11
48 40 59
48 97 177 (Là je prend intermédiaire (colonne1))
48 100 176
49 40 58
49 95 177 (Là je prend plus grand (colonne1))
50 5 14 (Là je prend plus petit (Colonne1))
50 39 57
50 91 178


de plus cette ligne est unique
17 71 146 (Là je prend plus petit (Colonne1))
donc là je prends la ligne ! Ok mais ensuite c'est plus petit ou plus grand qu'il faut prendre ?

Public Class Form1

Private Structure Structcolonne
Dim col0 As Integer
Dim col1 As Integer
Dim col2 As Integer
End Structure

Private listecols As New List(Of Structcolonne)
Private listecol As Structcolonne

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim img As Bitmap = New Bitmap(PictureBox1.Image)
Dim c As Color, r As Integer, g As Integer, b As Integer
Dim toppix As Integer, pixlength As Integer, total As Integer, ans As Integer

For i = 0 To img.Width - 1
toppix = 0
pixlength = 0
For j = 0 To img.Height - 1
c = img.GetPixel(i, j)
r = Convert.ToInt32(c.R)
g = Convert.ToInt32(c.G)
b = Convert.ToInt32(c.B)
ans = (r + g + b) \ 3
If (ans > 127) Then
r = 255 : g = 255 : b = 255
Else
r = 0 : g = 0 : b = 0
End If
total = r + g + b
If toppix = 0 Then
If total < 765 Then
toppix = j
pixlength = 1
End If
Else
If total < 765 Then
pixlength += 1
Else
With listecol
.col0 = i
.col1 = toppix - 1
.col2 = toppix + pixlength
End With
listecols.Add(listecol)
toppix = 0
pixlength = 0
End If
End If
Next
Next
For i = 0 To listecols.Count - 1
With listecols(i)
ListBox1.Items.Add(.col0.ToString)
ListBox2.Items.Add(.col1.ToString)
ListBox3.Items.Add(.col2.ToString)
End With
Next

End Sub

End Class

Commenter la réponse de vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
0
Merci
Autre chose

Lorsque pour la colonne 1 il y a plusieurs fois le même nombre on prend le plus petit ou le plus grand de cette série ! C'est bien cela ?

4 188 193 ( unique donc je prend ligne)
5 188 193 ( unique donc je prend ligne)
6 187 193 ( unique donc je prend ligne)
7 101 116
7 186 193 (Là le plus grand parmi la série des 7
8 93 124 (Là le plus petit parmi la série des 8)
8 185 193
9 90 127
9 184 193 (Là le plus grand parmi la série des 9)
intermédiaire ????????
10 85 131 (Là le plus petit parmi la série de 10)
10 184 192
etc........

si un intermédiaire était placé entre 9 et 10 cela ne change pas la suite une fois sur 2 plus petit plus grand ?
Pourquoi des intermédiaires et sur quoi te bases-tu pour les déterminer ?

Le truc est très facile à faire mais il faut comprendre le mécanisme exact
Commenter la réponse de vb95
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
0
Merci
Bonsoir et merci pour votre aide et vos conseils
Je vais tenté de reformuler depuis le début donc :
Mon projet et de réaliser une toute petite application pour automatiser la réalisation de patron de livre plié comme montré dans l'exemple sur ce site :
http://www.faitmain-faitcoeur.fr/en-papier/tuto-livre-plie-ecriture/

Donc pour ce faire :
1) Je charge une photo dans une pictureBox (Image brut)
2) Je récupère les départ et arrivée (d'une couleur) de chaque colonne de toute l'image
3)Donc ensuite comme expliqué dans le `''tuto ci-dessus'''' chaque colonne représente une feuille qu'il faut plié.(Donc chaque colonne doit être unique)
4) Donc si colonne unique on garde ainsi
5) Si colonne répété 2 fois alors :

- une colonne réalise la partie haute, (Valeur de départ la plus élevé)
- la colonne suivante réalise la partie basse, (Valeur de départ la plus petite)
- la colonne suivante réalise la partie haute (Valeur de départ la plus élevé)
- la colonne suivante réalise la partie basse(Valeur de départ la plus petite) ....... et ainsi de suite, jusqu'à retrouver des colonnes complètes(Unique) ou des colonne répété deux fois

6)Si colonne répeté 3 fois alors
- une colonne réalise la partie haute, (Valeur de départ la plus élevé)
- la colonne suivante réalise la partie milieu,(Valeur de départ entre la plus élevé et la plus petite )
- la colonne suivante réalise la partie basse (Valeur de départ la plus petite)
- la colonne suivante réalise la partie haute(Valeur de départ la plus haute)
- la colonne suivante réalise la partie milieu,(Valeur de départ entre la plus élevé et la plus petite )
- la colonne suivante réalise la partie basse (Valeur de départ la plus petite)
....... et ainsi de suite, jusqu'à retrouver des colonnes complètes(Unique) ou des colonne répété deux ,trois ; quatre ,cinq fois .

7)Si colonne répété 4 fois ou + alors :
--Même principe que les colonnes répété 3 fois en ajoutant deux partie milieu,(Valeur de départ entre la plus élevé et la plus petite )

Je suis désolé de ne pas pouvoir mieux expliquer ma demande
Merci de votre temps consacré et de votre aide
Commenter la réponse de cs_roro69
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
2) Je récupère les départ et arrivée (d'une couleur) de chaque colonne de toute l'image

Je ne comprends pas.
De quelle couleur ?
Montre ce code de "récupération". Il nous permettra peut-être (?) de comprendre ce que tu veux dire ..
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
Messages postés
3241
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 novembre 2018
0
Merci
1 efface ces lignes
pc.WriteLine("Begin Count:")
pc.WriteLine()
pc.Close()
et dans la boucle
pc.WriteLine()



Private listnum As New List(Of List(Of Int32))
'la liste des résultats
Private listresult As New List(Of List(Of Int32))
Private list1 As New List(Of String)

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
'on lit ton fichier pixelcompter.txt et on le décompose
GetList()
DataProcess()
End Sub
Private Sub GetList()
list1 = IO.File.ReadAllLines("C:/Compter/pixelcompter.txt").ToList
Dim numbers As List(Of Int32)
Dim vect() As String
For Each item In list1
vect = item.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)
numbers = New List(Of Int32)
For Each num In vect
numbers.Add(Convert.ToInt32(num))
Next
listnum.Add(numbers)
Next
End Sub
Private Sub DataProcess()
' selon ton algo
' En colonne 0 : un numéro unique ou répété
'Donc en partant du départ du tableau colonne "0":
'Si le numéro est unique alors je récupère la ligne
'autrement Si le numéro est répété alors
'je récupères qu'une seule ligne des numéro répété avec comme 'condition:
'à la première ligne de la colonne "0" si le numéro est répété 'alors
'je prends la valeur la plus haute de la colonne "1" et je conserve 'donc cette ligne.
'Ensuite je continu et dans la série d'après quelque soit le 'nombre de répetition je prend la valeur inférieur à celle d'avant .
'Lorsque j'arrive à la valeur la plus petite ; je redémarre avec une 'valeur la plus haute
'jusqu'à arrivé à un numéro unique
Dim flaghighest As Boolean = True
Dim data As New List(Of Int32)
Dim lastindex As Int32
lastindex = listnum(0)(0)
listresult.Add(listnum(0))
For iter = 1 To listnum.Count - 1
If listnum(iter)(0) <> lastindex Then
'index unique
listresult.Add(listnum(iter))
lastindex = listnum(iter)(0)
ElseIf flaghighest Then
'get highest value
If listnum(iter)(1) > listnum(iter - 1)(1) Then
listresult.RemoveAt(listresult.Count - 1)
listresult.Add(listnum(iter))
End If
lastindex = listnum(iter)(0)
flaghighest = False
Else
'get lowest value
If listnum(iter)(1) < listnum(iter - 1)(1) Then
listresult.RemoveAt(listresult.Count - 1)
listresult.Add(listnum(iter))
End If
lastindex = listnum(iter)(0)
flaghighest = True
End If
Next

End Sub


End Class
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Bonsoir et merci beaucoup
J'ai testé votre code ; rien ne se passe dans le fichier texte
Merci de votre aide et du temps consacré
cs_ShayW
Messages postés
3241
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 novembre 2018
> cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
J'ai testé votre code ; rien ne se passe dans le fichier texte
le résultat n'est pas dans le fichier texte
je ne sais ce que tu as testé
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Bonsoir
Oups vraiment désolé ;de ma réponse ;
veuillez m'excuser .
Je testerai le code demain là c'est direction boulot
Bonne soirée et vraiment merci de votre aide et du temps consacré
Commenter la réponse de cs_ShayW
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
0
Merci
J'ai été sur le site par curiosité et je commence à comprendre
Dans ton tableau d'origine tu as les colonnes d'une image
Chaque colonne peut contenir 1 bloc ou 2 blocs ou plus avec à chaque fois le point de départ de la couleur et son point d'arrivée

- si il n'y a qu'un bloc on prend la ligne ( cela correspond à une colonne pleine sur l'image)
- si il y a 2 blocs on prend alternativement le haut pour le bloc courant et le bas du bloc suivant : c'est à dire que les 2 colonnes de l'image sont représentées qu'à moitié ( la première est le haut et la seconde est le bas)
-si il y a 3 blocs on prend le haut pour le bloc courant , l'intermédiaire du bloc suivant et le bas du bloc qui suit le précédent

Et encore je dis cela mais sans aucune certitude
C'est bien des Japonais avec leur origami pour inventer un truc aussi compliqué !
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Bonsoir et merci beaucoup
C'est exactement çà
Merci du temps accordé et de l'aide apporté
Commenter la réponse de vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
0
Merci
Continuons dans notre compréhension
Dans le tableau qui suit C sont les colonnes de l'image et le chiffre accolé au C le nombre de blocs départ-arrivée

Ligne = je prends la ligne
+ = je prends la valeur la plus élevée
- = je prends la valeur la moins elevée


C1 ligne
C1 ligne
C2 +
C2 -
C2 +
C2 -
C3 +
??????? on fait quoi là : on prend la valeur intermédiaire de la colonne suivante et la valeur la plus petite de la colonne suivant la précédente

Cela signifie aussi que dans le tableau d'origine une colonne image unique n'a qu'une ligne
Une colonne image doublée à 4 lignes (on prend la plus elevée du bloc de 2 puis la plus basse du bloc de 2 qui suit)
Une colonne image triplée à 9 lignes ( on prend plus élevé puis intermédiaire puis la plus basse en se déplaçant à chaque fois d'un bloc)
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Bonsoir
c'est exactement ce principe
Dans mon premier commentaire çà équivaut au ligne souligné.
Merci beaucoup pour ton aide et de ta patience
Commenter la réponse de vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
0
Merci
Resalut cs_roro69
Dis moi si j'ai raison

Tu as dit :

En colonne 0 : un numéro unique ou répété
Donc en partant du départ du tableau colonne "0":
Si le numéro est unique alors
je récupère la ligne
autrement
Si le numéro est répété alors
je récupères qu'une seule ligne des numéro répété avec comme condition:
à la première ligne de la colonne "0" si le numéro est répété alors
je prends la valeur la plus haute de la colonne "1" et je conserve donc cette ligne.
Ensuite je continu et dans la série d'après quelque soit le nombre de répetition je prend la valeur inférieur à celle d'avant .
Lorsque j'arrive à la valeur la plus petite ; je redémarre avec une valeur la plus haute
jusqu'à arrivé à un numéro unique
comme ceci jusqu'à la fin du tableau.

Ce que je crois comprendre

1) ligne unique : on prend la ligne

2) ligne répété :on prend le plus haut
3) ligne suivante : on prend inférieur mais le plus proche du précédent
4) ligne suivante : on prend inférieur mais le plus proche du précédent
5) ligne suivante : on prend inférieur mais le plus proche du précédent et là mince il n'y a pas de valeur inférieure : donc on prend la valeur la plus élevée et on retourne au point 3

Si entre les points 3 et 5 on trouve une ligne unique on va au point 1 et ensuite on va au point 2 si le ligne qui arrive est répétée
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Bonjour
Je te remercie vraiment de ta patience
Tu as résumé en quelque phrases exactement ce que je souhaitais.
Pour la fin du tableau erreur de ma part je ne conserve que celle ci:
58 167 182 ++
En tout cas oui je pense qu'il faut être vraiment tétu (lol)
Et merci encore pour tout le temps que tu m'accordes
vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
> cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Salut cs_roro69

tu as oublié un ++ à 52 84 157

Je crois avoir trouvé ton bonheur !
Peux-tu m'envoyer un message perso avec ton adresse mail
A moins que tu veuilles que je le mette sur le site
C'est sérieux comme proposition
Je t'ai fait un petit programme avec une listview pour vérification

A +
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Re
Voici mon adresse mail
Supprimée
Je te remerci
vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
> cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
salut cs_roro69
évites de mettre ton adresse mail directement sur le site
Envoie plutôt un message perso comme tu as fait ! ainsi seul cette personne a ton adresse mail
dis-moi si cela est satisfaisant si tu veux que je le mette sur le site
cs_roro69
Messages postés
70
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
29 septembre 2018
-
Bonsoir
Merci c'est exactement çà
Tu est presque un peu japonais je vois LOL
Je remercie tout ceux qui ont participé à cette discussion et qui m'ont donné de leur temps et de leur patience
Commenter la réponse de vb95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.