Avoir un tampon de fichier image en mémoire, ce qui est le meilleur moyen de créer sa vignette?

voix
7

Essayer de créer une image demande acquisition optimisée pour un dispositif de balayage rapide (qui peut fournir jusqu'à 6 images compressées [color + gris + binaire] [avant + arrière] pour chaque document à une vitesse de 150 ppm), j'ai quelques problèmes de vitesse. En mode de transfert tampon technologie et mémoire TWAIN (TWSX_MEMORY) Je reçois tampon d'image (au format JPEG ou TIFF fichier chargé en mémoire) du scanner et de l'enregistrer sur mon chemin de destination de l'application. Si je ne veux pas créer des vignettes, mon application ne provoque aucune perte de vitesse pour le scanner, mais si je veux, en raison de la façon dont je le fais (tampon sauver dans un fichier dans mon C ++ dll manipulation TWAIN, notification mon application hôte .NET avec le chemin du fichier de destination en utilisant un pointeur de fonction en ouvrant le fichier image en C # et en créant l'image miniature), ma demande provoque une perte extrême de la vitesse à la vitesse de balayage. J'essayé certaines optimisations telles que l'exécution de phase de charge dans un fil séparé et l'envoi d'un tampon de fichier image non géré à l'hôte .NET et en essayant de le charger dans un contexte dangereux (UnmanagedMemoryStream) et la création de la vignette. Mais il n'a pas amélioré de manière significative la vitesse. Donc, ma question est:

Avoir un tampon de fichier image dans la mémoire (par exemple 24 bits JPEG compressé sans miniature embeded), est-il un moyen rapide et directe pour créer une image miniature de celui-ci? Que proposez-vous comme méthode la plus rapide pour créer des vignettes dans ce cas?

Créé 22/08/2009 à 16:16
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
7

Si c'est une image JPEG, vous pouvez simplement jeter la plupart des données TCD, et créer une miniature à une puissance de deux dimensions, en utilisant uniquement les coefficients TCD.

Si vous pouvez trouver les sources, jetez un oeil à EPEG du projet des Lumières. Il fait exactement ce que vous cherchez des fichiers JPEG, entièrement sans décoder l'image ou décompresser. Le code source serait très instructif.

Pour les autres formats d'image, il est pas si simple - vous aurez besoin de décoder et de rendre l'image à une mémoire tampon, puis effectuez votre propre mise à l'échelle. Le CImg et boost :: bibliothèques GIL peuvent aider à cela.

Créé 22/08/2009 à 19:21
source utilisateur

voix
3

Je suppose que le problème est qu'il faut plus de temps pour convertir une image en miniature que pour acquérir l'image en premier lieu, non?

Bien qu'un programme de conversion plus rapide miniature pourrait résoudre le problème pour vous, il pourrait ne pas être suffisant pour quelqu'un avec un ordinateur plus lent. Au lieu de cela, je vous suggère de créer une file d'attente d'images à convertir en vignettes - vous avez donc un fil (ou processus) qui ajoute des images numérisées à la file d'attente, et un autre thread / processus qui supprime les images de cette file d'attente et crée des vignettes d'eux. De cette façon, les vitesses relatives des deux opérations ne comptent pas.

Créé 22/08/2009 à 17:04
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more