bonjour![]()
je voulais savoir s'il était possible de modifier une image et particulierement de la découper sous VB.
merci
salut
bonjour![]()
je voulais savoir s'il était possible de modifier une image et particulierement de la découper sous VB.
merci
salut
Pour decouper une image comme tu dis il faut ouvrir le fichier et faire une fonction capable de le lire. Il te faut donc savoir comment sont enregistrés les fichiers bitmap. Le fonctionnement et assez simple.
Faire une fonction cappable de le lire? précisons ou exemple please (par contre, je sais comment les enregistrer)Envoyé par avigeilpro
Voici un sub qui permet de lire les valeurs des composantes de tous les pixels d'une image bmp 24bit:
Pour les images N&B le fonctionnement est plus simple : les pixels (toujours lus du bas vers le haut en ligne) sont groupés par 8 (si il n'y en a pa assez par exemple en fin de ligne on considère qu'ils existent et qu'ils sont blancs) ce qui forme un octet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 Public Sub OpenBMPFile(FileAdr As String) Dim Boucle As Single 'variable de boucle Dim Largeur As Single 'largeure de l'image Dim Longueure As Single 'longueure de l'image Dim VarByte As Byte 'Varriable temporaire, recupère les octets Dim NbBytes As Single 'nombre total d'octets Open FileAdr For Binary As #1 'ouvre le fichier Get #1, 19, VarByte 'recupère la premiere partie de la largeure Largeur = VarByte Get #1, 20, VarByte 'recupère la seconde partie Largeur = Largeur + VarByte * 256 Get #1, 23, VarByte Longueure = VarByte Get #1, 24, VarByte Longueure = Longueure + VarByte * 256 'a chaque fin de ligne est rajouté un pixel blanc non visible 'nombre total de pixels : longueure * (largeur+1) ' 3 octets par pixel NbBytes = 3 * Longueure * (Largeur + 1) + 54 'on peu soustraire 3 car le dernier pixel est un pixel de fin de ligne non visible (+ 51 au lieu de + 54) For Boucle = 55 To NbBytes Get #1, Boucle, VarByte ' VarByte va prendre successivement les composantes ' bleu vert et rouge de tous les pixels ' les pixels sont lus en ligne du BAS VERS LE HAUT DE L'IMAGE. Next Close #1 End Sub
exemple : l'octet 181 (&hB5) équivaut en binaire 10110101 signifie:
dans le groupe de huit pixels, le premier est blanc, le second est noir, ....
A toi de l'exploiter si c'est ce que tu cherche.![]()
merci beaucoup.
y a t'il moyen de faire la transformation dans l'autre sens?
merci
non, ça je sais le faire.
je veux savoir si apres avoir modifié le code de l'image je peux la retransformer en picture dans la picturebox?
Au fait, j'arrive pas à mettre ton code dans une text box, pourtant, çal me semble corect:
merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Private Sub Form_Load() Call OpenBMPFile("C:\ Sa.bmp") Text1.Text = FileAdr End Sub
et aussi, à partir du moment ou on l'a en version texte, on peut le modifier avec couleur... (g pas trop compris)
merci d'avance
tu as mal compris le sub.
Je t'explique:
déja pour l'appeler tu fais:
de plus le sub n'est pas complet, loin de la. il te reste toute la partie interpretation des composantes a faire. De facon plus explicite DANS le sub tu dois ajouter ton code qui traitera l'images ou qui, si tu le souhaite sauvegardera les valeures des composantes de tous les pixels. Je pense que tu ne t'es pas amusé a lire le sub car tu aurai compris, j'y ai tout documenté. Tu doi traiter la variable VarByte se trouvant dans la boucle a la fin du sub car celle actuellement ne fait que "pointer" les differentes composantes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Public Sub Command1_Click() OpenBmpFile("C:\Sa.bmp") End Sub
petit exemple:
tu decide de n'avoir que des composantes égales à 0 ou 255 il te faut rajouter le code suivant sous la fonction Get de la boucle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 If VarByte<128 then VarByte = 0 Else VarByte=255 'arrondie l'octet Put #1,Boucle,VarByte 'le réinscrit a son emplacement
De plus FileAdr est une variable locale et n'est donc accessible que dans le sub.
excuse moi aveilpro, je suis peut-être un crétin mais j'arrive pas à voir l'effet de ta variable.
en effet: 1- est-il possible de voir le code en octet de l'image.?
2- peut-on dans le cas contraire voire son effet?
merci
alors je reexplique:
oui il est possible de voir le code en octet de l'image: tu créer une variable dès le début de ton projet en Public par exemple et tu rajoute dans la boucle juste en dessous de la fonction Get la sauvegarde des octets:
maintenant tu peu très bien declarer la fonction ainsi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Option Explicit Public ImgSauv As String Public sub Command1_Click() OpenBmpFile("C:\Im.bmp") Text1.Text = ImgSauv End Sub Public Sub OpenBMPFile(FileAdr As String) ... ... ... ImgSauv = "" 'efface la variable For ... Get #1, Boucle, VarByte 'ca c'est deja mis ImgSauv = ImgSauv & Str(VarByte) & " " Next Boucle
Sauver les valeur comme ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Public function OpenBMPFile(FileAdr As String) as String
et afficher le contenu de l'image en octet dans une boite texte de cette manière:
Code : Sélectionner tout - Visualiser dans une fenêtre à part OpenBmpFile = OpenBmpFile & Str(VarByte) & " "
Pour renseignement la variable FileAdr est une variable locale permettant de récupérer l'argument que tu fournit au sub (c'est a dire l'adresse de ton images). tu n'en a donc aucune utilité en dehors du sub.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Text1.Text=OpenBMPFile(C:\IM.bmp)
ATTENTION : n'oubli pas que chaque pixel est "composé" de 3 octets et que ce sub n'est valable que pour les Bmp 24bits.
PS: je ne me permetrai en aucun cas de te traiter de cretin mai si tu pouvai essayer de lire tou ce que je met (meme dans le code) tu comprendrai peut-être mieu ce que j'essaye de te montrer. la fonction que j'ai donnée au debut n'étai en faite qu'une fonction capable de "pointer" les octet des composantes sans jamais rien en faire.
Amicalement.
bon courage![]()
ha ben ça explique pas mal de choses: j'utilisait un 16 bits![]()
c'est parfait je vais tester ça.![]()
(au fait j'ai pas dit ça par susceptibilité)
merci encore![]()
désolé, j'arrive pas à afficher le texte.
voici mon code:et mon texte est: "0"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 Private Sub Command1_Click() OpenBMPFile ("Sac.bmp") Text1.Text = OpenBMPFile("C:\sac.bmp") End Sub Public Function OpenBMPFile(FileAdr As String) As String Dim Boucle As Single 'variable de boucle Dim Largeur As Single 'largeure de l'image Dim Longueure As Single 'longueure de l'image Dim VarByte As Byte 'Varriable temporaire, recupère les octets Dim NbBytes As Single 'nombre total d'octets Open FileAdr For Binary As #1 'ouvre le fichier Get #1, 19, VarByte 'recupère la premiere partie de la largeure Largeur = VarByte Get #1, 20, VarByte 'recupère la seconde partie Largeur = Largeur + VarByte * 256 Get #1, 23, VarByte Longueure = VarByte Get #1, 24, VarByte Longueure = Longueure + VarByte * 256 'a chaque fin de ligne est rajouté un pixel blanc non visible 'nombre total de pixels : longueure * (largeur+1) ' 3 octets par pixel NbBytes = 3 * Longueure * (Largeur + 1) + 54 'on peu soustraire 3 car le dernier pixel est un pixel de fin de ligne non visible (+ 51 au lieu de + 54) ImgSauv = "" 'efface la variable For Boucle = 55 To NbBytes Get #1, Boucle, VarByte ImgSauv = ImgSauv & Str(VarByte) & " " Put #1, Boucle, VarByte 'le réinscrit a son emplacement ' VarByte va prendre successivement les composantes ' bleu vert et rouge de tous les pixels ' les pixels sont lus en ligne du BAS VERS LE HAUT DE L'IMAGE. Next Close #1 OpenBMPFile = OpenBMPFile & Str(VarByte) & " " End Function
désolé, je pige rien (pourtant, j'ai relu 10 fois ta variable.
merci d'avance
tu n'a toujours pas compris le fonctionnement du sub:
appel du sub tel que tu l'a déclaré:
Étant donné que tu l'utilise en temp que fonction tu n'a aucune utilisté a utiliser une variable supplémentaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub Command1_Click() Text1.Text = OpenBMPFile("C:\sac.bmp") End Sub
Il existait deux moyen de sauvegarder les octets:
premier moyen:
tu déclare le sub ainsi:
tu l'appel et tu l'affiche comme ca:
Code : Sélectionner tout - Visualiser dans une fenêtre à part Public Sub OpenBMPFile(FileAdr As String)
tu n'oubli pas de dimensionner une variable (exemple ImgSauv) et la sauvegarde se fait par la ligne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub Command1_Click() OpenBMPFile ("Sac.bmp") Text1.Text = ImgSauve End Sub
ce qui te donne pour la fin du sub:
Code : Sélectionner tout - Visualiser dans une fenêtre à part ImgSauv = ImgSauv & Str(VarByte) & " "
OU Deuxieme moyen
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 ... ... NbBytes = 3 * Longueure * (Largeur + 1) + 54 'on peu soustraire 3 car le dernier pixel est un pixel de fin de ligne non visible (+ 51 au lieu de + 54) ImgSauv = "" 'efface la variable For Boucle = 55 To NbBytes Get #1, Boucle, VarByte ImgSauv = ImgSauv & Str(VarByte) & " " '*********************** 'Inutile car tu n'a rien a sauvegarder tu ne fait que lire. 'Put #1, Boucle, VarByte 'le réinscrit a son emplacement '*********************** ' VarByte va prendre successivement les composantes ' bleu vert et rouge de tous les pixels ' les pixels sont lus en ligne du BAS VERS LE HAUT DE L'IMAGE. Next Close #1 End Sub
tu declare la fonction ainsi:
ici il est inutile de declarer une variable ce qui te donne pour la fin de la fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part Public Function OpenBMPFile(FileAdr As String) As String
tu l'appel et tu l'affiche comme ca:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 ... ... NbBytes = 3 * Longueure * (Largeur + 1) + 54 'on peu soustraire 3 car le dernier pixel est un pixel de fin de ligne non visible (+ 51 au lieu de + 54) For Boucle = 55 To NbBytes Get #1, Boucle, VarByte OpenBMPFile = OpenBMPFile & Str(VarByte) & " " '*********************** 'Inutile car tu n'a rien a sauvegarder tu ne fait que lire. 'Put #1, Boucle, VarByte 'le réinscrit a son emplacement '*********************** ' VarByte va prendre successivement les composantes ' bleu vert et rouge de tous les pixels ' les pixels sont lus en ligne du BAS VERS LE HAUT DE L'IMAGE. Next Close #1 End Function
N'utilise qu'une seule des solutions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Private Sub Command1_Click() Text1.Text = OpenBMPFile ("Sac.bmp") End Sub
Je suis désolé mais meme avec ce code:![]()
1-Il ne m'affiche aucun code dans le textbox
2-Il enregistre automatiquement les images mais elles n'on comme seul points commun avec l'original que le nom. (elles onts la meme tailles et son blanches)
bref ça ne marche pas.
je te retransmet le code mais je l'ai toujours pas compris.et dans le module
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Sub Command1_Click() OpenBMPFile ("c:\Sans titre.bmp") Text1.Text = ImgSauve End Sub Private Sub Form_Load() OpenBMPFile ("c:\Sans titre.bmp") End Submerci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 Public Sub OpenBMPFile(FileAdr As String) Dim Boucle As Single 'variable de boucle Dim Largeur As Single 'largeure de l'image Dim Longueure As Single 'longueure de l'image Dim VarByte As Byte 'Varriable temporaire, recupère les octets Dim NbBytes As Single 'nombre total d'octets Open FileAdr For Binary As #1 'ouvre le fichier Get #1, 19, VarByte 'recupère la premiere partie de la largeure Largeur = VarByte Get #1, 20, VarByte 'recupère la seconde partie Largeur = Largeur + VarByte * 256 Get #1, 23, VarByte Longueure = VarByte Get #1, 24, VarByte Longueure = Longueure + VarByte * 256 ImgSauv = ImgSauv & Str(VarByte) & " " 'a chaque fin de ligne est rajouté un pixel blanc non visible 'nombre total de pixels : longueure * (largeur+1) ' 3 octets par pixel NbBytes = 3 * Longueure * (Largeur + 1) + 54 'on peu soustraire 3 car le dernier pixel est un pixel de fin de ligne non visible (+ 51 au lieu de + 54) ImgSauv = "" 'efface la variable For Boucle = 55 To NbBytes Get #1, Boucle, VarByte ImgSauv = ImgSauv & Str(VarByte) & " " '*********************** 'Inutile car tu n'a rien a sauvegarder tu ne fait que lire. 'Put #1, Boucle, VarByte 'le réinscrit a son emplacement '*********************** ' VarByte va prendre successivement les composantes ' bleu vert et rouge de tous les pixels ' les pixels sont lus en ligne du BAS VERS LE HAUT DE L'IMAGE. Next Close #1 End Sub
voici exactement le contenu pour que cela marche. Attention il n'y a pas de "e" a ImgSauv, il suffit de lancer le sub une seule fois.
J'e t'ai documenté chacune des lignes donc lit les et tu comprendra le fonctionnement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 Option Explicit Dim ImgSauv As String 'variable dans laquelle seront logées les composantes Private Sub Command1_Click() OpenBMPFile ("c:\Sans titre.bmp") 'charge les composantes dans ImgSauv Text1.Text = ImgSauv 'affiche ImgSauv End Sub Public Sub OpenBMPFile(FileAdr As String) Dim Boucle As Single 'variable de boucle Dim Largeur As Single 'largeure de l'image Dim Longueure As Single 'longueure de l'image Dim VarByte As Byte 'Varriable temporaire, recupère les octets Dim NbBytes As Single 'nombre total d'octets Open FileAdr For Binary As #1 'ouvre le fichier 'la largeure peut etre supérieure a 255 c.a.d en hexa >hFF si c'est le cas l'octet de _ poid fort (h3F par exemple pour une largeure de 16213 soit h3F55 en hexa) se trouve a _ l'adresse 20 alors que l'octet de poid faible h55 se trouve en 19 'le calcul est simple : 'h3F = 63 'h55 = 85 '63 * 256 + 85 = 16213 Get #1, 19, VarByte 'recupère la premiere partie de la largeure (poids faible) Largeur = VarByte Get #1, 20, VarByte 'recupère la seconde partie (poids fort) Largeur = Largeur + VarByte * 256 'de meme pour la longueure (ou hauteur) aux adresse 23 et 24 Get #1, 23, VarByte Longueure = VarByte Get #1, 24, VarByte Longueure = Longueure + VarByte * 256 'a chaque fin de ligne est rajouté un pixel blanc non visible 'nombre total de pixels : longueure * (largeur+1) ' 3 octets par pixel NbBytes = 3 * Longueure * (Largeur + 1) + 54 'on peu soustraire 3 car le dernier pixel est un pixel de fin de ligne non visible _ (+ 51 au lieu de + 54) donc inutile a lire ImgSauv = "" 'efface la variable For Boucle = 55 To NbBytes 'boucle du premier octet du premier pixel _ jusqu'au dernier octet du dernier pixel Get #1, Boucle, VarByte 'récupère la valeur de la composante ImgSauv = ImgSauv & Str(VarByte) & " " 'la memorise dans la variable '*********************** 'Inutile car tu n'a rien a sauvegarder tu ne fait que lire. 'Put #1, Boucle, VarByte 'le réinscrit a son emplacement '*********************** ' VarByte va prendre successivement les composantes ' bleu vert et rouge de tous les pixels ' les pixels sont lus en ligne du BAS VERS LE HAUT DE L'IMAGE. Next Close #1 'ferme le fichier End Sub
ha OK.
en fait, j'avais fini par commencer à piger mais j'avais cru que imgsauv était défini dans ta varible.
bon je vais tester ça.
merci encore et excuse-moi pour les cheuveux que tu as dû t'arracher devant mon incompétence.
salut
EDIT: ça marche impec.
Je viens de me rendre compte d'une erreur : Il n'y a pas 1 pixel suplémentaire par ligne (ce qui ferait 3 octets) il n'y a que 2 octets par ligne.
De plus voici 2 petites fonction permettant l'une de récupérer les composantes d'un pixel en connaissant ses coordonnées et l'autre de definir un pixel. (origine du repère en haut a gauche de coordonnées 0,0 )
ATTENTION tu doit IMPERATIVEMENT avoir declaré les variable Largeur et Longueure de facon a ce que toutes les fonction puisse y accéder, les avoir fait calculer avant de lancer l'une ou l'autre fonction ET avoir ouvert le fichier ( Open ..... as #1)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Public Function GetPix(PixelX As Single, PixelY As Single) As String PixelY = Longueure - PixelY NumByte = 55 + (PixelY * Largeur + PixelX) * 3 + 2 * PixelY Get #1, NumByte, VarByte GetPix = VarByte Get #1, NumByte, VarByte GetPix = VarByte & ";" & GetPix Get #1, NumByte, VarByte GetPix = VarByte & ";" & GetPix End Function Public Sub SetPix(PixelX As Single, PixelY As Single, RCompo As Byte, GCompo As Byte, Bcompo As Byte) PixelY = Longueure - PixelY NumByte = 55 + (PixelY * Largeur + PixelX) * 3 + 2 * PixelY Put #1, NumByte, Bcompo Put #1, NumByte + 1, GCompo Put #1, NumByte + 2, RCompo End Sub
Le fonctionnement est simple: pour definir un pixel on fait:
definira le pixel en haut a gauche(0,0) en blanc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SetPix 0,0,255,255,255
renverra les couleures RGB dans l'ordre séparées par un ";" du pixel en haut a gauche (0,0)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim MonPixel As String MonPixel = GetPix(0,0)
heu, et ellle fait quoi ton erreur?
sinon, pour largeur et hauteur, ça va m'arranger vu que j'avais du mal avec une ligne continue.
aufait, est il possible de suprimer une ligne ou une colone à gauche?
merci
Partager