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

 Delphi Discussion :

[D7 DelphiTwain] Scan d'une portion d'image


Sujet :

Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut [D7 DelphiTwain] Scan d'une portion d'image
    Bonjour,

    avec DelphiTwain, je cherche à scanner une partie de mon image. J'utilise la fonction SetImagelayoutFrame(Left, Top, Right, Bottom).

    Left et Top fonctionne bien : le scan commence à cet endroit. Par contre quelle que soient les valeurs de Right et Bottom le scan va jusqu'en bas de la page A4

    Est ce un bug de Delphi Twain ?

    Voici mon code :

    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
    procedure TF_Princ.Btn_ApercuClick(Sender: TObject);
    var
      x,y : Extended;
      x11,y11 : Extended;
      x00,y00 : Extended;
      Scanner : Integer  ;
      R : Integer ;
      Return1 : Extended ;
    begin
      Scanner := 0 ;
      X := 2 ;
      Y := 2 ;
      X00 := 4 ;
      Y00 := 4 ;
      if Twain.LoadLibrary then
        begin
          Twain.LoadSourceManager();
          if scanner <> -1 then Twain.Source[scanner].Loaded := True ;
          Twain.Source[scanner].SetIPixelType(tbdRGB);
          Twain.Source[scanner].ShowUI:= False;
          Twain.Source[scanner].SetICapUnits(tuCentimeters) ;
          Twain.Source[scanner].GetIXResolution(Return1,Resolutions) ;
          R := 100 ;
          If High(Resolutions) >0 Then R := Round(Resolutions[0]) ;
          // Pour voir : 
          Twain.Source[scanner].GetIPhysicalHeight(y11,rcGet);
          Twain.Source[scanner].GetIPhysicalWidth(x11,rcGet);
          Twain.Source[scanner].SetIXResolution(R);
          Twain.Source[scanner].SetIYResolution(R);
          Twain.Source[scanner].SetImagelayoutFrame(X, Y, X00, Y00);
          Twain.Source[scanner].TransferMode :=ttmMemory;
          Twain.Source[scanner].Enabled := True;
        end
      else ShowMessage('Scan impossible');
    end;
    A+
    Charly

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    As-tu vérifier que chaque function avec un retour donne un retour de type succès ?
    Par exemple SetICapUnits / GetICapUnits retourne crSuccess mais aussi 6 autres valeurs indiquant une erreur

    il faut trouver écrire un code qui gère les codes d'erreur à chaque étape, même si c'est un peu lourd, car l'erreur que tu observes est peut-être le résultat d'un problème avant
    Est-ce que le changement d'unité est pris en compte
    Est-ce que GetICapUnits retourne tuCentimeters dans Supported ?

    SetImagelayoutFrame retourne crSuccess mais aussi 6 autres valeurs indiquant une erreur, il faut vérifier le retour, étape par étape

    On découvre même qu'il y a eu un bug à ce sujet : https://github.com/twain/twain-samples/issues/15
    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

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Merci Shai,
    je vais tester les codes de retour
    A+
    Charly

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Effectivement, j'ai 2 erreurs :

    Fonction SetIPixelType code de retour : crSucess
    Fonction SetICapUnits code de retour : crBadOperation
    Fonction GetIXResolution code de retour : crSucess
    Fonction GetIPhysicalHeight code de retour : crSucess
    Fonction GetIPhysicalWidth code de retour : crSucess
    Fonction SetIXResolution code de retour : crSucess
    Fonction SetIYResolution code de retour : crSucess
    Fonction SetImagelayoutFrame code de retour : crBadOperation
    Je vais creuser

    A+
    Charly

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bon, SetICapUnits n'accepte pas tuCentimeters mais avec tuInches plus d'erreur .

    Mais ça ne répare pas SetImagelayoutFrame qui renvoie crBadOperation quels que soient les paramètres !

    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
    function TTwainSource.SetImagelayoutFrame(const fLeft, fTop, fRight,
      fBottom: double): TCapabilityRet;
    var ImageLayout: TW_IMAGELAYOUT;
    begin
     if not Loaded then
      begin
       Result := crInvalidState;  {In case the source is not loaded}
       exit;
      end;
     
     fillchar({%H-}ImageLayout,sizeof(TW_IMAGELAYOUT),0);
     with ImageLayout.Frame do
      begin
       Left:=FloatToFIX32(fLeft);
       Top:=FloatToFIX32(fTop);
       Right:=FloatToFIX32(fRight);
       Bottom:=FloatToFIX32(fBottom);
      end;
     {Call method and store return}
     Result := ResultToCapabilityRec(Owner.TwainProc(AppInfo, @Structure,
          DG_IMAGE, DAT_IMAGELAYOUT, MSG_SET, @ImageLayout));
    end;
     
    {Converts from a result to a TCapabilityRec}
    function TTwainSource.ResultToCapabilityRec(
      const Value: TW_UINT16): TCapabilityRet;
    begin
     
      {Test result code to return}
      case Value of
        {Successull, copy handle and return a success value}
        TWRC_SUCCESS: Result := crSuccess;
        {Error, get more on the error, and return result}
        {case} else
          case GetReturnStatus() of
             TWCC_CAPUNSUPPORTED: Result := crUnsupported;
             TWCC_CAPBADOPERATION: Result := crBadOperation;
             TWCC_CAPSEQERROR: Result := crDependencyError;
             TWCC_LOWMEMORY: Result := crLowMemory;
             TWCC_SEQERROR: Result := crInvalidState;
             else Result := crBadOperation;
          end {case GetReturnStatus of}
      end {case};
     
    end;
    je ne sais pas comment corriger le code (si c'est ça qui ne va pas )

    A+
    Charly

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Si je mets fLeft à 0, on scan bien jusqu'à fRight
    si je mets autre chose de positif, alors fRight n'est pas pris en compte et on scanne jusqu'à la largeur totale de la page.

    Même chose pour fTop et fBottom

    Il doit y avoir un bug ? j'ai beau chercher sur le net je ne trouve rien ?

    A+
    Charly

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Cela peut être aussi une impossible de scanner en lui-même

    Tu peux récupérer l'image entière et tenter d'extraire toi même la section souhaité, le canvas peut fonctionner aussi en mm au lieu de pixel

    Soit via SetMapMode MM_LOMETRIC / MM_HIMETRIC, cela inverse aussi le sens de X ou Y, je ne sais plus comment

    Sinon, tu peux travailer en pixel et faire manuellement les conversions voir GetDeviceCaps HORZSIZE, VERTSIZE, LOGPIXELSX, LOGPIXELSY et une petite convertion 1 inch 263 = mm
    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

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Oui, merci pour l'idée, je vais extraire la partie de l'image Bmp

    A+
    Charly

Discussions similaires

  1. Dessiner une portion d'image dans une autre image
    Par Harry_polin dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 24/11/2009, 13h19
  2. Charger une portion d'image
    Par eddie5150 dans le forum Java ME
    Réponses: 4
    Dernier message: 09/06/2008, 13h29
  3. [C#][GDI+]Capture d'une portion d'image
    Par WOLO Laurent dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/11/2007, 08h29
  4. [Java2D]Dessiner une portion d'image
    Par Guybrush dans le forum 2D
    Réponses: 4
    Dernier message: 27/03/2007, 22h58
  5. [winform][dotnet] afficher une portion d'image zoomée
    Par maxdwarf dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/02/2007, 17h13

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