Получение разрешения и размеров изображений

Contents
[ ]

Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.

В этой теме объясняется, как использовать классы операторов в пространстве имён Aspose.PDF, которые предоставляют возможность получать информацию о разрешении и размерах изображений без необходимости их извлечения.

Существуют разные способы достижения этой цели. В этой статье объясняется, как использовать ArrayList и классы размещения изображений.

  1. Сначала загрузите исходный PDF-файл (с изображениями).
  2. Затем создайте объект ArrayList, чтобы сохранить имена всех изображений в документе.
  3. Получите изображения с помощью свойства Page.Resources.Images.
  4. Создайте объект стека для хранения графического состояния изображения и используйте его для отслеживания различных состояний изображения.
  5. Создайте объект ConcatenateMatrix, который определяет текущее преобразование. Он также поддерживает масштабирование, поворот и перекос любого содержимого. Он объединяет новую матрицу с предыдущей. Обратите внимание, что мы не можем определить преобразование с нуля, а только изменить существующее преобразование.
  6. Поскольку мы можем изменять матрицу с помощью ConcatenateMatrix, нам также может потребоваться вернуться к исходному состоянию изображения. Используйте операторы GSave и GRestore. Эти операторы используются попарно, поэтому их следует вызывать вместе. Например, если вы выполняете графическую работу со сложными преобразованиями и, наконец, возвращаете преобразования в исходное состояние, подход будет примерно таким:
// 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

В результате текст рисуется в обычном виде, но между текстовыми операторами выполняются некоторые преобразования. Чтобы отобразить изображение или нарисовать объекты формы и изображения, нам нужно использовать оператор Do.

У нас также есть класс с именем XImage, который предоставляет два свойства, Width и Height, которые можно использовать для получения размеров изображения.

  1. Выполните некоторые вычисления для определения разрешения изображения.
  2. Отобразите информацию в командной строке вместе с именем изображения.

Приведённый ниже фрагмент кода показывает, как получить размеры и разрешение изображения без извлечения изображения из 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));
                }
            }
        }
    }
}