8
votes

JPEG de TIFF (JPEG-Compressé)

Comment puis-je extraire l'image du fichier TIFF compressé JPEG?

J'ai lu des octets selon les champs de stripoffestes et de stripbytescount, mais je ne pouvais pas charger une image d'eux.


2 commentaires

Recherchez-vous les données d'image compressées ou recherchez-vous l'image actuelle?


Je cherche l'image actuelle


4 Réponses :


1
votes

Si vous essayez d'extraire l'image réelle d'un TIFF, JPEG ou non, vous êtes le mieux en utilisant une bibliothèque telle que libtiff afin de le faire. TIFF est une spécification très compliquée et pendant que vous pourrez peut-être le faire vous-même et obtenir une ou deux classes d'images, il y a de fortes chances que vous ne pourriez pas gérer les autres cas qui surviennent fréquemment, en particulier «de style ancien» JPEG qui est un sous-format qui a été figuré sur TIFF et ne convient pas à l'ensemble.

Ma société, ATALASOFT , fait un produit .NET qui comprend un très bon codec pour TIFF. Si vous n'avez besoin que de vous inquiéter des images à la page unique, notre produit gratuit fonctionnera simplement pour vous.

Dans le domaine .NET, vous pouvez également consulter version gérée de Libtiff de Bit Miracle de Libtiff. C'est un point assez décent de la bibliothèque.


2 commentaires

Merci pour la réponse. Je ne peux utiliser aucune bibliothèque. Je suis intéressant dans l'analyse de la new-style JPEG-compressed TIFF. Pourriez-vous s'il vous plaît dites-moi, ce qui ne va pas avec les données compressées JPEG que j'ai récupérées à partir du fichier TIFF, en fonction des champs Stripoffestes et Stripbytescount?


Je vois qu'il contient le marqueur de début de JPEG: X0FFD8, mais il ne peut pas être ouvert. Quelles manipulations dois-je faire avec ces données pour obtenir une image?



5
votes

TIFF-JPEG OLD STYLE (Type de compression 6) En gros, un fichier JFIF normal à l'intérieur d'un wrapper TIFF. Le nouveau style TIFF-JPEG (type de compression 7) permet de stocker les données de la table JPEG (Huffman, quantification), à stocker dans une balise séparée (0x015B JPEGTables). Cela vous permet de mettre des bandes de données JPEG avec des marqueurs SOI / EOI dans le fichier sans avoir à répéter les tables de Huffman et de quantification. C'est probablement ce que vous voyez avec votre fichier. Les bandes individuelles commencent par la séquence FFD8, mais manquent les tables de Huffman et de quantification. C'est la façon dont les produits Photoshop écrivent généralement les fichiers.


10 commentaires

J'ai essayé d'ajouter une table de quantification au début des données d'image, mais cela n'aide pas. Où dois-je insérer cette table?


Que diriez-vous des tables de Huffman? Est l'image cassée en plusieurs bandes. Voulez-vous 1 fichier JPEG pour chaque bande? Ajouter plus de détails.


Il y a 1 JPEG qui est cassé sur plusieurs bandes.


Vous n'avez pas répondu à ma question sur les tables de Huffman. Pour décoder les données comprimées JPEG, le décompresseur nécessite les tables de quantification et de Huffman. Jetez un coup d'œil à un JPEG valide et vous verrez une série de tables après la métadonnée (FFEX).


Où puis-je trouver les contes de Huffman et où je dois les mettre?


Mais si il n'y a pas de tag "jpegtables" et


Si vous avez un fichier TIFF avec les données JPEG de type 7 et les bandes de données comprimées manquent les tables Huffman et Quanization, il doit alors être stocké dans la balise JPEGTables. Vous devriez pouvoir prendre les informations dans la balise JPEGTables dans l'insérer dans les données d'image (comptant SOI / EOI) et fonctionner.


J'ai extrait une image de mon fichier TIFF, mais cela semble absolument différent de l'original. Une bande rose. Quel est le problème avec ça?


J'ai trouvé qu'une image est coupée. La valeur de la hauteur dans le segment FFC0 est fausse.


Envoyez-moi le fichier et je vais jeter un oeil. (Bitbank (AT) POBOX (DOT) COM).



3
votes

Utilisation JAI:

TIFFDirectory tdir = new TIFFDirectory(stream, 1);


1 commentaires

Extraordinaire. Merci à la vie de la vie.



2
votes

Le problème avec la bibliothèque mentionnée libtiff est qu'il extrait l'image puis l'enregistre recompressé, ce qui signifie une autre perte de qualité en cas de JPG. Cela dit que je peux accomplir la même chose sans même utiliser une tierce partie liber en appelant simplement GDI + méthodes de cadre net.

L'auteur initial de ce fil tente d'obtenir le binaire JPEG sans avoir à le recompresser et c'est exactement ce que je suis essayer de faire aussi bien. p>

Il s'agit d'une solution possible si vous pouvez vivre avec une perte de qualité et que vous ne souhaitez pas utiliser les classes de la bibliothèque ultérieure: P> xxx pré>

L'aide utilisée Méthode: P>

    public static int GetCompressionType(Image image)
    {
        /*  TIFF Tag Compression
            IFD     Image
            Code        259 (hex 0x0103)
            Name        Compression
            LibTiff name        TIFFTAG_COMPRESSION
            Type        SHORT
            Count       1
            Default     1 (No compression)
            Description

            Compression scheme used on the image data.

            The specification defines these values to be baseline:

            1 = No compression
            2 = CCITT modified Huffman RLE
            32773 = PackBits compression, aka Macintosh RLE

            Additionally, the specification defines these values as part of the TIFF extensions:

            3 = CCITT Group 3 fax encoding
            4 = CCITT Group 4 fax encoding
            5 = LZW
            6 = JPEG ('old-style' JPEG, later overriden in Technote2)

            Technote2 overrides old-style JPEG compression, and defines:

            7 = JPEG ('new-style' JPEG)

            Adobe later added the deflate compression scheme:

            8 = Deflate ('Adobe-style')

            The TIFF-F specification (RFC 2301) defines:

            9 = Defined by TIFF-F and TIFF-FX standard (RFC 2301) as ITU-T Rec. T.82 coding, using ITU-T Rec. T.85 (which boils down to JBIG on black and white).
            10 = Defined by TIFF-F and TIFF-FX standard (RFC 2301) as ITU-T Rec. T.82 coding, using ITU-T Rec. T.43 (which boils down to JBIG on color). 
        */
        int compressionTagIndex = Array.IndexOf(image.PropertyIdList, 0x103);

        PropertyItem compressionTag = image.PropertyItems[compressionTagIndex];

        return BitConverter.ToInt16(compressionTag.Value, 0);
    }


1 commentaires

Cette méthode: Public static int getComppressionType (image image) doit se terminer par "retour bitconverter.touint16 (compressiontag.value, 0);" Comme vous ne voulez pas un entier signé en raison de la matrice 16 bits qui est renvoyée.