Como faço para definir o DPI de uma varredura usando TWAIN em C ++
-
06-07-2019 - |
Pergunta
Eu estou usando TWAIN em C ++ e eu estou tentando definir o DPI manualmente para que um usuário não é exibida com o diálogo de verificação, mas em vez disso a página apenas verifica com os padrões estabelecidos e é armazenado para eles. Eu preciso definir o DPI manualmente, mas eu não consigo fazê-lo funcionar. Tenho experimentado definindo a capacidade usando o ICAP_XRESOLUTION eo ICAP_YRESOLUTION. Quando eu olho para informações da imagem que ele sempre mostra a mesma resolução não importa o que eu defini-lo para usar os ICAPS. Existe outra maneira para definir a resolução de uma varredura na imagem ou há apenas um passo adicional que precisa ser feito que não consigo encontrar em qualquer lugar documentação?
Graças
Solução
Eu uso ICAP_XRESOLUTION eo ICAP_YRESOLUTION para definir a resolução de digitalização para um scanner, e ele funciona, pelo menos para um número de scanners HP.
Código snipset:
float x_res = 1200;
cap.Cap = ICAP_XRESOLUTION;
cap.ConType = TWON_ONEVALUE;
cap.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE));
if(cap.hContainer)
{
val_p = (pTW_ONEVALUE)GlobalLock(cap.hContainer);
val_p->ItemType = TWTY_FIX32;
TW_FIX32 fix32_val = FloatToFIX32(x_res);
val_p->Item = *((pTW_INT32) &fix32_val);
GlobalUnlock(cap.hContainer);
ret_code = SetCapability(cap);
GlobalFree(cap.hContainer);
}
TW_FIX32 FloatToFIX32(float i_float)
{
TW_FIX32 Fix32_value;
TW_INT32 value = (TW_INT32) (i_float * 65536.0 + 0.5);
Fix32_value.Whole = LOWORD(value >> 16);
Fix32_value.Frac = LOWORD(value & 0x0000ffffL);
return Fix32_value;
}
O valor deve ser do tipo TW_FIX32 que é um formato de ponto flutuante definida por dois (estranho mas é verdade).
Espero que funcione para você!
Outras dicas
Ele deve funcionar o caminho.
Mas, infelizmente, não estamos vivendo em um mundo perfeito. drivers TWAIN estão entre as maioria dos motoristas de buggy lá fora. Controlando o processo de digitalização com TWAIN sempre foi uma grande dor de cabeça porque a maioria dos motoristas têm não foi testado sem o diálogo de digitalização.
Tanto quanto eu sei, também não há test-suite para TWAIN motoristas, de modo que cada um deles vai se comportar um pouco diferente.
Eu escrevi uma volta aplicativo de OCR no 90 e teve de lidar com estas questões também. O que eu acabei era ter uma lista de scanners suportados e um módulo de scanner com muitos de hacks e soluções alternativas para cada driver diferente.
Leve o ICAP_XRESOLUTION por exemplo: A documentação TWAIN sais você tem que enviar a resolução como 32 bit float. Você já tentou defini-lo usando um inteiro em vez disso? Ou enviá-lo como flutuador mas colocar o bit de representação de um número inteiro dentro do flutuador, ou vice-versa. Tudo isso poderia funcionar para o driver que você está trabalhando. Ou ele não poderia trabalhar em tudo.
Eu duvido que a situação mudou muito desde então. Então, boa sorte fazê-lo funcionar em pelo menos metade das máquinas que estão lá fora.