Obtenir la résolution et les dimensions des images

Contents
[ ]

Le code suivant fonctionne également avec la bibliothèque Aspose.PDF.Drawing.

Ce sujet explique comment utiliser les classes d’opérateurs dans l’espace de noms Aspose.PDF qui fournissent la capacité d’obtenir des informations sur la résolution et les dimensions des images sans avoir à les extraire.

Il existe différentes manières d’y parvenir. Cet article explique comment utiliser un arraylist et les classes de placement d’images.

  1. Tout d’abord, chargez le fichier PDF source (avec des images).
  2. Ensuite, créez un objet ArrayList pour contenir les noms de toutes les images dans le document.
  3. Obtenez les images en utilisant la propriété Page.Resources.Images.
  4. Créez un objet stack pour contenir l’état graphique de l’image et utilisez-le pour suivre les différents états d’image.
  5. Créez un objet ConcatenateMatrix qui définit la transformation actuelle. Il prend également en charge le redimensionnement, la rotation et l’inclinaison de tout contenu. Il concatène la nouvelle matrice avec la précédente. Veuillez noter que nous ne pouvons pas définir la transformation à partir de zéro, mais seulement modifier la transformation existante.
  6. Comme nous pouvons modifier la matrice avec ConcatenateMatrix, nous pourrions également avoir besoin de revenir à l’état d’image d’origine. Utilisez les opérateurs GSave et GRestore. Ces opérateurs sont appariés, donc ils doivent être appelés ensemble. Par exemple, si vous effectuez des travaux graphiques avec des transformations complexes et que vous revenez finalement aux transformations à l’état initial, l’approche sera quelque chose comme ceci :
// Draw some text
GSave

ConcatenateMatrix  // rotate contents after the operator

// Some graphics work

ConcatenateMatrix // scale (with previous rotation) contents after the operator

// Some other graphics work

GRestore

// Draw some text

En conséquence, le texte est dessiné sous forme régulière, mais certaines transformations sont effectuées entre les opérateurs de texte. Pour afficher l’image ou dessiner des objets de forme et des images, nous devons utiliser l’opérateur Do.

Nous avons également une classe nommée XImage qui fournit deux propriétés, Width et Height, qui peuvent être utilisées pour obtenir les dimensions de l’image.

  1. Effectuez quelques calculs pour calculer la résolution de l’image.
  2. Affichez les informations dans une invite de commande avec le nom de l’image.

Le code suivant vous montre comment obtenir les dimensions et la résolution d’une image sans extraire l’image du document PDF.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ExtractImageInformationFromPDF()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_Images();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "ImageInformation.pdf"))
    {
        // Define the default resolution for image
        int defaultResolution = 72;
        var graphicsState = new Stack();

        // Define list which will hold image names
        var imageNames = new List<string>(document.Pages[1].Resources.Images.Names);

        // Insert an object to stack
        graphicsState.Push(new System.Drawing.Drawing2D.Matrix(1, 0, 0, 1, 0, 0));

        // Get all the operators on first page of document
        foreach (var op in document.Pages[1].Contents)
        {
            // Use GSave/GRestore operators to revert the transformations back to previously set
            var opSaveState = op as Aspose.Pdf.Operators.GSave;
            var opRestoreState = op as Aspose.Pdf.Operators.GRestore;
            var opCtm = op as Aspose.Pdf.Operators.ConcatenateMatrix;
            var opDo = op as Aspose.Pdf.Operators.Do;

            if (opSaveState != null)
            {
                // Save previous state and push current state to the top of the stack
                graphicsState.Push(((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Clone());
            }
            else if (opRestoreState != null)
            {
                // Throw away current state and restore previous one
                graphicsState.Pop();
            }
            else if (opCtm != null)
            {
                var cm = new System.Drawing.Drawing2D.Matrix(
                   (float)opCtm.Matrix.A,
                   (float)opCtm.Matrix.B,
                   (float)opCtm.Matrix.C,
                   (float)opCtm.Matrix.D,
                   (float)opCtm.Matrix.E,
                   (float)opCtm.Matrix.F);

                // Multiply current matrix with the state matrix
                ((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Multiply(cm);

                continue;
            }
            else if (opDo != null)
            {
                // In case this is an image drawing operator
                if (imageNames.Contains(opDo.Name))
                {
                    var lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
                    // Create XImage object to hold images of first pdf page
                    var image = document.Pages[1].Resources.Images[opDo.Name];

                    // Get image dimensions
                    double scaledWidth = Math.Sqrt(Math.Pow(lastCTM.Elements[0], 2) + Math.Pow(lastCTM.Elements[1], 2));
                    double scaledHeight = Math.Sqrt(Math.Pow(lastCTM.Elements[2], 2) + Math.Pow(lastCTM.Elements[3], 2));
                    // Get Height and Width information of image
                    double originalWidth = image.Width;
                    double originalHeight = image.Height;

                    // Compute resolution based on above information
                    double resHorizontal = originalWidth * defaultResolution / scaledWidth;
                    double resVertical = originalHeight * defaultResolution / scaledHeight;

                    // Display Dimension and Resolution information of each image
                    Console.Out.WriteLine(
                            string.Format(dataDir + "image {0} ({1:.##}:{2:.##}): res {3:.##} x {4:.##}",
                                         opDo.Name, scaledWidth, scaledHeight, resHorizontal,
                                         resVertical));
                }
            }
        }
    }
}