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

Langage Delphi Discussion :

Graphisme conversion RGB vers hexachromie


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Graphisme conversion RGB vers hexachromie
    Bonjour,

    Convertir des RGB en CMYK est relativement simple avec les procedures:
    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
    procedure RGBToCMY(const RGB:  TRGBTriple; var   C,M,Y:  INTEGER);
    begin
      With RGB do
      begin
        C := 255 - rgbtRed;
        M := 255 - rgbtGreen;
        Y := 255 - rgbtBlue
      end;
    end; {RGBtoCMY}
     
    procedure RGBToCMYK(const RGB:  TRGBTriple;var  C,M,Y,K:  INTEGER);
    begin
      RGBToCMY(RGB, C,M,Y);
      K := MinIntValue([C, M, Y]);
      C := C - K;
      M := M - K;
      Y := Y - K
    end; {RGBtoCMYK}
    Avec ces procédures on peut procéder à une séparation de couleurs d'une image bitmap 24 bits pour une imprimante classique.

    Mais si cette imprimante travaille en hexachromie du genre Cyan, Magenta, Jaune, Noir + Bleu + Rouge ???

    Quelqu'un sait-il comment écrire la procédure de la séparation de couleurs du type :
    Procedure RGBToCMYKC1C2(const RGB: TRGBTriple;const Col1, col2: Tcolor; var C,M,Y,K,C1,C2: Byte);

    Où Col1 et col2 sont les deux couleurs additionnelles et C,M,Y,K,C1,C2 les valeurs retours de RGB converti en hexachromie exprimées en byte

    Sans doute faut-il travailler à partir des valeurs hexadecimales des six couleurs d'impression

    Interessant n'est-ce pas ?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Complément d'information
    Je me dois de fournir les info suivantes :
    En fait je développe une application dite de "Ripage", c'est à dire de convertir les RGB d'une bitmap dans les valeurs des encres d'une imprimante équipée de 4,5,6 et + encres d'impression.
    Je dispose des valeurs hexadécimales de chacune de ces encres.
    J'ai trouvé une procédure assez simple en VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Type Coul_Sep
        Rouge As Long
        Vert As Long
        Bleu As Long
    End Type
    Private Function SepareColor(Color As Long) As Coul_Sep
    With SepareColor
        .Rouge = Int(Couleur And &HFF)
        .Vert = Int((Couleur And &H100FF00) / &H100)
        .Bleu = Int((Couleur And &HFF0000) / &H10000)
    End With
    End Function
    Ne peut on pas s'inspirer de ce principe pour procéder à la séparation de couleurs d'une image dans des couleurs connues en hexafécimale ?

  3. #3
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Regarde la discution :
    http://www.developpez.net/forums/d53...sion-cmjn-rvb/

    En particulier, la dernière intervention de pseudocode.
    Apparemment, l'hexachromie est brevetée et Pantone n'aime pas qu'on réponde à ta question...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ok j'avais vu cette discution
    D'abord Pantone n'a pas breveté l'hexachromie, l'hexachromie est du domaine public. C'est son hexachromie à lui qui est brevetée c'est à dire la nature des encres orange et verte qu'il ajoute au CMYK qui devient CMYKOG de PANTONE.

    Mais mon problème n'est pas de passer systématiquement de RGB vers un système six encres mais de décomposer une couleur connue en hexadécimale par cinq ou six couleurs dont on connait la valeur hexa ou leur équivalent Tcolor

    On peut décomposer une valeur TColor par la fonction
    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
    Type
     TRGBSeparator = record
        Rouge: Integer;
        Vert: Integer;
        Bleu: Integer;
     end;
     
    function RGBColor( Color: TColor ):TRGBSeparator;
    begin
      with result do
      begin
        rouge:= Integer(Color and $0000FF ) div 1;
        vert:= Integer(Color and $00FF00) div 256;
        bleu:= Integer(Color and $FF0000) div (256*256);
      end;
    end;
    La première question est :
    Si les primaires ne sont pas clRouge, clGreen et clBlue mais sont replacées par clLime, clPurple et clYellow comment réécrire cette fonction ?

    La seconde question est :
    Si je dispose de six primaires telles que :
    noir = $202327, orange = $0047F6, cyan = $C9683C, magenta = $062AFA, jaune = $00FFF4
    Comment réécrire cette fonction ?

  5. #5
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    1ère question:

    pour le physicien r,v,b et tu obtiens en jouant sur les intensités de r, v et b toutes les autres couleurs. (synthèse additive)

    pour les peintres (l'imprimerie) :

    rouge (magenta)
    bleu (cyan)
    jaune

    C'est de la synthèse soustractive :
    un pigment rouge (donc magenta pour le physicien) absorbe les radiations vertes et diffuse le bleu et le rouge.
    un pigment jaune diffuse le rouge et le vert mais absorbe les radiations bleues.
    en mélangeant les pigments :
    seul le rouge est diffusé, donc on obtient du rouge (bleu et vert absorbés)

    un objet difffuse la lumière correspondant à sa propre couleur et absorbe les autres.

    cyan(bleu peintre)+jaune+magenta(rouge peintre) donne du noir.
    tout est absorbé mais ce noir n'est pas terrible d'où l'ajout de noir en imprimerie.

    pas le temps de regarder ton code... ça devrait t'aider à comprendre....

    @+

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ok mais ça ne résout rien
    Tout le monde sait que les images sont stockées en RGB, donc en primaires additives, et qu'elles sont imprmées en CMY(K), donc en primaires soustractives. Comme les primaires soustractives sont les complémentaires des primaires additives (elles s'opposent aux sommets d'un cube virtuel) le passage de l'une à l'autre est facile:
    Cyan = 1 - Rouge
    Magenta = 1 - Vert
    Jaune = 1- Bleu
    Dans cet espace virtuel cubique de 1 de côté dont 3 sommets sont R,G et B et 3 autres sommets sont C, M, Y, et comme un cube dispose de huit sommets les deux manquants qui s'opposent sont occupés par le blanc et le noir. Voir à ce sujet mon site www.color-id.com Chapitre "La couleur numérique", rubrique "Gérer les images numériques", sous-rubrique "Exemple de création d'un gamut d'imprimante".
    Le problème c'est que cet espace est virtuel, dans la réalité, les RGB par mélange sont incapables de produire un blanc pur (Illuminant E pour EquiEnergétique) et les CMY sont tellement incapables de produire un noir que l'on est obligé d'ajouter une encre noire.
    Mon problème n'est donc pas là.
    En fait c'est celui de tout imprimeur : il faut ajouter d'autres couleurs au CMYK pour que le gamut d'impression s'approche du gamut de l'écran (voir la sous rubrique "Projection des gamuts dans un diagramme" de la même rubrique. C'est justemant pouquoi on a inventé l'hexachromie...
    Et pour un imprimeur d'emballages le problème est autre : Il doit généralement reproduire une couleur de marque qui n'est pas située dans le gamut CMYK, il ajoute donc une encre à la couleur de la marque, par exemple l'orange du logo bien connu du FAI (France Telecom) pour l'emballage de la live box par exemple.
    Mon problème c'est :
    La séparation couleurs d'une image bitmap (donc exprimée en RGB) dans les couleurs des encres utilisées par l'imprimeur.
    Une des solutions à ce problème passe par les tables LUT des profils ICC, mais dans l'application que je développe on se situe en amont de la connaissance des profils ICC...

    Il faut donc une solution approchée du type de celle que je propose de rechercher avec la connaissance des valeurs hexadécimales des couleurs des encres utilisées. C'est une voix de recherche mais toute autre solution serait la bien venue.

    J'ai été long mais ai-je été claire ?

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    Peut-être quelque chose du style:

    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
    uses Math;
     
    type
      TCMYOKColor = record
        C :real;  //entre 0 et 1
        M :real;  //entre 0 et 1
        Y :real;  //entre 0 et 1
        O :real;  //entre 0 et 1
        K :real;  //entre 0 et 1
      end;
     
    function ConvertColor(aColor :TColor) :TCMYOKColor;
    var
      D :real;
      R,G,B :byte;
    begin
      with Result do
      begin
        //Conversion TColor en RGB
        R := aColor and $FF;
        G := (aColor shr 8) and $FF;
        B := (aColor shr 16) and $FF;
     
        //Conversion RGB en CMY
        C := 1 - (R /255);
        M := 1 - (G /255);
        Y := 1 - (B /255);
     
        //D'après ta données, orange = 96% *R ($F6) et 31% *G ($47)
        D := min(C /0.96, M /0.31);
     
        //Orange à 100% ?
        if D >= 1 then
        begin
          O := 1;
          C := C -0.96;
          M := M -0.31;
        end
        else
        begin
          O := D;
          C := C -(0.96 *D);
          M := M -(0.31 *D);
        end;
     
        //Noir
        K := 1;
        if (C < K) then K := C;
        if (M < K) then K := M;
        if (Y < K) then K := Y;
        if (O < K) then K := O;
     
        //Noir à 100% ?
        if K = 1 then
        begin
          C := 0;
          M := 0;
          Y := 0;
          O := 0;
        end
        else
        begin
          C := (C -K) /(1 -K);
          M := (M -K) /(1 -K);
          Y := (Y -K) /(1 -K);
          O := (O -K) /(1 -K);
        end;
      end;
    end;

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Astucieux et judicieux
    Je viens de prendre connaissance de cette proposition qui me parait très judicieuse puisque la notation hexa correspond en effet à la composition RGB de la couleur.

    Je vais travailler sur cette idée et ne manquerai pas de donner mes conclusions...

    Merci pour cette riche idée

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Problème dans fonction ConvertColor
    Bonjour,

    Je viens rapidement de vérifier la fonction ConvertColor.
    Je lui adresse sucessivement la couleur Cyan, Magenta, Jaune, Noir et Orange

    Elle me retourne des valeurs correctes pour Cyan, Magenta, Jaune. (C'est à dire que la primaire correspondante est à 1 et les autres à 0)

    Pour le noir il y a erreur :
    C= 0, M=0.68, Y=1.00, K= 0.04, O= 1.00
    Elle devrait me retourner K=1 et 0 pour les autres primaires


    Pour l'orange c'est peut-être bon :
    C=0, M=0.71, Y=1.00, K=0.00, O= 0.035
    J'aurais préféré qu'elle retourne O=1.00 et 0 pour les autres primaires, mais sans doute n'est-ce pas possible puisque O contient du M et du Y...

    Aujourd'hui c'est dimanche je n'aurai pas le temps d'aller plus loin, mais dès demain je vais chercher l'erreur...

    Si quelqu'un trouve avant qu'il ne se prive pas de me donner la solution

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    Pour le noir, je pense que l'erreur vient du calcul de l'orange AVANT celui du K. S'il y a de l'orange, C et M ne pourront jamais valoir 1.
    Calcul le K uniquement avec les teintes primaires, CMY en CMYK (Ce qui est de toute façon beaucoup plus logique ) et ensuite seulement le O.

    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
    uses Math;
     
    type
      TCMYOKColor = record
        C :real;  //entre 0 et 1
        M :real;  //entre 0 et 1
        Y :real;  //entre 0 et 1
        O :real;  //entre 0 et 1
        K :real;  //entre 0 et 1
      end;
     
    function ConvertColor(aColor :TColor) :TCMYOKColor;
    var
      D :real;
      R,G,B :byte;
    begin
      with Result do
      begin
        //Conversion TColor en RGB
        R := aColor and $FF;
        G := (aColor shr 8) and $FF;
        B := (aColor shr 16) and $FF;
     
        //Conversion RGB en CMY
        C := 1 - (R /255);
        M := 1 - (G /255);
        Y := 1 - (B /255);
     
         //Noir
        K := 1;
        if (C < K) then K := C;
        if (M < K) then K := M;
        if (Y < K) then K := Y;
     
        //Noir à 100% ?
        if K = 1 then
        begin
          C := 0;
          M := 0;
          Y := 0;
          O := 0;
        end
        else
        begin
          //D'après ta données, orange = 96% *R ($F6) et 31% *G ($47)
          D := min(C /0.96, M /0.31);
     
          //Orange à 100% ?
          if D >= 1 then
          begin
            O := 1;
            C := C -0.96;
            M := M -0.31;
          end
          else
          begin
            O := D;
            C := C -(0.96 *D);
            M := M -(0.31 *D);
          end;
     
          C := (C -K) /(1 -K);
          M := (M -K) /(1 -K);
          Y := (Y -K) /(1 -K);
          O := (O -K) /(1 -K);
        end;
     end;
    Ton O devrait en effet être beaucoup plus grand que 0.035. Il doit y avoir un 1/x qui manque quelque part.
    Difficile de tester sans périphérique de sortie adapté

    Attention, O contient du M et du C! TColor en Delphi se lit $BBGGRR et non $RRGGBB.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Le noir est bon mais pas orange
    Bon avec la modif la fonction semble travailler uniquement en CMYK
    Toute est bon sauf l'orange qui curieusement retourne :
    C= -0.035, M= 0.70, Y=1.00, K=0.035, O=0.00

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    Il serait peut-être plus judicieux de travailler sur les valeurs CMY de l'orange.
    J'ai aussi limité les CMYO résultants à min. 0.

    A voir encore si O devrait être calculé en fontion de C(K) et M(K) (le test du min. 0 deviendrait obsolète)

    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
    function ConvertColor(aColor :TColor) :TCMYOKColor;
    var
      D :real;
      R,G,B :byte;
      Co, Mo, Yo :real;
    begin
      with Result do
      begin
        //Conversion TColor en RGB
        R := aColor and $FF;
        G := (aColor shr 8) and $FF;
        B := (aColor shr 16) and $FF;
     
        //Conversion RGB en CMY
        C := 1 - (R /255);
        M := 1 - (G /255);
        Y := 1 - (B /255);
     
         //Noir
        K := 1;
        if (C < K) then K := C;
        if (M < K) then K := M;
        if (Y < K) then K := Y;
     
        //Noir à 100% ?
        if K = 1 then
        begin
          C := 0;
          M := 0;
          Y := 0;
          O := 0;
        end
        else
        begin
          //CMY de l'orange (constante)
          Co := 1 -($F6 /255);
          Mo := 1 -($47 /255);
          Yo := 1 -($00 /255);
     
          D := min(C /Co, M /Mo);
     
          //Orange à 100% ?
          if D >= 1 then
          begin
            O := 1;
            C := C -Co;
            M := M -Mo;
          end
          else
          begin
            O := D;
            C := C -(Co *D);
            M := M -(Mo *D);
          end;
     
          C := max(0, (C -K) /(1 -K));
          M := max(0, (M -K) /(1 -K));
          Y := max(0, (Y -K) /(1 -K));
          O := max(0, (O -K) /(1 -K));
        end;
     end;
    end;

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Du progrès mais pas encore cela
    avec la nouvelle fonction pour l'orange :
    C=0, M=0, Y=1, K=0.035, O=1;
    pour les autres tout est bon
    Pour le test j'ai fais une petite application avec une seule form, comment la transferer ?

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    C=0 M=0 O=1 est correct! Qu'est-ce qui te dérange? K?

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    K et Y<>0

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    Alors ajout d'Y,

    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
          D := minValue(C /Co, M /Mo, Y /Yo);
     
          //Orange  100% ?
          if D >= 1 then
          begin
            O := 1;
            C := C -Co;
            M := M -Mo;
            Y := Y -Yo;
          end
          else
          begin
            O := D;
            C := C -(Co *D);
            M := M -(Mo *D);
            Y := Y -(Yo *D);
          end;
    Par contre, K sera toujours > 0 pour l'orange (C et M <> 1) ...

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Mon Appli test
    Mon application test
    Sur Form1 tu place 1 Ttimer, 6 Tshape, 11 Tlabel
    Dans l'implementation tu ajoute
    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
    type
      TCMYOKColor = record
        C :real;  //entre 0 et 1
        M :real;  //entre 0 et 1
        Y :real;  //entre 0 et 1
        O :real;  //entre 0 et 1
        K :real;  //entre 0 et 1
      end;
     
    var
      CanvasB : TCanvas; // Canvas de l'écran
     
    function ColorToRGBTriple(CONST Color: TColor):  TRGBTriple;
    begin
      With Result do
      begin
        rgbtRed   := Integer(Color and $0000FF) div 1;
        rgbtGreen := Integer(Color and $00FF00) div 256;
        rgbtBlue  := Integer(Color and $FF0000) div 65536;
      end;
    end;
    Dans OnCreate
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Width:= 530;
      Height:= 262;
      Left:= (Screen.Width-Width) div 2;
      Top:= (Screen.Height-Height) div 2;
      Label1.Left:= 16;
      Label1.Top:= 71;
      Label2.Left:= 16;
      Label2.Top:= 87;
      Label3.Left:= 16;
      Label3.Top:= 103;
      Label4.Left:= 16;
      Label4.Top:= 119;
      Label5.Left:= 16;
      Label5.Top:= 138;
      Label6.Left:= 16;
      Label6.Top:= 155;
      Label7.Left:= 160;
      Label7.Top:= 200;
      Label8.Left:= 232;
      Label8.Top:= 200;
      Label9.Left:= 304;
      Label9.Top:= 200;
      Label10.Left:= 368;
      Label10.Top:= 200;
      Label11.Left:= 440;
      Label11.Top:= 200;
      // Illustration couleur
      Shape1.Left:= 8;
      Shape1.Top:= 0;
      Shape1.Shape:= stCircle;
      // Cyan
      ShapeCyan.Left:= 144;
      ShapeCyan.Top:= 129;
      ShapeCyan.Brush.Color:= clAqua;
      // Magenta
      ShapeMagenta.Left:= 213;
      ShapeMagenta.Top:= 129;
      ShapeMagenta.Brush.Color:= clFuchsia;
      // Yellow
      ShapeYellow.Left:= 284;
      ShapeYellow.Top:= 129;
      ShapeYellow.Brush.Color:= clYellow;
      // Black
      ShapeBlack.Left:= 354;
      ShapeBlack.Top:= 129;
      ShapeBlack.Brush.Color:= clBlack;
      // Orange
      ShapeOrange.Left:= 425;
      ShapeOrange.Top:= 129;
      ShapeOrange.Brush.Color:= $000047F6;
      DoubleBuffered := true;
      // Récupération de l'image à l'écran dans un TCanvas :
      CanvasB := TCanvas.Create;
      CanvasB.Handle := GetWindowDC(GetDesktopWindow);
    end;
    et dans Timer1Timer
    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
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      coul : TColor;
      RGB: TRGBTriple;
      TCMYOK: TCMYOKColor;
    begin
      // Récupération de la couleur du pixel désigné par la souris :
      coul := CanvasB.Pixels[Mouse.CursorPos.X,Mouse.CursorPos.Y];
      RGB:= ColorToRGBTriple( coul );
      TCMYOK:= ConvertColor(coul);
      // Affichage de cette couleur dans Shape1 :
      Shape1.Brush.Color := coul;
      // Affichage du code couleur dans différents formats :
      Label1.Caption := 'TColor : ' + ColorToString(coul)+' ou '+IntToStr(coul);
      Label2.Caption := 'RGB : ' + IntToStr(GetRValue(coul)) + ',' + IntToStr(GetGValue(coul)) + ',' + IntToStr(GetBValue(coul));
      Label3.Caption := 'HTML : #' + IntToHex(GetRValue(coul),2) + IntToHex(GetGValue(coul),2) + IntToHex(GetBValue(coul),2);
      Label4.Caption := 'R = '+IntToStr(RGB.rgbtRed);
      Label5.Caption := 'G = '+IntToStr(RGB.rgbtGreen);
      Label6.Caption := 'B = '+IntToStr(RGB.rgbtBlue);
      // Séparation
      Label7.Caption := 'C = '+IntToStr(round(TCMYOK.C*255));
      Label8.Caption := 'M = '+IntToStr(round(TCMYOK.M*255));
      Label9.Caption := 'Y = '+IntToStr(round(TCMYOK.Y*255));
      Label10.Caption := 'K = '+IntToStr(round(TCMYOK.K*255));
      Label11.Caption := 'O = '+IntToStr(round(TCMYOK.O*255));
    end;

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Avec la correction sur Y cela marche mais:
    Le noir devrait être à zéro, sinon l'orange qui devrait être pur sera moins saturé et plus sombre et risque en plus d'être de tirer sur le kaki

    En fait le but est: Si l'imprimeur dispose sur sa presse de 5 encres les 4 de CMYK et un orange PANTONE (dit ton direct) pour le logo client qui est orange et hors gamut CMYK, toutes les teintes de l'ouvrage hors le logo se feront en CMYK et le Logo avec l'encre orange.

  19. #19
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    Maintenant que le O est convenablement calculé, tu devrais le remettre dans le calcul du K.

    La procedure était en fait assez générique pour une utilisation uniforme des encres. Maintenant si seul le logo est concerné, tu pourrais simplement tester que aColor = Orange et forcer les valeurs que tu veux. Cela fonctionnera pour autant qu'il n'y aie pas de dégradé d'orange, sinon tu retombre dans CMYK (Ce qui entraine aussi d'avoir une échelle 1:1 par rapport au péripherique de sortie, un stretch de l'image entrainera obligatoirement des dégradés sur les bords )

    La dernière possibilité est de gérer ton image en 32bits avec composante alpha. Le TOrange serait alors parfait dans tous les cas.

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Oui pour les dégradés d'orange
    C'est Ok l'orange doit être présent dans les dégradés (et toutes les teintes)qui seraient hors gamut du CMYK et faisables avec l'orange.

    Le problème c'est que dans mon appli on ne peut pas connaître le gamut CMYK pour lequel il faut le profil ICC de l'imprimante, sauf si ... l'image est calculée avec l'espace SRGB. (je vais m'en occuper) en fait le problème deviendrait plus simple si la couleur est dans le gamut CMYK on la calcule uniquement en CMYK sinon on introduit l'orange

    Mais sans calculer K avec O (qui me donne 0.035 de K pour l'orange pur) j'ai tout de même des résultats curieux, par exemple la couleur $9202BB qui est un pourpre est proposée avec O=1.00 et K=0.28 et C,M,Y sont nuls.

    Si j'intègre O au calcul de K il arrive que des valeurs de K soient négatives...

    Comme tu dis la procedure est actuellement générique elle mérite d'être plus travaillée sans doute avec la prise en compte des gamuts... A moins que tu propose une autre voie.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Conversion RGB 24-bits vers RGB 16-bits
    Par progfou dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 08/11/2007, 22h52
  2. Conversion ColorIndex vers RGB
    Par coco21 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/08/2007, 10h02
  3. Conversion de l'espace RGB vers RGB normalisé
    Par hanane78 dans le forum Images
    Réponses: 5
    Dernier message: 16/08/2007, 13h38
  4. Conversion RGB vers YCbCr et autres
    Par progfou dans le forum Traitement d'images
    Réponses: 8
    Dernier message: 12/07/2006, 08h53
  5. Conversion yuv vers rgb en hardware
    Par pifpanfpouf dans le forum DirectX
    Réponses: 1
    Dernier message: 20/03/2006, 14h00

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