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

Turbo Pascal Discussion :

[TP]Zoom in, Zoom out!


Sujet :

Turbo Pascal

  1. #1
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut [TP]Zoom in, Zoom out!
    Salut!

    Voilà, j'affiche correctement un BMP à l'écran en utilisant l'adressage direct de la mémoire avec le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    VGAMemory = Array[0..199,0..399] of Byte Absolute $A000:0000;
    Je définis également la possibilité d'utiliser les touches + et - pour effectuer un Zoom mais seulement lorsque j'effectue un zoom in, je perds beaucoup en qualité d'image et les pixels sont saccadés. (pour le faire, je fais une transformation des rectangles d'affichage c'est à dire que le rectangle original d'affichage qui a pour dimensions 320*200 par défaut est trabsformé à chaque fois par un rectangle plus petit)

    J'aimerai donc savoir s'il y'a un moyen plus pratique d'effectuer un zoom tout en conservant la qualité d'image.

    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Par défaut
    Il faudrait un peu plus de précisions !
    Quel mode graphique utilises-tu ?
    En plus la déclaration de ton tableau est un peu étrange car l'écran ne fait que 320*200 comme tu l'as dit toi même pas 200*400
    Ensuite quelle fonction utilises-tu pour faire un zoom ?

    a+

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 999
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Pour conserver une certaine qualité d'image en zoomant "out" à partir d'une image de départ, tu dois décider d'une méthode de compression.
    Simplement réduire le nombre de pixels ne donnera rien de très joli; il faut analyser l'image pour dégager les différents contours, les différentes zones, etc, etc.
    Cela ne me semble pas évident ! Il existe probablement des algos sur le Net (ou même sur ce forum).

    Pour le zoom "in", tu pourrais conserver en mémoire les images compressées pendant le zoom "out".
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Membre Expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Par défaut
    Comme le dit Alcatîz, il va falloir décider d'un algorithme pour le zoom. La méthode la plus basique consiste à grossir les pixels visibles en gros carrés. Ce n'est pas très esthétique.

    Il va falloir penser à utiliser un filtre d'atténuation, etc...

    Va faire un tour sur le forum algo, il doit y avoir des pros qui trainent

    A+

  5. #5
    Membre Expert
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Par défaut
    Bonjour,

    La méthode avec un rapport complexité/qualité très satisfaisant est ce que l'on appelle Anti Aliasing. Le principe est simple : on prend un point de l'écran, on fait la moyenne des valeurs R,V et B des pixels du dessus, de gauche, de droite et du dessous et on on remplace la couleur du point à "traiter" par cette moyenne RVB.

    Je n'ai pas d'exemple de code sous la main mais ça doit être faisable je pense

    Bon courage

  6. #6
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut
    Eh ben dis dons, je ne pensais pas que cà demanderais autant de chose .

    En fait, l'affichage des pixels se fait par cette boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    For y:=0 to ShowHeigth - 1 Do Begin
    	Seek(BMPFile, HeaderSize + FileWidth*(Heigth - y - 1); (*Pour se placer dans le bon endroit qu fichier qui contient le BMP *)
    	For x:=0 to ShowWidth - 1 Do BlockRead(BMPFile, Pixel, SizeOf(Pixel));
    	ScreenMemory[y,x] := Pixel;
    End;
    où Pixel est de type Byte et SreenMemory est un tableau [0..199,0..319] qui référence tout l'écran.

    Et donc pour afficher seulement une partie de l'écran, je faisais comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	VgaMemory[50*y+60,50*x+60] := Pixel;
    par exemple. (et le résultat n'est vraiment pas très joli )

    Je me trouve en résolution 320*200 effectivement, j'ai fait une erreur dans mon premier post.

    Une idée que j'avais d'abord eu était de déterminer les points qui étaient les moins lumineux et lorsque je fais un zoom in, je n'affiche pas leur pixels, mais depuis je me casse la tête dessus.
    Je pense que je vais regarder du côté du filtre et de l'antialiasing...

    Merci.

  7. #7
    Membre Expert
    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 : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Salut!
    http://homepages.borland.com/torry/v...ects/janfx.zip (19 ko)
    C'est une unité pour Delphi à la base, mais le code est facilement portable je suppose...
    Sinon, va regarder dans les swags, je suis persuadé que tu trouveras tout ce dont tu as besoin...
    à+

  8. #8
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut
    Merci beaucoup pour le lien Sub0...

    J'ai regardé dans les swags que j'ai et apparemment je n'ai pas la collection qui traite des graphiques, je pense que je vais télécharger un autre.

    Merci.

  9. #9
    Membre Expert
    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 : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Désolé pour le Up du sujet, mais as-tu trouvé quelque chose depuis ?

    Je possède un algo d'anti-aliasing, mais il s'agit d'un flou légé en réalité.
    J'ai trouvé une librairie Delphi avec les sources (Graphics32) qui possède un vrai anti-aliasing (vraiment superbe)...
    Voici la démo : http://sub0.developpez.com/delphi/exe/gr32_alias.zip

    Seulement, je voudrais récupérer l'ago uniquement, ce n'est pas évident!

    Si vous pouviez m'aider dans cette recherche, ça serait vraiment cool !

    ps: J'ai décidé de poser la question dans le forum algoritmes... ICI

  10. #10
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut
    Citation Envoyé par Sub0
    Désolé pour le Up du sujet, mais as-tu trouvé quelque chose depuis ?
    Non finalement Le projet (en Pascal) avait été abandonné, on était passé à Delphi (en utilisant ZImage pour le zoom)...

    Citation Envoyé par Sub0
    Seulement, je voudrais récupérer l'ago uniquement, ce n'est pas évident!
    Probablement, tu auras une solution dans le forum algorithme.

  11. #11
    Membre Expert
    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 : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Je suis arrivé à obtenir le programme simplifié de ce que je veux comme fonction, mais la librairie utilise toutes ses unités... Cela ne va pas être simple pour simplifier la librairie afin de récupérer que le code nécessaire pour le filtre. Peut-être connais-tu un programme capable de faire le ménage dans un projet, non? Il me semble de ce genre d'appli existe... Qu'en penses-tu ?


    On m'a répondu dans le forum algo, mais ça reste assez "flou" pour le moment. Je suis encore loin d'avoir un code fonctionnel si je me base sur ces réponses. Mais je ne désespère pas.

    Sinon, me reste la solution de faire une DLL pour regrouper la lib dans un seul fichier, mais bon, je n'aurais rien compris au fonctionnement du filtre et cette solution m'intéresse moyen.

  12. #12
    Membre Expert
    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 : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Avec graphics32, l'anti-aliasing se trouve dans l'unité GR32_Transforms.pas. J'ai simplifié le code :
    http://sub0.developpez.com/delphi/exe/TableA.zip

    Je cherche maintenant pouvoir utiliser la fonction avec un TBitmap standard puisque je n'ai pas besoin de gérer le masque de transparence pour le moment. Je pense que par la suite, je proposerai le code dans la page des sources Delphi...

    à+

  13. #13
    Membre Expert
    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 : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    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!

  14. #14
    Membre Expert
    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 : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Merci à Nono40 pour avoir trouvé la solution !

    http://www.developpez.net/forums/vie...721740#1721740

    -> Sujet résolu, à+

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

Discussions similaires

  1. [Débutant] zoom in ,zoom out picturebox
    Par btisssam dans le forum C#
    Réponses: 0
    Dernier message: 12/08/2014, 15h26
  2. [ginput] Problème avec pan, zoom in, zoom out
    Par mathwork dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 14/09/2011, 20h48
  3. Birt Chart: Zoom IN/ Zoom Out
    Par sam1980 dans le forum BIRT
    Réponses: 0
    Dernier message: 18/11/2009, 11h02
  4. Comment faire un zoom in/out
    Par mundu dans le forum Java ME
    Réponses: 0
    Dernier message: 22/02/2009, 17h51
  5. Zoom-in Zoom-out
    Par MarcAn dans le forum 2D
    Réponses: 2
    Dernier message: 25/04/2006, 03h34

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