Einzelnen Beitrag anzeigen

hboy

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

AW: TWAIN-Problem (TDelphiTwain versagt)

  Alt 24. Sep 2010, 13: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 16:32 Uhr)
  Mit Zitat antworten Zitat