9
votes

Lire une dimension de fichier TIFF et une résolution sans le charger en premier

Comment lire une dimension de fichier TIFF (largeur et hauteur) et résolution (horizontale et verticale) sans le charger d'abord en mémoire en utilisant le code comme ce qui suit. Il est trop lent pour les gros fichiers et je n'ai pas besoin de les manipuler.

Image tif = Image.FromFile(@"C:\large_size.tif");
float width = tif.PhysicalDimension.Width;
float height = tif.PhysicalDimension.Height;
float hresolution = tif.HorizontalResolution;
float vresolution = tif.VerticalResolution;
tif.Dispose();


0 commentaires

4 Réponses :


1
votes

try Ce , Cela semble être ce que vous recherchez. Il suffit de sauter tout après: xxx

n'oubliez pas de fermer après vous: xxx


1 commentaires

J'ai trouvé une solution partielle d'utilisation de Shell32.Folder.GetDétails de (). Mais cela ne peut obtenir que la dimension mais pas la résolution sur Windows XP. Merci.



1
votes

La seule façon dont je peux penser, c'est lire l'en-tête binaire TIFF.

Ici, vous pouvez télécharger la spécification: http://partners.adobe.com /public/developer/tiff/index.html

Voici quelques codes utilisés pour lire des tiffs que vous pouvez utiliser pour apprendre: http://www.kods.com/cshaarp/fidf6632006f25b8e5b3bcc62d13076b38d71847929.aspx?s=zoom

J'ai créé une bibliothèque pour lire les en-têtes TIFF il y a quelque temps (avec ces deux ressources comme base), mais cela faisait partie de mon code de l'employeur, donc je ne peux pas poster mon code ici et je peux dire que ce n'est pas vraiment difficile.

J'espère que cela vous aidera.


2 commentaires

Merci de me diriger vers la bonne direction. J'ai relu grossièrement les matériaux sur les deux liens. Mais en ce moment, j'ai hésité à passer du temps à créer la solution à partir de zéro, car je n'ai pas beaucoup d'expérience sur la programmation sur le niveau bit à bit.


Je vais essayer WPF Imaging Component pour cette avant de terminer le projet. Je vais probablement utiliser l'information qui vous est fourni coder une solution pour l'exercice de mon temps.



2
votes

Aussi loin que je sache, toutes les classes de System.Drawing Espace de noms Chargez les données d'image immédiatement lorsque l'image est ouverte.

Je pense libtiff.net peut vous aider à lire les propriétés de l'image sans chargement de données d'image. C'est gratuit et open-source (licence BSD, adapté aux applications commerciales). P>

Voici un échantillon de votre tâche (les vérifications d'erreur sont omises pour la brièveté): P>

using BitMiracle.LibTiff.Classic;

namespace ReadTiffDimensions
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Tiff image = Tiff.Open(args[0], "r"))
            {
                FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH);
                int width = value[0].ToInt();

                value = image.GetField(TiffTag.IMAGELENGTH);
                int height = value[0].ToInt();

                value = image.GetField(TiffTag.XRESOLUTION);
                float dpiX = value[0].ToFloat();

                value = image.GetField(TiffTag.YRESOLUTION);
                float dpiY = value[0].ToFloat();
            }
        }
    }
}


1 commentaires

Merci d'avoir présenté le code. Je pense que libtiff.net est probablement le seul choix open-source là-bas pour une utilisation non commerciale. Mon programme est un petit programme unique de moins de 30 000 km. Traitement des fichiers TIFF n'est pas sa tâche principale. Donc, maintenant, je préfère simplement coller avec ma solution lente mais simple actuelle.



12
votes

courut dans cela moi-même et j'ai trouvé la solution (éventuellement ici). image.fromstream code> avec validateIatureData = false code> vous permet d'accéder aux informations que vous recherchez, sans chargement de l'ensemble du fichier.

using(FileStream stream = new FileStream(@"C:\large_size.tif", FileMode.Open, FileAccess.Read))
{
  using(Image tif = Image.FromStream(stream, false, false))
  {
    float width = tif.PhysicalDimension.Width;
    float height = tif.PhysicalDimension.Height;
    float hresolution = tif.HorizontalResolution;
    float vresolution = tif.VerticalResolution;
  }
}


3 commentaires

Vient de voir vos commentaires. J'ai essayé et tu as raison. La méthode est beaucoup plus rapide que celle utilisée dans ma question initiale. Merci.


Où est-ce image de?


System.Drawing.Image