 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
sisabb Lt JG

Registrado: 07 Ago 2003Mensajes: 71
|
Publicado: Mie 27 Ene, 2010 6:14 pm Asunto: escanear con alimentador varias hojas |
|
|
| 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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
|
| Volver arriba |
|
 |
jfuentevilla Lt JG

Registrado: 22 Nov 2005Mensajes: 53
|
Publicado: Sab 13 Oct, 2018 1:12 am Asunto: Twain |
|
|
| Alguien tiene versión modificada por sisabb para Escanear. |
|
| Volver arriba |
|
 |
frios Lt

Registrado: 20 Nov 2005Mensajes: 79Ubicación: España
|
Publicado: Mar 23 Oct, 2018 10:28 am Asunto: |
|
|
| 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 |
|
 |
frios Lt

Registrado: 20 Nov 2005Mensajes: 79Ubicación: España
|
Publicado: Mar 23 Oct, 2018 10:30 am Asunto: |
|
|
| 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 |
|
 |
frios Lt

Registrado: 20 Nov 2005Mensajes: 79Ubicación: España
|
Publicado: Mar 23 Oct, 2018 10:30 am Asunto: |
|
|
| 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 |
|
 |
frios Lt

Registrado: 20 Nov 2005Mensajes: 79Ubicación: España
|
Publicado: Mar 23 Oct, 2018 10:33 am Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|