الحصول على دقة وأبعاد الصور

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 التي توفر خاصيتين، العرض والارتفاع، والتي يمكن استخدامها للحصول على أبعاد الصورة.

  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));
                }
            }
        }
    }
}