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

Composants VCL Delphi Discussion :

GR32 et rotation d'image


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut GR32 et rotation d'image
    Bonjour,

    Je souhaite faire une rotation sur un TImage (en gardant la transparence).

    Super simple sur Firemonkey.. cela se complique sur VCL.

    J'utilise actuellement Gaphics32 dont la dernière version date de 2012 .. et je ne trouve pas pour faire la rotation de manière "propre".

    A chaque fois je perd la transparence et le tour devient noir ..

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Il suffit que je poste pour trouver .. il y a un peu de lag mais cela fonctionne :

    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
    procedure Rotation(angle: integer; PictureSource: TPicture);
    type
      TRGBArray = ARRAY[0..10000] of TRGBTriple;
      pTRGBArray = ^TRGBArray;
      TArrayLigneCible = Array[0..10000] of pTRGBArray;
     
    var
      BitmapSource, BitmapCible : TBitmap;
      x,y : integer;
      LigneSource, LigneCible : pTRGBArray;
     
    begin
     
      BitmapSource := TBitmap.Create;
      BitmapCible := TBitmap.Create;
     
      try
        BitmapSource.assign (PictureSource.Graphic);
        BitmapSource.pixelformat := pf24bit;
        BitmapCible.pixelformat := pf24bit;
     
        BitmapCible.Height := BitmapSource.Width;
        BitmapCible.Width := BitmapSource.Height;
     
        for y:=0 to BitmapSource.Height - 1 do
        begin
          LigneSource := BitmapSource.ScanLine[y];
          for x:=0 to BitmapSource.Width - 1 do
          begin
            if (angle > 0) then
            begin
              LigneCible := BitmapCible.ScanLine[x];
              LigneCible[BitmapSource.Height - 1 - y] := LigneSource[x];
            end
    	      else
            begin
              LigneCible := BitmapCible.ScanLine[BitmapSource.Width - x - 1];
              LigneCible[y] := LigneSource[x];
            end;
          end;
        end;
        PictureSource.assign(BitmapCible);
      finally
        BitmapSource.free;
        BitmapCible.free;
      end;
    end;

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 124
    Par défaut
    C'est une rotation à +90° ou -90° ?

    As-tu essayé les fonctions intégrées à l'OS comme SetWorldTransform et son XFORM structure comme dans le sujet Rotation d'image avec bitblt/xform ou le sujet [débutant] Traitement d'image: WMF ou bmp?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Invité
    Invité(e)
    Par défaut
    Hélas oui j'ai posté trop vite ... +90 et -90 ..

    Je test ce que tu m'as donné et je reviens vers toi

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 797
    Par défaut
    Non te prends pas le chou avec les solutions de ShaiLeTroll: (Image32 + scanline) == la méthode la plus rapide

    Entoure ton code avec des BeginUpdate/ EndUpdate et passe par une variable pour récupérer chaque ligne/ chaque scanline (Gr32::PColor32Array)


    Édit: Après peut-être que l'idée c'est de passer par "Sampling and Rasterization" mais ce n'est pas super clair, il n'y a pas d'exemples clairs

  6. #6
    Invité
    Invité(e)
    Par défaut
    Pas top la documentation en effet ..

    J'avais essayé ca, mais le tour reste tout noir, impossible d'avoir la transparence :/
    http://graphics32.org/documentation/...ods/Rotate.htm

    Une fois que j'ai fait mon Scanline il faut que je calcul ou mettre le point ?

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

Discussions similaires

  1. Librairie pour manipuler les images
    Par maa dans le forum C#
    Réponses: 3
    Dernier message: 11/04/2008, 19h33
  2. librairie pour traitement d'image
    Par isoman dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 21/03/2008, 18h09
  3. librairie pour image svg
    Par robert_trudel dans le forum Multimédia
    Réponses: 8
    Dernier message: 07/07/2006, 04h15
  4. Algorithme pour rotation image en C
    Par guigui01 dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 22/04/2006, 15h41
  5. Recherche librairies pour les images
    Par mathieu_t dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 16/08/2004, 22h14

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