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

Lazarus Pascal Discussion :

Problème de modification d'un PNG avec GetLineStart [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut Problème de modification d'un PNG avec GetLineStart
    Bonjour,

    J'utilise "doParallel" pour modifier les couleurs traitées dans un GetLineStart.
    Voici les deux routines qui me servent à contrôler et modifier mes couleurs. Quand je sauvegarde mon PNG puis que je vérifie, les modifications n’ont pas été prise en compte.
    Mon code étant relativement simple, j'avoue que je ne comprends pas ce qui bloque.

    Auriez-vous une idée ?
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ProcThreadPool.DoParallel(@CompterPixelsLigne, 0, fPNG.Height - 1, fPNG);
     
      fPNG.SaveToFile(FICHIER_DE_COPIE);
     
      Image1.Picture.Assign(fPNG);
    end;
     
    procedure TForm1.CompterPixelsLigne(Index: PtrInt; Data: Pointer; Item: TMultiThreadProcItem);
    var
      X: DWord;
      L : PInteger;
      P: integer;
      S: string;
    begin
      L := Pinteger(TPortableNetworkGraphic(Data).RawImage.GetLineStart(Index));
     
      P := L^;
      inc(L);
     
      For X := 1 to TPortableNetworkGraphic(Data).Width - 1 do
      begin
        S := Format('$%.6x', [(L^ and $FFFFFF)]);
     
        if NOT AnsiMatchText(S, Refcolors) then
          L^:= P;
     
        P := L^;
        inc(L);
      end;
    end;

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Yop !

    Sous toute réserve :
    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.CompterPixelsLigne(Index: PtrInt; Data: Pointer; Item: TMultiThreadProcItem);
    var
      X: DWord;
      L : PInteger;
      P: integer;
      S: string;
    begin
      TPortableNetworkGraphic(Data).BeginUpdate; // <<<<<
      L := Pinteger(TPortableNetworkGraphic(Data).RawImage.GetLineStart(Index));
     
      P := L^;
      inc(L);
     
      For X := 1 to TPortableNetworkGraphic(Data).Width - 1 do
      begin
        S := Format('$%.6x', [(L^ and $FFFFFF)]);
     
        if NOT AnsiMatchText(S, Refcolors) then
          L^:= P;
     
        P := L^;
        inc(L);
      end;
      TPortableNetworkGraphic(Data).EndUpdate; // <<<<<
    end;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut

    Petit question pourquoi te servir de TPortableNetworkGraphic ? et pas de TBitmap directement ? ensuite pourquoi ne pas tenir compte du premier pixel ? car si il est identique à RefColor il ne sera jamais modifié. RefColor tu le définis ou et comment ?
    Est ce que le TImage affiche bien tes modifications ?
    Ensuite attention le PNG accepte la transparence (32 bits) donc est ce que le pixel format est bien en 24 bits dans ton cas. Car sinon il faut définir P également comme cela P := (L^ and $FFFFFF)
    Pourrais tu nous faire juste un petit projet reproduisant ce problème que l'on puisse jeter un oeil, si jamais ?

    A+
    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    Merci, j'ai bêtement oublie cette option

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par der§en Voir le message
    Merci, j'ai bêtement oublié cette option
    Quelle option ? Ma réponse ou celle de Jérôme
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut

    Petit question pourquoi te servir de TPortableNetworkGraphic ? et pas de TBitmap directement ? ensuite pourquoi ne pas tenir compte du premier pixel ? car si il est identique à RefColor il ne sera jamais modifié. RefColor tu le définis ou et comment ?
    Est ce que le TImage affiche bien tes modifications ?
    Ensuite attention le PNG accepte la transparence (32 bits) donc est ce que le pixel format est bien en 24 bits dans ton cas. Car sinon il faut définir P également comme cela P := (L^ and $FFFFFF)
    Pourrais tu nous faire juste un petit projet reproduisant ce problème que l'on puisse jeter un oeil, si jamais ?

    A+
    Jérôme
    Je me sers de TPortableNetworkGraphic car mon image source est un PNG.

    Ensuite ma routine est là pour remplacer les couleurs qui ne font pas partie de ma liste ; en procédant ainsi, j'élimine toutes les couleurs indésirables.

    Je ne l'ai pas mis, mais je finalise mon contrôle par ligne en vérifiant le premier pixel aussi.
    Le TImage affiche bien mes modifications car dès que je relance le comptage des couleurs, je passe bien de 1456 à mes 24 couleurs attendues.

  7. #7
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Quelle option ? Ma réponse ou celle de Jérôme
    A toi

  8. #8
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    Par contre, je constate un truc agaçant, c'est que mon image en sortie passe de 32 à 24 bits, alors même que bien forcée à pf32bit.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    @der§en,

    Là aussi tu peux te passer de cette conversion en string (l'idéal serait que Refcolors soit un entier).

    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
    procedure TForm1.CompterPixelsLigne(Index: PtrInt; Data: Pointer; Item: TMultiThreadProcItem);
    var
      ...
      RefC :integer;
    begin
      ...
      RefC := StrToInt(Refcolors);
     
      For X := 1 to TPortableNetworkGraphic(Data).Width - 1 do
      begin
        if (L^ and $FFFFFF) <> RefC 
        then L^:= P
        else P := L^;
     
        inc(L);
      end;
    end;
    [/QUOTE]

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par der§en Voir le message
    Par contre, je constate un truc agaçant, c'est que mon image en sortie passe de 32 à 24 bits, alors même que bien forcé à pf32bit
    Ah ça, c'est un b0rd3l infâme dans Lazarus/FreePascal, on en a souvent causé avec Jérôme, faut faire avec…
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    RefColors est une array contenant ma liste de mes 24 couleurs de référence.

  12. #12
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Ah ça, c'est un b0rd3l infâme dans Lazarus/FreePascal, on en a souvent causé avec Jérôme, faut faire avec…
    Existe-t’il une solution ?

  13. #13
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par der§en Voir le message
    Existe-t’il une solution ?
    Pour l'explication de ce changement c'est que ton image n'a aucun pixel avec de la transparence. Pour la solution c'est de passer par TLazIntfImage, mais c'est un peu galère quand même
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par der§en Voir le message
    Existe-t’il une solution ?
    Sous-entendu "simple" ? Pas à ma connaissance. Ça dépend entre autres de la version du BITMAPINFOHEADER (1, 4, 5), il faut donc ouvrir le fichier en mode "lisons donc les données du début du fichier et allons à la pêche aux datas" et après il faudra jouer avec le TLazIntfImage ou pas.

    Si tu sais te servir du moteur de recherche du forum, cherche avec mon pseudo et ces mots-clé, tape-toi les discussions avec Jérôme, munis-toi de fichiers bitmap de différentes versions, passe à la pharmacie et dévalise leur stock d'aspirine, et bon courage…
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. Problème de modification des paramètres avec des threads synchrones
    Par manelhaj dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 22/09/2013, 11h03
  2. Problème PNG avec menu déroulant
    Par abadou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 19/09/2010, 17h29
  3. Problème de modification de formules Excel avec VBA.
    Par jayjay78 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 27/03/2010, 18h09
  4. [GD] Problème de format PNG avec imagepng
    Par -Naek- dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 25/04/2009, 22h59
  5. Problème de transparence GIF et PNG avec Export et SaveAs
    Par nl5nn dans le forum VBA PowerPoint
    Réponses: 2
    Dernier message: 04/03/2008, 21h31

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