2010-10-14 7 views
0

J'ai besoin de charger des lots de fichiers image et de changer leurs dimensions. Je le fais par FreeImage.dll en C++. Chaque lot contient des fichiers JPG et TIF. Le problème est que l'exe traite le premier lot avec précision, mais pour d'autres lots, il commence à sauter certains fichiers, en particulier les fichiers JPG.FreeImage dll ni travailler pour le traitement par lots

J'ai essayé d'initialiser et de désinitialiser FreeImage avant et après chaque lot, mais cela ne fonctionne toujours pas.

Quelqu'un peut-il me suggérer la façon de faire cela? Même si je dois utiliser une autre librairie de traitement d'images gratuite, ça me convient.

+0

Poster du code? –

+0

Les résultats sont-ils cohérents? Est-il capable de traiter une telle image seule? – ruslik

Répondre

0

Il semble que FreeImage fuit la mémoire ou que la mémoire soit fragmentée dans le code appelant FreeImage. Tôt dans la vie de votre processus, assez de mémoire contiguë est encore disponible et tout fonctionne bien. Plus tard, les choses commencent à échouer sur les grandes images en couleur. La raison pour laquelle les jpeg échouent est que l'image mémoire d'une image couleur prend toujours au moins 24 bits par pixel (probablement 32 bits), même si sa taille sur le disque est beaucoup plus petite. Vos images tiff sont probablement en noir et blanc et nécessitent seulement 1 bit par pixel. Si toute la mémoire de chaque image traitée n'est pas libérée (dans FreeImage.dll ou dans votre propre programme), cela crée un problème dans un processus en cours d'exécution, même si la quantité de mémoire utilisée reste minime. Le problème est que la mémoire deviendra fragmentée et que le système d'exploitation ne pourra pas déplacer les fragments dans l'espace mémoire d'un seul processus. Pour le chargement de grandes images, de gros blocs de mémoire contigus sont nécessaires, et dans la mémoire fragmentée, il peut ne plus y avoir suffisamment de "trous" libres, même si l'espace libre global est encore suffisant. Une solution de contournement simple consiste à générer un processus distinct pour chaque image à traiter et à ce que le processus principal effectue uniquement la gestion des tâches. Cela rend toutefois votre programme légèrement plus complexe et peut entraîner des problèmes de stabilité si un processus de travail peut être bloqué.