AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia TWAIN-Problem (TDelphiTwain versagt)

TWAIN-Problem (TDelphiTwain versagt)

Ein Thema von hboy · begonnen am 3. Sep 2010 · letzter Beitrag vom 6. Okt 2010
Antwort Antwort
Seite 1 von 2  1 2   
hboy

Registriert seit: 16. Jan 2004
364 Beiträge
 
#1

TWAIN-Problem (TDelphiTwain versagt)

  Alt 3. Sep 2010, 17:12
Hi,

momentan versuche ich meinem Bildverarbeitungsprogramm TWAIN import beizubringen, leider gibt es da ein gewaltiges Problem: der TWAIN import sollte nur ein kleines "nice-to-have" sein und ich dachte, dass die DelphiTwain-Komponente genau das richtige wäre.

Nun hat sich aber herausgestellt, dass die Implementierung nicht mit dem Leica DFC Twaintreiber klarkommt und das bereitet mir ernsthafte Magenschmerzen, denn weder mein selbstgefummeltes Programm, noch die Beispielprogramme zur Komponente können das Bild überhaupt importieren. Die TWAIN sample application von twain.org ist zwar merklich langsamer, kann allerdings immerhin ein Bild in eine Datei schreiben (ich gehe davon aus, dass der Importmodus schon so gewählt ist).

Bevor ich mich nun also durch tonnenweise C++ Beispielcode wühle - hat jemand schon Erfahrungen mit TWAIN gemacht, da der Import von Bildern mit dem Beispielcode nicht funktionierte?


schonmal ein dickes Danke für eure Hilfe!
hboy


ps.
http://delphitwain.sourceforge.net/
http://twain.org/
Power is nothing without TControl
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#2

AW: TWAIN-Problem (TDelphiTwain versagt)

  Alt 3. Sep 2010, 18:35
Hallo...

so einfach läßt sich das nicht sagen was zu tun ist. Zeig mal deinen Code und dann schaun wir mal. Ich hatte mal Probleme mit einem Twain Treiber der den Scanner via IP ansprach. Letztendlich war ein wenig Umstellen angesagt.

...schaun wir mal
  Mit Zitat antworten Zitat
helgew

Registriert seit: 30. Jul 2008
125 Beiträge
 
#3

AW: TWAIN-Problem (TDelphiTwain versagt)

  Alt 3. Sep 2010, 19:42
- -

Geändert von helgew ( 4. Sep 2010 um 09:06 Uhr)
  Mit Zitat antworten Zitat
hboy

Registriert seit: 16. Jan 2004
364 Beiträge
 
#4

AW: TWAIN-Problem (TDelphiTwain versagt)

  Alt 4. Sep 2010, 09:13
Delphi-Quellcode:
procedure TForm1.OnTwainAcquire(Sender: TObject; const Index: Integer;
      Image: TBitmap; var Cancel: Boolean);
var
  newidx: integer;
  datestr: string;
  devname: string;
begin
// ...
   glm.Layers[newidx].data.Canvas.Draw(0,0,image);
//...

  Cancel := False;
  TwainHelper.FinishAcquisition;
end;

sorry, dass der code auf sich warten lassen musste, ich war nicht zuhause am PC und hatte unterwegs auch nur das compilierte Programm dabei.
Meine Implementierung ist recht simpel vom Beispielcode abgeleitet, ich mache auch keine Einstellungen und so ganz zufrieden bin ich damit natürlich nicht.
Da aber auch das "fullfeatures"-Beispiel mit allen verschiedenen Modi nicht hinkriegt, ein Bild zu importieren, zweifle ich etwas daran, ob es so sinnvoll ist, mit TDelphiTwain weiterzumachen Vielleicht muss ich doch den anderen code mal fläddern.

Nochmal zur Problembeschreibung:
Die Quellenauswahl klappt soweit, sobald ich beim UI der Kamerasoftware auf "transferieren" klicke läuft eine Progressbar bis 60..80%, danach verschwindet der Dialog und weiter passiert nichts, es gibt auch keine Fehlermeldung. Es gibt von Leica auch einen dummytreiber, der eine Kamera simuliert, die sich gleichermaßen bockig stellt. Ich schaue mal, ob der irgendwo zu bekommen ist, damit kann man zumindest mal Trockenübungen machen.

ps.
unter http://www.leica-microsystems.com/pr...-hd/downloads/ gibt es den DFCTwain7.2 Treiber mit Demokamera.
Angehängte Dateien
Dateityp: pas TwainHelper.pas (2,6 KB, 14x aufgerufen)
Power is nothing without TControl
  Mit Zitat antworten Zitat
hboy

Registriert seit: 16. Jan 2004
364 Beiträge
 
#5

AW: TWAIN-Problem (TDelphiTwain versagt)

  Alt 23. Sep 2010, 21:48
Nun denn,

ich habe die Chose noch etwas massiert und bin an der Stelle angelangt, dass

Delphi-Quellcode:
{Transfer image memory}
function TTwainSource.TransferImageMemory(var ImageHandle: HBitmap;
  PixelType: TW_INT16): TW_UINT16;
var
 {...}
begin
  {Obtain information on the transference buffers}
  Result := Owner.TwainProc(AppInfo, @Structure, DG_CONTROL, DAT_SETUPMEMXFER,
    MSG_GET, @Setup);
 {...}
mir nur TWRC_FAILURE zurückliefert, das wäre der Anfang des Transferprozesses. Ich war so frei, noch messageboxes einzuführen, die mir zunächst den Wert von GetReturnStatus anzeigen, bis ich dann herausgefunden habe, dass der Rückgabewert von TwainProc, der aussagt, ob diese überhaupt erfolgreich war, weggeworfen wird und so Phantasiewerte für den TW_STATUS.ConditionCode rauskommen.

Meine Vermutung wäre, dass die Twainquelle (Leica DFC Demokamera) es schon nicht hinbekommt, in den bereitgestellten Speicher zu schreiben und dann abbricht - wenn nicht schon vorher. Ich habe auch schon etwas im funktionierenden c++-Code der Testapplikation von twain.org herumgelesen, allerdings ohne Erfolg. Kann mir jemand einen Ratschlag geben, wie ich weiter debuggen kann, ohne die 664 Seiten der Twain 2.1 Spezifikationen durchzulesen?

Danke schonmal.

ps. das Bitmap wird, soweit ich es auf den ersten Blick beurteilen konnte, noch korrekt erzeugt, wenn man den return code überschreibt, kommt ein schwarzes Bild an, das einen korrekten Header hat. Irgendwas geht zwischen dem Start der GUI und dem Callback kaputt...
Power is nothing without TControl

Geändert von hboy (23. Sep 2010 um 21:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#6

AW: TWAIN-Problem (TDelphiTwain versagt)

  Alt 23. Sep 2010, 22:04
Zitat:
glm.Layers[newidx].data.Canvas.Draw(0,0,image);
...was passiert denn, wenn du zu Testzwecken einfach mal ein TImage auf die Form nachst und image dem TImage zuweist ?
  Mit Zitat antworten Zitat
hboy

Registriert seit: 16. Jan 2004
364 Beiträge
 
#7

AW: TWAIN-Problem (TDelphiTwain versagt)

  Alt 23. Sep 2010, 22:54
...was passiert denn, wenn du zu Testzwecken einfach mal ein TImage auf die Form nachst und image dem TImage zuweist ?
OnTwainAcquire wird nicht einmal aufgerufen. In TransferImageMemory wird versucht, an TW_SETUPMEMXFER und TW_IMAGEMEMXFER - Strukturen heranzukommen, dabei liefert die TwainProc einen Fehler zurück und durch
Delphi-Quellcode:
  if Result <> TWRC_XFERDONE then
    DeleteObject(ImageHandle);
wird der angelegte Buffer verworfen, der Rückgabewert von TransferImageMemory ist TWRC_FAILURE und das wars. Wenn man der Transfervorbereitungsfunktion ein TWRC_SUCCESS unterjubelt, kommt ein mit $00 gefüllter Puffer an.

Ich tappe leider noch ziemlich im Dunkeln, warum nun eigentlich ein Fehler auftritt. Denkbar wäre, dass sich die Implementierung von Leica den Puffer oder irgendwelche flags anders vorgestellt hätte und schon vor dem Transfer den Modus verlässt, in welchem die Strukturinformationen verfügbar sind.
Power is nothing without TControl
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#8

AW: TWAIN-Problem (TDelphiTwain versagt)

  Alt 24. Sep 2010, 07:24
Zitat:
OnTwainAcquire wird nicht einmal aufgerufen
...dann bin ich mal schlichtweg überfragt, sorry
  Mit Zitat antworten Zitat
hboy

Registriert seit: 16. Jan 2004
364 Beiträge
 
#9

AW: TWAIN-Problem (TDelphiTwain versagt)

  Alt 24. Sep 2010, 11:19
Dennoch Danke für die Bemühungen

Ich habe die Geschichte noch etwas weiter verfolgt und schrittweise die Werte beäugt, alles scheint gut zu gehen, bis in TransferImageMemory
Delphi-Quellcode:
      {Retrieve another piece of memory to the pointer}
      Xfer.BytesWritten := 0;
      Result := Owner.TwainProc(AppInfo, @Structure, DG_IMAGE,
        DAT_IMAGEMEMXFER, MSG_GET, @Xfer);
aufgerufen wird.
Power is nothing without TControl
  Mit Zitat antworten Zitat
hboy

Registriert seit: 16. Jan 2004
364 Beiträge
 
#10

AW: TWAIN-Problem (TDelphiTwain versagt)

  Alt 24. Sep 2010, 12:23
Ich habe nun ein Bild (die Lösung ist denkbar einfach gewesen und obendrein recht dämlich: der Leica DFC TWAIN-Treiber unterstützt ttmMemory nicht - nur ttmNative. Die Demokamera funktioniert nun, ich hoffe, dass es im echten Leben dann auch tut...). Die Auflösung lässt sich nicht ändern und es dauert auch eine Sekunde zum herausleiern, aber es tut soweit.

In TransferImageMemory habe ich diesen Block hinzugefügt, durch den man auf die Nichtanwendbarkeit vom ttmMemory Transfermode hingewiesen wird.
Delphi-Quellcode:
 {...}
      end {TWRC_SUCCESS}
      else
      begin
        if Result = TWRC_FAILURE then
        begin
          // TWCC_ constant
          if GetReturnStatus <> $FFFF then
            Windows.MessageBox(0,PChar('Error '+IntToStr(GetReturnStatus)),
                'Acquisition error',0)
          else
            Windows.MessageBox(0,'An error occured in TransferImageMemory.'+
                #13#10'Aditionally, GetReturnStatus failed.','Acquisition error',0);
        end;
      end;
 {...}
In DelphiTwain.pas habe ich GetReturnStatus modifiziert:
Delphi-Quellcode:
{Returns return status information}
function TTwainSource.GetReturnStatus: TW_UINT16;
var
  StatusInfo: TW_STATUS;
  rc : TW_UINT16;
begin
  {The source must be loaded in order to get the status}
  if Loaded then
  begin
    {Call method to get the information}
    rc := Owner.TwainProc(AppInfo, @Structure, DG_CONTROL, DAT_STATUS, MSG_GET,
      @StatusInfo);
    Result := StatusInfo.ConditionCode;
    if rc <> TWRC_SUCCESS then Result := $FFFF; // bad things have happened
  end else Result := 0 {In case it was called while the source was not loaded}
end;

Mit der Wandlungsroutine für Fix32 bin ich auch noch nicht zufrieden, sie scheint irgendwie falsch zu sein. Ich habe mich mal an die Implementierung von GIMP gehalten:
Delphi-Quellcode:
//Convert from extended to Fix32
function FloatToFIX32(floater: Extended):TW_FIX32;
begin
  result.Whole := trunc(floater);
  result.Frac := round( abs(floater - trunc(floater)) * 65536.0 ) and $FFFF;
end;

//Convert from twain Fix32 to extended
function FIX32ToFloat(Value : TW_FIX32):Extended;
begin
  if Value.Whole < 0 then // remember that frac part is unsigned
    Result := Value.Whole - Value.Frac / 65536.0
  else
    Result := Value.Whole + Value.Frac / 65536.0;
end;
Power is nothing without TControl

Geändert von hboy (24. Sep 2010 um 15:32 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz