Modifier le contraste sans get et set pixel? [Résolu]

cs_Kariar 20 Messages postés mardi 10 avril 2007Date d'inscription 24 mai 2007 Dernière intervention - 16 avril 2007 à 16:46 - Dernière réponse : cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention
- 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

 

 
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 16 avril 2007 à 17:13
3
Merci
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

Merci cs_DARKSIDIOUS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
cs_Kariar 20 Messages postés mardi 10 avril 2007Date d'inscription 24 mai 2007 Dernière intervention - 17 avril 2007 à 09:27
0
Merci
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
Commenter la réponse de cs_Kariar
cs_Kariar 20 Messages postés mardi 10 avril 2007Date d'inscription 24 mai 2007 Dernière intervention - 17 avril 2007 à 11:19
0
Merci
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
Commenter la réponse de cs_Kariar
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 17 avril 2007 à 11:24
0
Merci
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.
Commenter la réponse de cs_DARKSIDIOUS
cs_Kariar 20 Messages postés mardi 10 avril 2007Date d'inscription 24 mai 2007 Dernière intervention - 17 avril 2007 à 11:44
0
Merci
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
Commenter la réponse de cs_Kariar
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 17 avril 2007 à 12:14
0
Merci
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.
Commenter la réponse de cs_DARKSIDIOUS
cs_Kariar 20 Messages postés mardi 10 avril 2007Date d'inscription 24 mai 2007 Dernière intervention - 17 avril 2007 à 13:30
0
Merci
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
Commenter la réponse de cs_Kariar
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 17 avril 2007 à 14:37
0
Merci
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 !
Commenter la réponse de cs_DARKSIDIOUS

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.