Question

Je recherche une bibliothèque qui peut ouvrir et copier des sections d'un grand fichier TIFF. J'ai regardé Libtiff.net Ce qui ouvre le fichier très rapidement mais il n'a aucune fonction pour les sections de recadrage ou de copie de l'image. Mon image est de 100 000 x 100 000 pixels vers le haut et créant un System.Drawing.Bitmap de cette taille plante l'application afin de se convertir en un Bitmap Le premier n'est pas une option.

Quelqu'un peut-il recommander une bibliothèque .NET?

Était-ce utile?

La solution

Si votre fichier est inférieur à 4 Go sur le disque que je vous recommande de jeter un autre coup d'œil à libtiff.net. Même avec de si grandes images, vous avez des options.

Tout d'abord, vérifiez si votre image est carrelée ou dépouillée. Tiff.IsTiled La méthode vous donnera la réponse.

Si votre image est carrelée, vous ne devriez probablement pas le lire en utilisant ReadScanline méthode. Il pourrait être préférable d'utiliser ReadEncodedTile Méthode dans ce cas.

Si vos images sont éliminées, vous pouvez utiliser ReadScanline et ReadEncodedStrip Méthodes pour le lire.

Si vous voulez utiliser quelque chose qui attend System.Drawing.Bitmap que d'essayer d'utiliser ReadRGBATile ou ReadRGBAStrip. Ces méthodes peuvent être utilisées pour créer des bitmaps à partir de parties de votre image. Il n'y a pas d'échantillon pour cela, mais Convertir la couleur TIFF en un système 32 bits. devrait vous donner presque toutes les informations requises sur la façon de convertir les carreaux ou la bande d'une image en bitmap.

ÉDITER:

Libtiff.net 2.4.508 ajoute la prise en charge de BigTiff, donc les fichiers supérieurs à 4 Go sont également pris en charge.

Autres conseils

Votre image doit être Bigtif Format, car le TIFF normal ne peut pas être supérieur à 4 Go.

Bigtiff peut être lu avec une version modifiée de LiBtiff (disponible en Site Web Bigtiff), cette bibliothèque permet de gérer ces images comme vous le souhaitez sans charger toutes les données de pixels en mémoire.

Je n'ai pas vu de liaisons pour .NET mais cela ne devrait pas être trop long pour le faire.

Atalasoft dotimage a cette capacité intégrée au décodeur TIFF. Le décodage implémente l'interface iregionredable, qui vous permet de lire une section rectangulaire à partir d'une page donnée d'une image dans un flux.

Dans un TIFF, cette section honorera l'étiquette d'orientation et dans les tiffs dépouillés ou carrelés utilise l'ensemble minimum de tuiles et de bandes pour remplir le rectangle.

(Avertissement, je travaille pour Atalasoft et j'ai écrit cette interface et je l'ai implémentée dans le décodeur TIFF)

Comme Bobrovsky l'a mentionné, vous devez vérifier si votre image de fichier est carrelée ou non. Dans ce qui suit, j'ai présenté l'extrait de code pour lire un TIFF de flux et recadrer la partie supérieure gauche de l'image.

using (Tiff input = Tiff.Open(@"imageFile.tif", "r"))
        {
            // get properties to use in writing output image file
            int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
            int height = input.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
            int samplesPerPixel = input.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToInt();
            int bitsPerSample = input.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt();
            int photo = input.GetField(TiffTag.PHOTOMETRIC)[0].ToInt();

            int scanlineSize = input.ScanlineSize();    
            byte[][] buffer = new byte[height][]; 
            for (int i = 0; i < height; ++i)
            {
                buffer[i] = new byte[scanlineSize];
                input.ReadScanline(buffer[i], i);
            }



            using (Tiff output = Tiff.Open("splitedImage.tif", "w"))
            {
                output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel);
                output.SetField(TiffTag.IMAGEWIDTH, width/2);
                output.SetField(TiffTag.IMAGELENGTH, height/2);
                output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample);
                output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0));
                output.SetField(TiffTag.PHOTOMETRIC, photo);
                output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);


                int c = 0;
                byte[][] holder = new byte[height][];

                for (int i = height/2; i < height; i++)
                //for (int j = 0; j < height/2 ; j++)
                {
                    holder[i] = buffer[i].Skip(buffer[i].Length/2).ToArray();

                    output.WriteScanline(holder[i], c);
                    c++;
                }
            }
        }

        System.Diagnostics.Process.Start("splitedImage.tif");

Pour d'autres parties de l'image, vous pouvez modifier la plage de "i" en boucle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top