Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

escanear con alimentador varias hojas

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: escanear con alimentador varias hojas Responder citando

He utilizado la rutina para escanear imagenes que Leo puso en el foro y que utiliza el standard twain una imagen va perfecto, pero con un alimentador automatico, con la segunda imagen se para cuando llega al 20% de captura y no se como detectar que el escaner a enviado una y decirle que capture la siguiente, y así hasta que no queden más hojas en el alimentador.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Pongo aquí el enlace a la versión modificada por sisabb que permite escanear varias páginas usando el alimentador automático:

http://telefonica.net/web/ljfg/temp/cap_twain_sisabb.zip
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Twain Responder citando

Alguien tiene versión modificada por sisabb para Escanear.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Código:

   TTwain twain;
    String s;

    if ( twain.LoadTwainModule() )
    {
         try
         {
             Enabled = false;
             twain.OpenSourceManager();
             s = twain.GetSource(false);
             if (s == "")
                   return;
             twain.SelectSource(s);
             twain.OpenSource();

             twain.Imagenes=0;           //- CAMBIO sisabb - Pongo a 0 el contador de imagenes
             twain.MasImagenes=true;     //- CAMBIO sisabb - Variable para indicar cuando no quedan más imagenes
                              //- CAMBIO sisabb - Tomo el nombre generico de los ficheros de Salida,
                                             //el asterisco lo sustituira por el numero de página
            twain.DirImagen=IncludeTrailingBackslash(ExtractFileDir(Application->ExeName))+"tmpImg\\"+AnsiString("doc_*.jpg");
            twain.jpgCalidad=100;
            if(!TieneAcceso)
                twain.EnPrueba = true;
            else
                twain.EnPrueba = false;
            twain.imgLOGO = imgLOGO;
            twain.ListDocumentos = ListBoxDocumentos;
            twain.AcquireToImage();    //- CAMBIO sisabb - Ya no seria necesario pasar TImage a la funcion
                                    // a no ser que quisieramos ir copiando en ella el
                                    // resultado del ultimo escaneo.
         }
         __finally
         {
            Enabled = true;
            twain.CloseTwainSession();
            twain.UnLoadTwainModule();
         }
   }
   else
      throw Exception("Error al cargar TWAIN_32.DLL");
Volver arriba
Ver perfil de usuario Enviar mensaje privado Dirección AIM
Mensaje    Asunto: Responder citando

Código:

//---------------------------------------------------------------------------
// _Leo Software (info@leosoftware.com)
//---------------------------------------------------------------------------
#pragma hdrstop

#include <windows>
#include <forms>
#include <math>
//#include <Strsafe>
#include <jpeg>       //- CAMBIO sisabb -

#include "utwain.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)

//---------------------------------------------------------------------------
TTwain::TTwain()
{
    _bShowHideUi = true;

    ZeroMemory(&appId, sizeof(TW_IDENTITY));
    appId.Id = 0;
    appId.Version.MajorNum = 1;
    appId.Version.MinorNum = 0;
    appId.Version.Language = TWLG_SPANISH;
   appId.Version.Country = TWCY_SPAIN;
    lstrcpyA(appId.Version.Info, "(vacio)");
   lstrcpyA(appId.Manufacturer, "MYF Software");
    lstrcpyA(appId.ProductFamily, "(vacio)");
    lstrcpyA(appId.ProductName, AnsiString(Application->Title).c_str());

   _hDll = NULL;
   DsmEntry = NULL;

    ZeroMemory(&sourceId, sizeof(TW_IDENTITY));
}

//---------------------------------------------------------------------------
bool TTwain::LoadTwainModule(void)
{
    _hDll = LoadLibrary(TEXT("TWAIN_32.DLL"));
    if (_hDll != NULL)
        DsmEntry = reinterpret_cast<DSMENTRYPROC>(
            GetProcAddress(_hDll, MAKEINTRESOURCEA(1)) );

    return IsValidDriver();
}

//---------------------------------------------------------------------------
bool TTwain::IsValidDriver(void)
{
    return (_hDll != NULL) && (DsmEntry != NULL);
}

//---------------------------------------------------------------------------
int TTwain::GetErrorType(void)
{
    TW_UINT16 rc;
    TW_STATUS status;

    rc = DsmEntry(&appId, NULL, DG_CONTROL, DAT_STATUS, MSG_GET, &status);
    if (rc == TWRC_SUCCESS)
    {
        if (status.ConditionCode)
            return TWCC_CUSTOMBASE + status.ConditionCode;
        else
            return TWRC_FAILURE;
    }
    else
        return rc;
}

//---------------------------------------------------------------------------
int TTwain::OpenSourceManager(void)
{
    TW_UINT16 error;

    if (!IsValidDriver())
        return TWRC_FAILURE;

    appId.Id = 0;
    appId.ProtocolMajor = TWON_PROTOCOLMAJOR;
    appId.ProtocolMinor = TWON_PROTOCOLMINOR;
    appId.SupportedGroups = DG_IMAGE;
    _pParent = reinterpret_cast<TW_INT32>(GetActiveWindow());
    error = DsmEntry(&appId, NULL, DG_CONTROL, DAT_PARENT,
        MSG_OPENDSM, &_pParent);
    if (error == TWRC_FAILURE)
        error = GetErrorType();
    return error;
}

//---------------------------------------------------------------------------
String TTwain::GetSource(bool theDefault)
{
    TW_UINT16 error;

    if (!IsValidDriver())
        return "";

    sourceId.Id = 0;
    lstrcpyA(sourceId.ProductName, "");

    if (!theDefault)
    {
        error = DsmEntry(&appId, NULL, DG_CONTROL, DAT_IDENTITY,
            MSG_USERSELECT, &sourceId);
    }
    else
    {
        error = DsmEntry(&appId, NULL, DG_CONTROL, DAT_IDENTITY,
            MSG_GETDEFAULT, &sourceId);
    }

    if (error == TWRC_SUCCESS)
        return sourceId.ProductName;
    else
        return "";
}

//---------------------------------------------------------------------------
void TTwain::GetSources(TStrings *list)
{
    TW_UINT16 error;

    if (!IsValidDriver() || !list)
        return;

    sourceId.Id = 0;
    lstrcpyA(sourceId.ProductName, "");
    list->Clear();
    error = DsmEntry(&appId, NULL, DG_CONTROL, DAT_IDENTITY,
        MSG_GETFIRST, &sourceId);
    if (error == TWRC_SUCCESS)
    {
        list->Add(sourceId.ProductName);
        while ( DsmEntry(&appId, NULL, DG_CONTROL, DAT_IDENTITY,
                MSG_GETNEXT, &sourceId) == TWRC_SUCCESS )
        {
            list->Add(sourceId.ProductName);
        }
    }
}

//---------------------------------------------------------------------------
int TTwain::SelectSource(String sourceName)
{
    TW_UINT16 error;

    if (!IsValidDriver())
        return TWRC_FAILURE;

    sourceId.Id = 0;
    lstrcpyA(sourceId.ProductName, "");

    if (sourceName == "")
    {
        error = DsmEntry(&appId, NULL, DG_CONTROL, DAT_IDENTITY,
            MSG_USERSELECT, &sourceId);
    }
    else
    {
        error = DsmEntry(&appId, NULL, DG_CONTROL, DAT_IDENTITY,
            MSG_GETFIRST, &sourceId);
        if (error == TWRC_SUCCESS)
        {
            while (lstrcmpiA(sourceId.ProductName, AnsiString(sourceName).c_str()) != 0)
                DsmEntry(&appId, NULL, DG_CONTROL, DAT_IDENTITY,
                    MSG_GETNEXT, &sourceId);
        }
    }

    return error;
}

//---------------------------------------------------------------------------
int TTwain::OpenSource(void)
{
    pTW_ONEVALUE pval;
    TW_UINT16 error;

    if (!IsValidDriver())
        return TWRC_FAILURE;

    error = DsmEntry(&appId, NULL, DG_CONTROL, DAT_IDENTITY,
        MSG_OPENDS, &sourceId);
    if (error == TWRC_SUCCESS)
    {
        // negociando la transferencia de una imagen
        _capability.Cap = CAP_XFERCOUNT;
        _capability.ConType = TWON_ONEVALUE;
        _capability.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE));
        // configurando una imagen
        pval = reinterpret_cast<pTW_ONEVALUE>(GlobalLock(_capability.hContainer));
        pval->ItemType = TWTY_INT16;
//        pval->Item = TW_UINT32(-1); //-1 es para varias imagenes
        pval->Item = -1; //-1 es para varias imagenes
        GlobalUnlock(_capability.hContainer);
        // CAP_XFERCOUNT
        error = DsmEntry(&appId, &sourceId, DG_CONTROL, DAT_CAPABILITY,
            MSG_SET, &_capability);
        GlobalFree(_capability.hContainer);
        if (error == TWRC_CHECKSTATUS)
        {
             //el valor no se ha podido configurar correctamente
             //MSG_GET para coger el nuevo valor
            _capability.Cap = CAP_XFERCOUNT;
            _capability.ConType = TWON_DONTCARE16;
            _capability.hContainer = 0;
            error = DsmEntry(&appId, &sourceId, DG_CONTROL, DAT_CAPABILITY,
                MSG_GET, &_capability);
            //libera hContainer
            GlobalFree(_capability.hContainer);
            if (error == TWRC_FAILURE)
                error = GetErrorType();
        }
        if (error == TWRC_FAILURE)
            error = GetErrorType();
    }
    else
        if (error == TWRC_FAILURE)
            error = GetErrorType();

    return error;
}

//---------------------------------------------------------------------------
int TTwain::PAcquireNative(HBITMAP &hDib, bool &done)
{
    TW_UINT16 error;
    TW_PENDINGXFERS pendingXfers;

    done = true;
    error = DsmEntry(&appId, &sourceId, DG_IMAGE, DAT_IMAGENATIVEXFER,
        MSG_GET, &hDib);

    switch (error)
    {
        case TWRC_XFERDONE:
            error = DsmEntry(&appId, &sourceId, DG_CONTROL, DAT_PENDINGXFERS,
                MSG_ENDXFER, &pendingXfers);
//            if (pendingXfers.Count == 0) // Aborta todas las transferencias
            if (pendingXfers.Count != 0) //- CAMBIO sisabb -
            {                            //  pendientes: vuelve al estado 5
/*
                error = DsmEntry(&appId, &sourceId, DG_CONTROL, DAT_PENDINGXFERS,
                    MSG_RESET, &pendingXfers);
*/
                MasImagenes=true;       //- CAMBIO sisabb -
            }
            else
            {
                done = false;
                MasImagenes=false;      //- CAMBIO sisabb -
            }
//            error = TWRC_SUCCESS;
            break;
        case TWRC_CANCEL:
            if (GlobalSize(hDib) > 0)
                GlobalFree(hDib);
            hDib = 0;
            //Abortar todas las transferencias pendientes: vuelve al estado 5
            DsmEntry(&appId, &sourceId, DG_CONTROL, DAT_PENDINGXFERS,
                MSG_ENDXFER, &pendingXfers);
            if (pendingXfers.Count != 0)
                DsmEntry(&appId, &sourceId, DG_CONTROL, DAT_PENDINGXFERS,
                    MSG_RESET, &pendingXfers);
            error = TWRC_CANCEL;
            break;
        case TWRC_FAILURE:
            error = GetErrorType();
            hDib = 0;
            //Abortar todas las transferencias pendientes: vuelve al estado 5
            DsmEntry(&appId, &sourceId, DG_CONTROL, DAT_PENDINGXFERS,
                MSG_RESET, &pendingXfers);
            //la fuente esta ahora en el estado 5
    }

    return error;
}

//---------------------------------------------------------------------------
int TTwain::GetImageInfo(TW_IMAGEINFO& imgInfo)
{
    TW_UINT16 error;

    // informacion de la cabecera
    error = DsmEntry(&appId, &sourceId, DG_IMAGE, DAT_IMAGEINFO,
        MSG_GET, &imgInfo);
    if (error == TWRC_FAILURE)
        error = GetErrorType();
    return error;
}

//---------------------------------------------------------------------------
int TTwain::AcquireDib(HBITMAP &hDib)
{
    bool fin;
    TMsg msg;
    TW_UINT16 error;
    //int errorFromState;
    bool done;

    if (!IsValidDriver())
        return TWRC_FAILURE;

    hDib = 0;
    if (_bShowHideUi)
    {
        _userInterface.ShowUI = true;
        _userInterface.ModalUI = true;
    }
    else
    {
        _userInterface.ShowUI = false;
        _userInterface.ModalUI = false;
    }
    _pParent2 = reinterpret_cast<TW_INT32>(GetActiveWindow());
    _userInterface.hParent = reinterpret_cast<TW_USERINTERFACE>(_pParent2);
    //errorFromState = 5;
    error = DsmEntry(&appId, &sourceId, DG_CONTROL, DAT_USERINTERFACE,
        MSG_ENABLEDS, &_userInterface);
    if (error == TWRC_SUCCESS)
    {
        fin = false;
        while (!fin)
        {
            GetMessage(&msg, 0, 0, 0);
            _event.TWMessage = MSG_NULL;
            _event.pEvent = &msg;
            error = DsmEntry(&appId, &sourceId, DG_CONTROL, DAT_EVENT,
                MSG_PROCESSEVENT, &_event);
            if (error == TWRC_DSEVENT)
            {
                switch (_event.TWMessage)
                {
                    case MSG_XFERREADY:           //- CAMBIO sisabb -  Capturo y salvo las imagenes en JPG mientras masImagenes sea true.
                        do
                        {
                            error = PAcquireNative(hDib, done);

                            if (GlobalSize(hDib) > 1)
                            {
                                LPBITMAPINFO bmi = (LPBITMAPINFO)::GlobalLock(hDib);
                                if (bmi == NULL)
                                {
                                    char szMsg[1024];
                                    FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL,
                                        GetLastError(), 0, szMsg, sizeof(szMsg), NULL);
                                    throw Exception(szMsg);
                                }

                                Imagen = new Graphics::TBitmap();
                                Imagen->Height = bmi->bmiHeader.biHeight;
                                Imagen->Width = bmi->bmiHeader.biWidth;
                                SetDIBits(Imagen->Canvas->Handle,
                                    Imagen->Handle, 0,
                                    bmi->bmiHeader.biHeight,
                                    (Byte*)((Byte*)bmi + bmi->bmiHeader.biSize
                                    + bmi->bmiHeader.biClrUsed*sizeof(RGBQUAD)),
                                    bmi, DIB_RGB_COLORS );
                                Imagenes++;


                            }

                            ::GlobalUnlock( hDib );
                            ::GlobalFree(hDib);
                            TJPEGImage *jpg = new TJPEGImage;

                            jpgImagen=StringReplace(DirImagen, "*", IntToStr(Imagenes), TReplaceFlags()<<rfReplaceAll>Items->Add(ExtractFileName(jpgImagen));
                     jpg->CompressionQuality=jpgCalidad;
                     if(EnPrueba)
                       DrawSemiTransparentBitmap(Imagen->Canvas->Handle, 10, 10, 430, 160, imgLOGO->Canvas->Handle, 0, 0,50);
                     jpg->Assign(Imagen);
                            jpg->SaveToFile(jpgImagen);

                            delete jpg;
                            delete Imagen;


                        }
                        while(MasImagenes==true);
                        //errorFromState = 7;
                        fin = done;
                        break;
                    case MSG_CLOSEDSREQ:
                        error = TWRC_CANCEL;
                        fin = true;
                }
            }
            // la fuente no lo ha procesado, lo procesamos nosotros
            if (error == TWRC_NOTDSEVENT)
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            // fallo
            if (error == TWRC_FAILURE)
            {
                error = GetErrorType();
                //errorFromState = 6;
                fin = true;
            }
        }
    }
    else
        error = GetErrorType();

    return error;
}

//---------------------------------------------------------------------------
int TTwain::CloseTwainSession(void)
{
    TW_UINT16 rc;

    if (!IsValidDriver())
        return TWRC_FAILURE;

    DsmEntry(&appId, &sourceId, DG_CONTROL, DAT_USERINTERFACE,
        MSG_DISABLEDS, &_userInterface);
    DsmEntry(&appId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, &sourceId);
    rc = DsmEntry(&appId, NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, &_pParent);
    if (rc == TWRC_FAILURE)
        rc = GetErrorType();
    return rc;
}

//---------------------------------------------------------------------------
bool TTwain::UnLoadTwainModule(void)
{
    return FreeLibrary(_hDll);
}

//---------------------------------------------------------------------------
int TTwain::AcquireToImage(TImage *image)      //- CAMBIO sisabb -
{
    HBITMAP hDib;
    TW_UINT16 error;

    int ret = TWRC_FAILURE;
    error = AcquireDib(hDib);
    if (error == TWRC_SUCCESS)
    {
        ret = TWRC_SUCCESS;
    }

    return ret;
}
//---------------------------------------------------------------------------
int TTwain::AcquireToImage()      //- CAMBIO sisabb -
{
    HBITMAP hDib;
    TW_UINT16 error;

    int ret = TWRC_FAILURE;
    error = AcquireDib(hDib);
    if (error == TWRC_SUCCESS)
    {
        ret = TWRC_SUCCESS;
    }

    return ret;
}
//---------------------------------------------------------------------------
void TTwain::DrawSemiTransparentBitmap(HDC hDstDC, int x, int y, int nWidth,
        int nHeight, HDC hSrcDC, int xSrc, int ySrc, BYTE op=50)
{
    BLENDFUNCTION bf;
    ZeroMemory(&bf, sizeof(bf));
    bf.BlendOp = AC_SRC_OVER;
    bf.SourceConstantAlpha = MulDiv(op, 255, 100);
    ::AlphaBlend(hDstDC, x, y, nWidth, nHeight,hSrcDC, xSrc, ySrc, nWidth, nHeight, bf);
}

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
Volver arriba
Ver perfil de usuario Enviar mensaje privado Dirección AIM
Mensaje    Asunto: Responder citando

Código:

//---------------------------------------------------------------------------
// _Leo Software (info@leosoftware.com)
//---------------------------------------------------------------------------

#ifndef utwainH
#define utwainH
//---------------------------------------------------------------------------
#include <classes>
#include <extctrls>
#include "twain.h"
#include <vcl>
//---------------------------------------------------------------------------

class TTwain
{
private:
    bool _bShowHideUi;
   //TW_HANDLE _hDll;
   HINSTANCE _hDll;
    DSMENTRYPROC DsmEntry;
    TW_CAPABILITY _capability;
    TW_INT32 _pParent, _pParent2;
    TW_USERINTERFACE _userInterface;
   TW_EVENT _event;
   void DrawSemiTransparentBitmap(HDC hDstDC, int x, int y, int nWidth,
                           int nHeight, HDC hSrcDC, int xSrc, int ySrc, BYTE op);

public:
    TW_IDENTITY appId;
    TW_IDENTITY sourceId;

    bool MasImagenes;                   //- CAMBIO sisabb -
    Graphics::TBitmap *Imagen;          //- CAMBIO sisabb -
    int Imagenes;                       //- CAMBIO sisabb -
    AnsiString DirImagen, jpgImagen;    //- CAMBIO sisabb -
   int jpgCalidad;                     //- CAMBIO sisabb -
   TImage *imgLOGO;
   TListBox *ListDocumentos;
   bool EnPrueba;


    TTwain();
    bool IsValidDriver(void);
    int PAcquireNative(HBITMAP &hDib, bool &done);
    int AcquireDib(HBITMAP &hDib);
    bool LoadTwainModule(void);
    int OpenSourceManager(void);
    int SelectSource(String sourceName);
   void GetSources(TStrings *list);
    String GetSource(bool theDefault);
    int OpenSource(void);
    int GetImageInfo(TW_IMAGEINFO& imgInfo);
    int CloseTwainSession(void);
    bool UnLoadTwainModule(void);
    int GetErrorType(void);
   int AcquireToImage(TImage *image);
   int AcquireToImage();

};
//---------------------------------------------------------------------------

#endif
Volver arriba
Ver perfil de usuario Enviar mensaje privado Dirección AIM
Mensaje    Asunto: Responder citando

Hola

te he pasado primero la llamada, después el cpp y el h de la unit que contiene los accesos al Twain.

Como sabes todo esto es autoría de Leo y de sissab
Volver arriba
Ver perfil de usuario Enviar mensaje privado Dirección AIM
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.