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 :

Filtres Anti-aliasing et TBitmap


Sujet :

Langage Delphi

  1. #1
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut Filtres Anti-aliasing et TBitmap
    Salut!

    Je suis à la recherche d'un filtre anti-aliasing pour intégrer le redimensionnement d'images dans mes projets... J'ai trouvé dans la librairie Graphics32, le code de superbes filtres anti-aliasing. J'ai simplifié le code des unités, voici ce que j'obtiens :
    http://sub0.developpez.com/delphi/exe/TableA.zip

    Néanmoins, la démo nécessite toujours le type TBitmap32. Ce que je recherche, c'est de pouvoir me passer de ce type et utiliser à la place, le type TBitmap standard (avec éventuellement la propriété pixelformat de l'image destination à pf32bit), surtout que je n'ai pas besoin d'intégrer la masque Alpha dans les images, le type TBitmap me suffirait largement.

    Merci de votre aide!
    De retour parmis vous après 10 ans!!

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

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 218
    Points
    218
    Par défaut
    Salut

    tu pourrais essayer de passer par une variable temporaire en bitmap32

    bmp -> bmp32
    operations sur bmp32 (anti aliasing,filtre...)
    bmp32 -> bmp

    @+
    @+

  3. #3
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Merci de ta réponse, mais justement, mon objectif est de supprimer le type TBitmap32 de mon code, en le remplaçant par le type TBitmap standard...
    De retour parmis vous après 10 ans!!

  4. #4
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Voilà une routine que j'utilise et qui fonctionne assez bien je trouve, si ça peut t'aider
    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
     
    procedure AntiAliasRect(clip: tbitmap; XOrigin, YOrigin,
      XFinal, YFinal: Integer);
    var Memo,x,y: Integer;
        p0,p1,p2:pbytearray;
     
    begin
       if XFinal<XOrigin then begin Memo:=XOrigin; XOrigin:=XFinal; XFinal:=Memo; end;
       if YFinal<YOrigin then begin Memo:=YOrigin; YOrigin:=YFinal; YFinal:=Memo; end;  (
       XOrigin:=max(1,XOrigin);
       YOrigin:=max(1,YOrigin);
       XFinal:=min(clip.width-2,XFinal);
       YFinal:=min(clip.height-2,YFinal);
       clip.PixelFormat :=pf24bit;
       for y:=YOrigin to YFinal do begin
        p0:=clip.ScanLine [y-1];
        p1:=clip.scanline [y];
        p2:=clip.ScanLine [y+1];
        for x:=XOrigin to XFinal do begin
          p1[x*3]:=(p0[x*3]+p2[x*3]+p1[(x-1)*3]+p1[(x+1)*3])div 4;
          p1[x*3+1]:=(p0[x*3+1]+p2[x*3+1]+p1[(x-1)*3+1]+p1[(x+1)*3+1])div 4;
          p1[x*3+2]:=(p0[x*3+2]+p2[x*3+2]+p1[(x-1)*3+2]+p1[(x+1)*3+2])div 4;
          end;
       end;
    end;
     
    procedure AntiAlias(clip: tbitmap);
    begin
     AntiAliasRect(clip,0,0,clip.width,clip.height);
    end;
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  5. #5
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut Lil_jam63!

    Je connais déjà cet algo (de JanFx) qui est en réalité un flou légé et non un vrai anti-aliasing. D'ailleurs, si tu utilises ce type de filtre dans le redimensionnement d'images, tu t'appercevras rapidement de la différence de qualité par rapport à un vrai anti-aliasing... d'où mes recherches. Merci qu'en même!
    De retour parmis vous après 10 ans!!

  6. #6
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'ai réussi à obtenir ce que je voulais sauf que le Bitmap se trouve maintenant retournée à 90° !!
    Je continu de chercher une solution. Si ça vous dit de m'aider, voici le code actuel :

    http://sub0.developpez.com/delphi/exe/TableA3.zip

    Merci d'avance!
    De retour parmis vous après 10 ans!!

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Le sujet m'intéresse beaucoup,

    Une piste peut-être, mais tu y avais peut-être pensé.

    http://homepages.borland.com/efg2lab...teScanline.htm

    Cordialement
    Loran

  8. #8
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Effectivement, ça pourrait-être une solution... ou en partie récupérer le code de la rotation qu'il me faut. Mais à vrai dire, je suppose qu'il doit avoir une solution sans ajouter du code, mais en le modifiant légèrement celui que j'ai déjà. C'est depuis que j'ai ajouté scanLine que le problème est apparu... Dans le code, il faut inverser quelque chose mais je n'arrive pas à trouver quoi... J'ai l'impression qu'il me manque un scanLine vertical en fait... Merci qu'en même pour le lien, j'espère tout de même pouvoir arriver à m'en passer.
    De retour parmis vous après 10 ans!!

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Tout à fait d'accord.
    Je dois dire que j'observe le code mais (pour l'instant) pas moyen de voir comment tourner l'image.
    J'ai tout juste réussi à tourner l'image dans l'autre sens, donc aucun intérêt.
    Je continue à chercher.
    Cordialement
    Loran

  10. #10
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Dans ta première boucle, tu as inversé l'accés X/Y dans Src.ScanLine

    Voici la boucle correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        ClusterY := MapY[J - DstRect.Top];
        For X := MapXLoPos To MapXHiPos Do
        Begin
          HorzBuffer[X - MapXLoPos].R := 0;
          HorzBuffer[X - MapXLoPos].G := 0;
          HorzBuffer[X - MapXLoPos].B := 0;
          For Y := 0 To Length(ClusterY) - 1 Do
          Begin
            SrcLine := src.ScanLine[ClusterY[Y].Pos];
            Inc(HorzBuffer[X - MapXLoPos].R, ClusterY[Y].Weight * SrcLine[X].rgbtRed);
            Inc(HorzBuffer[X - MapXLoPos].G, ClusterY[Y].Weight * SrcLine[X].rgbtGreen);
            Inc(HorzBuffer[X - MapXLoPos].B, ClusterY[Y].Weight * SrcLine[X].rgbtBlue);
          End;
        End;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Points : 50
    Points
    50
    Par défaut
    j'ai pas regardé ton code de pres mais GR32 fournis une procedure
    TBitmap32.Rotate
    peut etre y a il moyen d'adapter cette routine au tbitmap standard

  12. #12
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    BRAVO Nono40!!

    Je savais bien que tu allais trouver la solution étant l'expert de la manipulation d'image avec Delphi. Je m'étais un peu rapproché de la solution en utilisant Pixels, cependant, je me doutais bien qu'il y avait une solution en inversant des variables, sans arriver à trouver quoi. J'en profite donc pour vous donner l'archive avec le code corrigé. Peut-être serait-il intéressant de le diffuser dans la page des sources...

    http://sub0.developpez.com/delphi/AAlias.zip

    Merci à tous!
    De retour parmis vous après 10 ans!!

  13. #13
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Bonjour à tous! Pour info, j'ai modifié la fonction pour pouvoir utiliser des TBitmaps en 24 et 32 bits. Je compte maintenant pouvoir redimensionner des images avec un masque/couleur de transparence, en espèrant que l'affichage de la transparence alpha est déjà prise en compte par windows... Je prépare une démo. Si vous avez des remarques, des suggestions, je suis preneur!
    De retour parmis vous après 10 ans!!

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Salut Sub0,

    Super boulot que tu as fait !

    Depuis le temps que je voulais afficher des Metafile avec anti-aliasing, maintenant c'est fait !

    pour info j'en ai fait un composant, un TAAImage.

    Je le mettrai volontier à disposition mais je ne sais pas ou le stocker

    Cordialement,
    Loran

  15. #15
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    D'après ce que j'ai pu comprendre en regardant le code de la lib, on utilise une capture de l'arrière-plan pour combiner les pixels du masque de transparence avec ceux de l'arrière-plan... Le résultat est une image opaque même si elle paraît transparente. C'est d'ailleurs pour cette raison que la librairie possède un "ImgView"... Je vais essayer de coder la fonction d'affichage pour voir, à+
    De retour parmis vous après 10 ans!!

  16. #16
    Membre confirmé
    Avatar de sur_uix
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 550
    Points
    550
    Par défaut
    L'alog fonctionne très bien, par contre j'essais de le porter sous Delphi2005 et il y a quelque erreur.
    voici les modifs de Transforms.pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Interface Uses Windows, Math, Graphics, SysUtils, Classes,
                   System.Runtime.InteropServices;
    [old code]
    Interface Uses Windows, Math, Graphics, SysUtils, Classes;
    [/old code]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SrcLine, DstLine: IntPtr;//PIntegerArray;
      [old code]
      SrcLine, DstLine: PIntegerArray
    [/old code]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            ca := (Marshal.ReadInt32(SrcLine,X) And $FF000000) Shr 24;
            cr := (Marshal.ReadInt32(SrcLine,X) And $00FF0000) Shr 16;
            cg := (Marshal.ReadInt32(SrcLine,X) And $0000FF00) Shr 8;
            cb := (Marshal.ReadInt32(SrcLine,X) And $000000FF);
    [old code]
            ca := (SrcLine[X] And $FF000000) Shr 24;
            cr := (SrcLine[X] And $00FF0000) Shr 16;
            cg := (SrcLine[X] And $0000FF00) Shr 8;
            cb := (SrcLine[X] And $000000FF);[/old code]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          Marshal.WriteInt32(DstLine,I,(Ca Shl 8) Or (Cr) Or (Cg Shr 8) Or (Cb Shr 16));
    [old code]
          DstLine[I] := (Ca Shl 8) Or (Cr) Or (Cg Shr 8) Or (Cb Shr 16);[/old code]
    Voici le résultat

  17. #17
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'ai ajouté tes modifications dans les sources originales grâce à la directive {$IFDEF VER170}. Quand tu auras un peu de temps libre, si tu pouvais l'essayer pour me confirmer que la nouvelle unité fonctionne bien avec D2005 s'il te plait. C'est la même adresse :

    http://sub0.developpez.com/delphi/AAlias.zip

    De retour parmis vous après 10 ans!!

  18. #18
    Membre confirmé
    Avatar de sur_uix
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 550
    Points
    550
    Par défaut
    Hourrrrrraaaaaaaaaaaa j'ai trouvé, le problème provient de la lecture depuis le pointeur, pour passer au integer suivant, avec Dot.Net la lecture d'un pointeur ce fais de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Marshal.ReadInt32(SrcLine,X);
    Et il faut faire attention avec l'offset, X dans mon cas. La doc MSDN nous apprend que l'offset c'est "An additional byte offset" et oui un byte, et moi je veux lire l'int32 suivant, donc je dois faire X*4 (4 byte = 32Bits...)

    J'ai donc fais ceci pour la lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Marshal.ReadInt32(SrcLine,X*4)
    et pour l'écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Marshal.WriteInt32(DstLine,I*4,((Ca Shl 8) Or (Cr) Or (Cg Shr 8) Or (Cb Shr 16)));
    Et ça marche......
    ça fais deux jours que j'essais de migrer janFX sous Dot.Net, mais je crois que je vais garder Transform.pas

  19. #19
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'ai donc remodifié l'unité.
    Confirme-moi qu'elle fonctionne stp, je n'ai pas D2005 installé...

    [EDIT]
    J(utilise aussi le multiplicateur * 4 pour les images 32 bits si j'utilise pByteArray.
    D'ailleurs, peut-être que ce type est compatible avec D2005...
    Je vais modifié l'unité avec ce dernier pour voir (merci de la tester).
    De retour parmis vous après 10 ans!!

  20. #20
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Voici la version avec pByteArray.
    Je pense qu'elle fonctionne avec D2005, non ?

    http://sub0.developpez.com/delphi/AAlias.zip
    De retour parmis vous après 10 ans!!

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

Discussions similaires

  1. Redimensionnement d'image avec filtres anti-aliasing
    Par Sub0 dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 11/02/2013, 16h35
  2. [DirectX9] Anti-aliasing + gestion caméra
    Par SteelBox dans le forum DirectX
    Réponses: 6
    Dernier message: 21/07/2005, 00h56
  3. Anti aliasing qui ne fonctionne pas
    Par Deus Ex Makina dans le forum OpenGL
    Réponses: 3
    Dernier message: 27/04/2005, 09h57
  4. filtre anti-aliasing
    Par MO GV dans le forum MFC
    Réponses: 14
    Dernier message: 04/03/2005, 19h21
  5. Anti-aliasing
    Par Cazman dans le forum OpenGL
    Réponses: 16
    Dernier message: 27/04/2004, 08h30

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