IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

dégradé de couleurs où de gris


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut dégradé de couleurs où de gris
    Bonjour à tous. Je développe depuis des années des applications graphiques avec GTK et cairo. J'utilise souvent des palettes de (quelques) couleurs, en passant par des fonctions comme, e.g., cairo_set_source_rgb(), etc.

    Voici qu'aujourd'hui je dois développer une applications avec des dégradés de couleurs ou de gris, un peu comme une carte IGN utilisant des couleurs - niveaux de gris - pour indiquer les altitudes.

    Quelqu'un aurait-il ici des conseils à me donner pour ce faire ? J'ai du mal à imaginer que je doive déclarer des (un tableau de) centaines de d'objets créés avec gdk_cairo_create(), etc., pour chaque niveau de couleurs ou de gris utilisé. Serait-ce vraiment la seule solution ?

    Toute aide sur ce point me serait utile.

    D'avance merci,

    Eric.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Bonsoir.

    J’ai beaucoup de mal à comprendre la problématique.

    Si tu cherches des dégradés cairo dispose de fonctions adéquates. Regarde les exemples du site officiel.

    Si tu désires choisir une couleur parmi un dégradé Gtk mets à ta disposition un widget dédié : GtkcolorChoiceDialog

    Si ça ne répond pas du tout à tes attentes pourrais-tu préciser tes besoins ?

  3. #3
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Merci Gerald,

    Si j'ai bien compris, cairo propose effectivement des moyens de gérer des gradients, mais il ne s'agit que de gradients linéaires ou circulaires, ce qui n'est pas ce donc j'ai besoin. Par ailleurs, si j'ai bien compris également, GtkcolorChoiceDialog discute avec l'utilisateur pour choisir une couleur, ce qui n'est pas non plus ce dont j'ai besoin.

    Le cas typique que je dois coder, comme je l'ai dit, serait celui une carte IGN utilisant des couleurs - niveaux de gris - pour indiquer les altitudes.

    Imaginons donc que j'ai un tableau x à deux dim, et dans chaque case x[i][j] j'ai une valeur différente. Imaginons que je veuille représenter ce tableau dans une drawing area et que je veuille figurer dans chaque case [i,j] une couleur ou une intensité de gris qui corresponde à la valeur de x[i][j]. Il n'y a aucun gradient linéaire ou circulaire dans ce cas, ni d'interaction avec l'utilisateur.

    Mon idée, "bourrin" aurait été de définir à l'avance un tableau de (centaines) d'objets créés avec gdk_cairo_create(), chacun correspondant à un niveau de couleur ou de gris différent, et de choisir à chaque fois le bon pour figure la valeur de chaque case du tableau. Mais ca me parait bien lourd, d'où ma question.

    J'espère être plus clair.

    Ou bien ai-je loupé quelque chose dans ta réponse ?

    Encore merci, Eric.

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Effectivement ma réponse a tapé à côté

    Si je comprends bien f(x,y) correspond à une altitude. Cette altitude est donc bornée. Par exemple [-2000, 6000].

    Si tu choisis une représentation en niveau de gris une simple interpolation linéaire sur le segment [-2000, 6000] peut te donner un réel compris entre 0 et 1. À partir de ce nombre tu le convertis en RGB pour être utilisé avec cairo.

    Au final tu peux faire la même conversion RGB en couleur en partant d’une couleur arbitraire. Tu peux aussi créer des «*tranches*» de couleur. Tu crées arbitrairement des intervalles d’altitude. Pour chaque intervalle tu décides d’une couleur que tu dégrades du plus foncé au plus clair sur l’intervalle par exemple . Le nombre d’intervalle va déterminer la taille d’un tableau qui contiendra les couleurs pour chacun d’eux. Ça te permet de limiter sa taille.

  5. #5
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Merci Gerald,

    Cependant le problème n'est pas de calculer les couleurs intermédiaires ou niveau de gris dans un dégradé par interpolation. Ca pas de problème. Le problème est bien comment mettre ceci en machine dans GTK/cairo.

    De ta réponse, je comprends donc que je n'ai effectivement pas d'autres choix - comme je le disais - que de créer un tableau de (centaines) d'objets créés avec gdk_cairo_create(), et d'argumenter celui qui convient en fonction de la valeur de la case x[i][j]. Je trouve cette solution un peu "bourrin" (comme je le disais), et j'imaginais qu'il pourrait y avoir quelque chose de plus "rusé".

    Ai-je bien compris ?

    Encore merci pour ta disponibilité,

    Eric.

  6. #6
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Non tu n'es pas censé faire ça.
    L'idée est plutôt d'avoir un contexte Cairo pour toute ta surface de dessin (que tu peux éventuellement obtenir via les fonctions gdk_cairo_*()), puis d'utiliser les fonctions Cairo pour dessiner dans ce contexte.
    En l'occurrence, il se pourrait qu'il te suffise de boucler sur les coordonnées de ton maillage avec ce trio de fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cairo_set_source_rgb()
    cairo_rectangle()
    cairo_fill()
    La première définit la couleur de la maille, la seconde ses coordonnées, la troisième la remplit.
    Et puis à la fin un cairo_paint() pour appliquer tout ça.

    À tester et compléter probablement : je n'utilise pas ça tous les jours, et j'ai surtout adapté ou mis à jour du code existant et contenant ce genre de choses, plutôt que de le faire moi-même en partant de zéro.
    Mais je pense que c'est ça l'idée.

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Je ne comprends pas bien pourquoi il faudrait créer tout un tas de cairo_t*.

    Pourrais-tu me montrer un bout de code qui pourrait m’éclairer sur ta façon de faire ?

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 088
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 088
    Par défaut
    Bonsoir,

    si je peux me permettre de squatter ce sujet, je voudrais signaler que dans mon contexte (une vieille distro Debian 7 dans un Linux 3.8 et gtk2), le code de gerald3d compile sans lui changer une virgule mais à l'exécution je n'ai qu'une fenêtre blanche et vide qui s'affiche...

    Comme je lance le binaire depuis un terminal, ça me dit ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    > ./sanstitre 
     
    (sanstitre:12205): Gtk-WARNING **: gtk_scrolled_window_add(): cannot add non scrollable widget use \
    gtk_scrolled_window_add_with_viewport() instead
     
    (sanstitre:12205): GLib-GObject-WARNING **: /build/buildd-glib2.0_2.33.12+really2.32.4-5-i386-eISom6/ \
    glib2.0-2.33.12+really2.32.4/./gobject/gsignal.c:2459: signal `draw' is invalid for instance `0x890d0c0'
    Merci des idées pour avancer.

  9. #9
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Bonsoir.

    Sur les anciennes versions de Gtk3 les GtkScrolledWindow ne disposaient pas en interne d’un GtkViewPort. Il faut créer un GtkViewPort que tu insères dans le GtkScrolledWindow. Le widget enfant vient enfin s’insérer dans ce GtkViewPort.

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 088
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 088
    Par défaut
    Bonsoir,

    et merci de cette réponse rapide, qui me dépasse un peu, Gtk n'étant pas ma tasse de thé (je cause plutôt Pascal, d'habitude)

    Et un truc m'a surpris :
    Citation Envoyé par gerald3d Voir le message
    Sur les anciennes versions de Gtk3 les GtkScrolledWindow...
    c'est la première fois que je vois ce mot en gras dans cette discussion, alors qu'est-ce qui permet de déterminer que c'est du code Gtk3 (ou 2 ou 1) dans le snippet que tu as posté ?
    Parce qu'il n'y a rien dans les lignes que tu as données et, ma foi, ça a compilé dans ma machine gtk2.

    Bon, bah, c'est pas bien grave, si je suis passé par ici, c'est surtout par curiosité, attiré par les mots dégradé, couleurs, gris dans le titre de la discussion.
    On peut laisser tomber, en ce qui me concerne, et désolé pour le dérangement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Dégradé de couleur
    Par néocodeur dans le forum Images
    Réponses: 7
    Dernier message: 18/04/2007, 14h15
  2. [VBA-E]dégradé de couleurs
    Par spileo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/04/2007, 07h45
  3. Dégradé de couleur dans un rectangle
    Par macoute dans le forum 2D
    Réponses: 3
    Dernier message: 10/01/2006, 16h30
  4. Réponses: 8
    Dernier message: 17/05/2005, 18h08
  5. [Image]Dégradé de couleur
    Par eyal555 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 12/04/2005, 09h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo