Modifier le contraste sans get et set pixel?

Résolu
cs_Kariar Messages postés 20 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 24 mai 2007 - 16 avril 2007 à 16:46
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 17 avril 2007 à 14:37
Bonjour,
Je cherche à changer le contraste de figures (créées avec les
fonctions line et ellipse) contenues dans une form..

J'ai utiliser les fonctions getpixel et setpixel (cf PS) mais je rame
beaucoup trop!

Comment est ce que je peux modifier le contraste de ces élements sans
les fontion get et Set pixel ????

Cordiallement,
Kariar apprenti en VB

PS: voici la partie du code issue d'un exe sur le contraste que
j'utilisais en remplacant la picture par la form

Private Sub CmdContrast_Click()
   'variables for contrast, color calculation, positioning
    Dim Contrast As Integer
    Dim NewColor As Long
    Dim x As Integer, y As Integer
    Dim r As Integer, g As Integer, b As Integer
    Contrast = Val(TxtContrast)
  
     'run a loop through the picture to change every pixel
    For x = 0 To Picture1.ScaleWidth
    For y = 0 To Picture1.ScaleHeight

        'get the current color value
        NewColor = GetPixel(Picture1.hDC, x, y)

        'extract the R,G,B values from the long returned by GetPixel
        r = ExtractR(NewColor)
        g = ExtractG(NewColor)
        b = ExtractB(NewColor)

        'change the RGB settings to their appropriate contrast
        r = r + (((r - 127) * Contrast) \ 100)
        g = g + (((g - 127) * Contrast) \ 100)
        b = b + (((b - 127) * Contrast) \ 100)

        'make sure the new variables aren't too high or too low
        ByteMe r
        ByteMe g
        ByteMe b

        'set the new pixel
        SetPixelV Picture1.hDC, x, y, RGB(r, g, b)

    'continue through the loop
    Next y

        'refresh the picture box every 10 lines (a nice progress bar effect)
        If x Mod 10 = 0 Then Picture1.Refresh

    Next x
   
   
    'final picture refresh
    Picture1.Refresh

End Sub

 

 
A voir également:

8 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 avril 2007 à 17:13
Va voir ma source de gestion d'image (DKS_Gestion_Image) : environ 35 fois plus rapide que Get/SetPixel, ca devrait suffire je pense ;p
3
cs_Kariar Messages postés 20 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 24 mai 2007
17 avril 2007 à 09:27
Merci,
c'est bien sympa ta source (d'ailleur il faudra que je poste l'améioration que j'obtiens)

Mais je me demande comment je peux appliquer cette méthode à un programme qui modifie le contraste !?! A ton avis, faut il que je créer mon programme sur le même projet que toi en utilisant les valeurs des BYT_(Red, Blue et Green) pour modifier le contraste
et suprimer ce qui ne me servirait pas dans ton programme  (c'est à dire Blue, green et red value, Getpixel, Setpixel,une partie du programme du bouton BNT) masi qu'il fonctionne toujours
?

2ème question:
est ce que je peux remplacer ta picturebox par des figures faite à partir de Line et Ellipse pour gagner du temps sans que ca complique la chose?

J'ai en grande partie compris ton programme mais pas la manière dont je peux l'utiliser pour mon besoin.........

kariar apprenti en VB
0
cs_Kariar Messages postés 20 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 24 mai 2007
17 avril 2007 à 11:19
Jai tenté de faire une commande pour changer le contrast avec une textbax mais voici le code si vous pouvez me conseiller...... il ne me trouve pas la valeur de BYT_ImageByts_Image(pixR, LNG_X + 1, LNG_Y + 1)

En plus, j'ai l'impression que je "contrerais" ton programme avec le refresh de l'image dans la boucle
voici le code si vous pouvez me conseiller......(il y a pas la fin mais ca plante avant de toute facon)

Public Sub Command1_Click()
Dim Contrast As Integer
Dim x As Integer, y As Integer
Dim r As Integer, g As Integer, b As Integer
Dim r1 As Integer, g1 As Integer, b1 As Integer
Contrast = Val(TxtContrast)
 
 For x = 0 To PCT_TEST.ScaleWidth
   For y = 0 To PCT_TEST.ScaleHeight
     Let BYT_ImageByts_Image(pixR, LNG_X + 1, LNG_Y + 1) = r
     Let BYT_ImageByts_Image(pixG, LNG_X + 1, LNG_Y + 1) = g
     Let BYT_ImageByts_Image(pixB, LNG_X + 1, LNG_Y + 1) = b
 
     r1 = (r + (((r - 127) * Contrast) \ 100))
     g1 = (g + (((g - 127) * Contrast) \ 100))
     b1 = (b + (((b - 127) * Contrast) \ 100))



     BYT_Red = r1
     BYT_Green = g1
     BYT_Blue = b1
     'relancer la nouvelle valeur
   Next y
   'relancer la nouvelle valeur
Next x
End Function




Kariar apprenti en VB
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 avril 2007 à 11:24
Lol, il s'agit d'une classe, donc le plus simple reste de partir d'un nouveau projet, rajouter la classe à ton projet, et utiliser cette classe (c'est le but d'une classe : pouvoir facilement être réutilisée).

Donc te prends pas la tête à virer ce qui te concerne pas, prend tout le code, et utilise que ce qu'il te faut.

Par contre ma source a besoin d'un picturebox pour fonctionner : les elipse ou autre contrôles line de vb ne sont pas des images en soit, il s'agit de composant représentant des objets graphiques statiques à l'écran.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Kariar Messages postés 20 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 24 mai 2007
17 avril 2007 à 11:44
ok
mais partir d'un nouveau projet ou du tien ca n'a pas fais pas de différence  ;)
Concernant ta remarque sur les elipse et les line, je pense que si je les insert dans un picturebox ce la ne pose pas de souci!??

Néammoins je voudrais savoir quelle "variable" des pixels je dois prendre pour la modifier:
j'avais tenté avec BYT_ImageByts_Image(ect)   et Byt_Red/Green/blue masi apparement je n'arrive même pas à prendre ces valeurs et à les renvoyées...

Si tu pouvais me conseiller ..............

Kariar apprenti en VB
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 avril 2007 à 12:14
Non je le répète : les elipse ou les lines ne sont pas des images, ce sont des composants graphiques, qui sont donc bien différents de l'image de ton picturebox !

Ma source ne travaille que sur l'image contenue dans un picturebox.

Je te déconseille de manipuler directement le tableau de bits (surtout qu'il est ordonné à l'envers !), utilise plutôt les fonctions de ma classe : Get/SetPixel, qui fonctionne presque comme les API Windows, la rapidité en plus.
0
cs_Kariar Messages postés 20 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 24 mai 2007
17 avril 2007 à 13:30
Mais on peut mettre des composants graphique dasn une picturebox aussi?(il me semble que c'est ce que j'ai fais hier! ou alors j'ai imaginé des choses! :s)

Sinon pourquoi avec ce code ca ne fonctionne pas?
Ca change la couleur du picturebox masi ca ne n'influe en rien le contraste! c'est assez déroutant

Public Sub Command1_Click()
Contrast = Val(TxtContrast)

Dim OBJ_Image As New CLS_GESTION_IMAGE 'stocke l'objet de gestion d'image
Dim LNG_for1 As Long 'stocke les valeurs de la boucle For->Next
Dim LNG_For2 As Long 'stocke les valeurs de la boucle For->Next
Dim LNG_Couleur As Long 'stocke la couleur récupèrée





 For LNG_for1 = 0 To PCT_TEST.ScaleWidth - 1
        For LNG_For2 = 0 To PCT_TEST.ScaleHeight - 1



            LNG_Couleur = GetPixel(PCT_TEST.hdc, LNG_for1, LNG_For2)
            LNG_Couleur = (LNG_Couleur + (((LNG_Couleur - 127) * Contrast) \ 100))
            Call SetPixelV(PCT_TEST.hdc, LNG_for1, LNG_For2, LNG_Couleur)
       Next LNG_For2
    Next LNG_for1
   
    Beep
    End Sub




Kariar apprenti en VB
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 avril 2007 à 14:37
Oui, tu peux rajouter des composants line ou elipse, ou autre dans un picturebox, mais ca reste des composants graphiques, et ce n'est pas intégré à ton image finale : si tu enregistre l'image contenue dans ton picturebox par exemple, tu verre que les lines ou les elipses disparaîtront ! (surtout que ce n'est pas compliqué de tracer une ligne ou une elipse dans un picturebox, en utilisant les fonctions de base de VB ou les fonctions de l'API Windows).

Perso, je vois pas comment on change le contraste, donc je peux pas te dire si ton algo est bon ou pas, mais là ton algo change les couleurs, ca c'est sûr !
0
Rejoignez-nous