إدارة إطارات الصور في العروض التقديمية باستخدام PHP

المقدمة

إطار الصورة هو شكل يحتوي على صورة—إنه مثل صورة داخل إطار.

يمكنك إضافة صورة إلى شريحة عبر إطار صورة. بهذه الطريقة، يمكنك تنسيق الصورة من خلال تنسيق إطار الصورة.

إنشاء إطار صورة

  1. إنشاء نسخة من الفئة Presentation .
  2. الحصول على مرجع الشريحة من خلال فهرستها.
  3. إنشاء كائن PPImage عبر إضافة صورة إلى ImageCollection المرتبطة بكائن العرض الذي سيُستخدم لملء الشكل.
  4. تحديد عرض وارتفاع الصورة.
  5. إنشاء PictureFrame بناءً على عرض وارتفاع الصورة عبر طريقة addPictureFrame المتوفرة في كائن الشكل المرتبط بالشريحة المرجعية.
  6. إضافة إطار صورة (يحوي الصورة) إلى الشريحة.
  7. حفظ العرض المعدل كملف PPTX.

يعرض هذا الكود PHP كيفية إنشاء إطار صورة:

  # ينشئ مثالًا من فئة Presentation التي تمثل ملف PPTX
  $pres = new Presentation();
  try {
    # يحصل على الشريحة الأولى
    $sld = $pres->getSlides()->get_Item(0);
    # ينشئ مثالًا من فئة Image
    $imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
    # يضيف إطار صورة بأبعاد مطابقة لارتفاع وعرض الصورة
    $sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
    # يكتب ملف PPTX إلى القرص
    $pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

إنشاء إطار صورة مع مقياس نسبي

عن طريق تعديل مقياس الصورة النسبي، يمكنك إنشاء إطار صورة أكثر تعقيدًا.

  1. إنشاء نسخة من الفئة Presentation .
  2. الحصول على مرجع الشريحة من خلال فهرستها.
  3. إضافة صورة إلى مجموعة صور العرض.
  4. إنشاء كائن PPImage عبر إضافة صورة إلى ImageCollection المرتبطة بكائن العرض الذي سيُستخدم لملء الشكل.
  5. تحديد العرض والارتفاع النسبيين للصورة داخل إطار الصورة.
  6. حفظ العرض المعدل كملف PPTX.

يعرض هذا الكود PHP كيفية إنشاء إطار صورة مع مقياس نسبي:

  # أنشئ فئة Presentation التي تمثل ملف PPTX
  $pres = new Presentation();
  try {
    # احصل على الشريحة الأولى
    $sld = $pres->getSlides()->get_Item(0);
    # أنشئ فئة Image
    $imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
    # أضف إطار صورة بأبعاد مساوية لارتفاع وعرض الصورة
    $pf = $sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
    # ضبط مقياس النسبي للعرض والارتفاع
    $pf->setRelativeScaleHeight(0.8);
    $pf->setRelativeScaleWidth(1.35);
    # احفظ ملف PPTX إلى القرص
    $pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

استخراج الصور النقطية من إطارات الصورة

يمكنك استخراج الصور النقطية من كائنات PictureFrame وحفظها بصيغة PNG أو JPG أو صيغ أخرى. توضح مثال الشفرة أدناه كيفية استخراج صورة من المستند “sample.pptx” وحفظها بصيغة PNG.

  $presentation = new Presentation("sample.pptx");
  try {
    $firstSlide = $presentation->getSlides()->get_Item(0);
    $firstShape = $firstSlide->getShapes()->get_Item(0);
    if (java_instanceof($firstShape, new JavaClass("com.aspose.slides.PictureFrame"))) {
      $pictureFrame = $firstShape;
      try {
        $slideImage = $pictureFrame->getPictureFormat()->getPicture()->getImage()->getImage();
        $slideImage->save("slide_1_shape_1.png", ImageFormat::Png);
      } finally {
        if (!java_is_null($slideImage)) {
          $slideImage->dispose();
        }
      }
    }
  } catch (JavaException $e) {
  } finally {
    $presentation->dispose();
  }

استخراج صور SVG من إطارات الصورة

عند احتواء عرض تقديمي على رسومات SVG موضوعة داخل أشكال PictureFrame، يتيح Aspose.Slides for PHP via Java استرجاع الصور المتجهة الأصلية بجودة كاملة. من خلال استعراض مجموعة أشكال الشريحة، يمكنك تحديد كل PictureFrame، والتحقق مما إذا كان PPImage الأساسي يحتوي على محتوى SVG، ثم حفظ تلك الصورة إلى قرص أو تدفق بصيغة SVG الأصلية.

يظهر المثال التالي كيفية استخراج صورة SVG من إطار صورة:

$presentation = new Presentation("sample.pptx");

try {
    $slide = $presentation->getSlides()->get_Item(0);
    $shape = $slide->getShapes()->get_Item(0);

    if (java_instanceof($shape, new JavaClass("com.aspose.slides.PictureFrame"))) {
        $svgImage = $shape->getPictureFormat()->getPicture()->getImage()->getSvgImage();

        if ($svgImage !== null) {
            file_put_contents("output.svg", $svgImage->getSvgData());
        }
    }
} finally {
    $presentation->dispose();
}

الحصول على شفافية الصورة

يتيح Aspose.Slides الحصول على تأثير الشفافية المطبق على صورة. يوضح هذا الكود PHP العملية:

  $presentation = new Presentation("Test.pptx");
  $pictureFrame = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item(0);
  $imageTransform = $pictureFrame->getPictureFormat()->getPicture()->getImageTransform();
  foreach($imageTransform as $effect) {
    if (java_instanceof($effect, new JavaClass("com.aspose.slides.AlphaModulateFixed"))) {
      $alphaModulateFixed = $effect;
      $transparencyValue = 100 - $alphaModulateFixed->getAmount();
      echo("Picture transparency: " . $transparencyValue);
    }
  }

الحصول على السطوع والتباين للصورة

يتيح Aspose.Slides الحصول على تأثير السطوع والتباين المطبق على صورة. تمثل الفئة Luminance هذا التأثير التحولي للصورة.

يوضح هذا الكود PHP كيفية الحصول على إعدادات السطوع والتباين من إطار صورة:

  $presentation = new Presentation("sample.pptx");

  try {
    $slide = $presentation->getSlides()->get_Item(0);
    $shape = $slide->getShapes()->get_Item(0);
    $pictureFrame = $shape;

    $imageTransform = $pictureFrame->getPictureFormat()->getPicture()->getImageTransform();
    $imageTransformCount = java_values($imageTransform->size());
    for ($index = 0; $index < $imageTransformCount; $index++) {
      $effect = $imageTransform->get_Item($index);
      if (java_instanceof($effect, new JavaClass("com.aspose.slides.Luminance"))) {
        $luminance = $effect->getEffective();
        $brightness = java_values($luminance->getBrightness());
        $contrast = java_values($luminance->getContrast());

        echo("Brightness: " . $brightness . PHP_EOL);
        echo("Contrast: " . $contrast . PHP_EOL);
      }
    }
  } finally {
    $presentation->dispose();
  }

تنسيق إطار الصورة

يوفر Aspose.Slides العديد من خيارات التنسيق التي يمكن تطبيقها على إطار صورة. باستخدام هذه الخيارات، يمكنك تعديل إطار الصورة ليتوافق مع متطلبات معينة.

  1. إنشاء نسخة من الفئة Presentation .
  2. الحصول على مرجع الشريحة من خلال فهرستها.
  3. إنشاء كائن PPImage عبر إضافة صورة إلى ImageCollection المرتبطة بكائن العرض الذي سيُستخدم لملء الشكل.
  4. تحديد عرض وارتفاع الصورة.
  5. إنشاء PictureFrame بناءً على عرض وارتفاع الصورة عبر طريقة addPictureFrame المتوفرة في كائن ShapeCollection المرتبط بالشريحة المرجعية.
  6. إضافة إطار الصورة (يحوي الصورة) إلى الشريحة.
  7. ضبط لون خط إطار الصورة.
  8. ضبط عرض خط إطار الصورة.
  9. تدوير إطار الصورة بإعطائه قيمة موجبة أو سالبة.
    • القيمة الموجبة تدور الصورة باتجاه عقارب الساعة.
    • القيمة السالبة تدور الصورة عكس اتجاه عقارب الساعة.
  10. إضافة إطار الصورة (يحوي الصورة) إلى الشريحة.
  11. حفظ العرض المعدل كملف PPTX.

يوضح هذا الكود PHP عملية تنسيق إطار الصورة:

  # ينشئ فئة Presentation التي تمثل ملف PPTX
  $pres = new Presentation();
  try {
    # يحصل على الشريحة الأولى
    $sld = $pres->getSlides()->get_Item(0);
    # ينشئ فئة Image
    $imgx = $pres->getImages()->addImage(new Java("java.io.FileInputStream", new Java("java.io.File", "asp1.jpg")));
    # يضيف إطار صورة بأبعاد مساوية لارتفاع وعرض الصورة
    $pf = $sld->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $imgx->getWidth(), $imgx->getHeight(), $imgx);
    # يطبق بعض التنسيق على PictureFrameEx
    $pf->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
    $pf->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLUE);
    $pf->getLineFormat()->setWidth(20);
    $pf->setRotation(45);
    # يكتب ملف PPTX إلى القرص
    $pres->save("RectPicFrame.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

إضافة صورة كارتباط

لتقليل حجم العروض الكبيرة، يمكنك إضافة صور (أو فيديوهات) عبر روابط بدلاً من تضمين الملفات مباشرة في العروض. يوضح هذا الكود PHP كيفية إضافة صورة وفيديو إلى عنصر نائب:

  $presentation = new Presentation("input.pptx");
  try {
    $shapesToRemove = new Java("java.util.ArrayList");
    $shapesCount = $presentation->getSlides()->get_Item(0)->getShapes()->size();
    for($i = 0; $i < java_values($shapesCount) ; $i++) {
      $autoShape = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item($i);
      if (java_is_null($autoShape->getPlaceholder())) {
        continue;
      }
      switch ($autoShape->getPlaceholder()->getType()) {
        case PlaceholderType::Picture :
          $pictureFrame = $presentation->getSlides()->get_Item(0)->getShapes()->addPictureFrame(ShapeType::Rectangle, $autoShape->getX(), $autoShape->getY(), $autoShape->getWidth(), $autoShape->getHeight(), null);
          $pictureFrame->getPictureFormat()->getPicture()->setLinkPathLong("https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg");
          $shapesToRemove->add($autoShape);
          break;
        case PlaceholderType::Media :
          $videoFrame = $presentation->getSlides()->get_Item(0)->getShapes()->addVideoFrame($autoShape->getX(), $autoShape->getY(), $autoShape->getWidth(), $autoShape->getHeight(), "");
          $videoFrame->getPictureFormat()->getPicture()->setLinkPathLong("https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg");
          $videoFrame->setLinkPathLong("https://youtu.be/t_1LYZ102RA");
          $shapesToRemove->add($autoShape);
          break;
      }
    }
    foreach($shapesToRemove as $shape) {
      $presentation->getSlides()->get_Item(0)->getShapes()->remove($shape);
    }
    $presentation->save("output.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($presentation)) {
      $presentation->dispose();
    }
  }

قص الصور

يوضح هذا الكود PHP كيفية قص صورة موجودة على شريحة:

  $pres = new Presentation();
  # ينشئ كائن صورة جديد
  try {
    $picture;
    $image = Images->fromFile($imagePath);
    try {
      $picture = $pres->getImages()->addImage($image);
    } finally {
      if (!java_is_null($image)) {
        $image->dispose();
      }
    }
    # يضيف PictureFrame إلى شريحة
    $picFrame = $pres->getSlides()->get_Item(0)->getShapes()->addPictureFrame(ShapeType::Rectangle, 100, 100, 420, 250, $picture);
    # يقطع الصورة (قيم النسبة المئوية)
    $picFrame->getPictureFormat()->setCropLeft(23.6);
    $picFrame->getPictureFormat()->setCropRight(21.5);
    $picFrame->getPictureFormat()->setCropTop(3);
    $picFrame->getPictureFormat()->setCropBottom(31);
    # يحفظ النتيجة
    $pres->save($outPptxFile, SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

حذف المناطق المقصوصة من صورة

إذا رغبت في حذف المناطق المقصوصة من صورة داخل إطار، يمكنك استخدام طريقة deletePictureCroppedAreas(). تُعيد هذه الطريقة الصورة المقصوصة أو الصورة الأصلية إذا لم يكن القَص مطلوبًا.

يوضح هذا الكود PHP العملية:

  $presentation = new Presentation("PictureFrameCrop.pptx");
  try {
    $slide = $presentation->getSlides()->get_Item(0);
    # يحصل على PictureFrame من الشريحة الأولى
    $picFrame = $slide->getShapes()->get_Item(0);
    # يحذف المناطق المقصوصة من صورة PictureFrame ويعيد الصورة المقصوصة
    $croppedImage = $picFrame->getPictureFormat()->deletePictureCroppedAreas();
    # يحفظ النتيجة
    $presentation->save("PictureFrameDeleteCroppedAreas.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($presentation)) {
      $presentation->dispose();
    }
  }

ضغط الصور

يمكنك ضغط صورة في عرض باستخدام طريقة PictureFillFormat::compressImage(). تُقلص هذه الطريقة الصورة عبر تقليل حجمها بناءً على حجم الشكل والدقة المحددة، مع خيار حذف المناطق المقصوصة.

تكيف حجم الصورة ودقتها مشابهًا لميزة Picture Format → Compress Pictures → Resolution في PowerPoint.

توضح أمثلة PHP التالية كيفية ضغط صورة في عرض عبر تحديد دقة هدف وإزالة المناطق المقصوصة اختياريًا:

$presentation = new Presentation("demo.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $pictureFrame = $slide->getShapes()->get_Item(0);

    # ضغط الصورة بدقة مستهدفة 150 DPI (دقة الويب) وإزالة المناطق المقصوصة.
    $result = $pictureFrame->getPictureFormat()->compressImage(true, PicturesCompression::Dpi150);

    # تحقق من نتيجة الضغط.
    if ($result) {
        echo "Image successfully compressed.";
    } else {
        echo "Image compression failed or no changes were necessary.";
    }

    $presentation->save("CompressedImage.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

أو باستخدام قيمة DPI مخصصة مباشرة:

$presentation = new Presentation("demo.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $pictureFrame = $slide->getShapes()->get_Item(0);

    # ضغط الصورة إلى 150 DPI (دقة الويب)، مع إزالة المناطق المقصوصة.
    $pictureFrame->getPictureFormat()->compressImage(true, 150.0);

    $presentation->save("CompressedImage.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

قفل نسبة الأبعاد

إذا رغبت في احتفاظ الشكل الذي يحتوي على صورة بنسبة أبعاده حتى بعد تغيير أبعاد الصورة، يمكنك استخدام طريقة setAspectRatioLocked لتفعيل إعداد Lock Aspect Ratio.

يوضح هذا الكود PHP كيفية قفل نسبة أبعاد الشكل:

  $pres = new Presentation("pres.pptx");
  try {
    $layout = $pres->getLayoutSlides()->getByType(SlideLayoutType::Custom);
    $emptySlide = $pres->getSlides()->addEmptySlide($layout);
    $picture;
    $image = Images->fromFile("image.png");
    try {
      $picture = $pres->getImages()->addImage($image);
    } finally {
      if (!java_is_null($image)) {
        $image->dispose();
      }
    }
    $pictureFrame = $emptySlide->getShapes()->addPictureFrame(ShapeType::Rectangle, 50, 150, $presImage->getWidth(), $presImage->getHeight(), $picture);
    # اجعل الشكل يحافظ على نسبة الأبعاد عند تغيير الحجم
    $pictureFrame->getPictureFrameLock()->setAspectRatioLocked(true);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

استخدام خاصية StretchOff

باستخدام الطرق setStretchOffsetLeft، setStretchOffsetTop، setStretchOffsetRight وsetStretchOffsetBottom من فئة PictureFillFormat، يمكنك تحديد مستطيل ملء.

عند تحديد تمديد للصورة، يتم تحجيم مستطيل المصدر ليناسب مستطيل الملء المحدد. يُعرّف كل جانب من جوانب مستطيل الملء بنسبة إزاحة من الجانب المقابل لمستطيل حدود الشكل. النسبة الموجبة تحدد إدخالًا بينما النسبة السالبة تحدد خروجًا.

  1. إنشاء نسخة من الفئة Presentation .
  2. الحصول على مرجع الشريحة من خلال فهرستها.
  3. إضافة مستطيل AutoShape.
  4. إنشاء صورة.
  5. ضبط نوع ملء الشكل.
  6. ضبط وضع ملء الصورة للشكل.
  7. إضافة صورة للملء.
  8. تحديد إزاحات الصورة من الجانب المقابل لمستطيل حدود الشكل.
  9. حفظ العرض المعدل كملف PPTX.

يوضح هذا الكود PHP عملية استخدام خاصية StretchOff:

  # ينشئ فئة Presentation التي تمثل ملف PPTX
  $pres = new Presentation();
  try {
    # يحصل على الشريحة الأولى
    $slide = $pres->getSlides()->get_Item(0);
    # ينشئ فئة ImageEx
    $picture;
    $image = Images->fromFile("aspose-logo.jpg");
    try {
      $picture = $pres->getImages()->addImage($image);
    } finally {
      if (!java_is_null($image)) {
        $image->dispose();
      }
    }
    # يضيف AutoShape من نوع Rectangle
    $aShape = $slide->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 300);
    # يضبط نوع ملء الشكل
    $aShape->getFillFormat()->setFillType(FillType::Picture);
    # يضبط وضع ملء الصورة للشكل
    $aShape->getFillFormat()->getPictureFillFormat()->setPictureFillMode(PictureFillMode->Stretch);
    # يضبط الصورة لملء الشكل
    $aShape->getFillFormat()->getPictureFillFormat()->getPicture()->setImage($picture);
    # يحدد إزاحات الصورة من الحافة المقابلة لمستطيل حدود الشكل
    $aShape->getFillFormat()->getPictureFillFormat()->setStretchOffsetLeft(25);
    $aShape->getFillFormat()->getPictureFillFormat()->setStretchOffsetRight(25);
    $aShape->getFillFormat()->getPictureFillFormat()->setStretchOffsetTop(-20);
    $aShape->getFillFormat()->getPictureFillFormat()->setStretchOffsetBottom(-10);
    # يكتب ملف PPTX إلى القرص
    $pres->save("StretchOffsetLeftForPictureFrame_out.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

الأسئلة المتكررة

How can I find out which image formats are supported for PictureFrame?
يمكنك معرفة صيغ الصور المدعومة لإطار الصورة عبر Aspose.Slides التي تدعم كلًا من الصور النقطية (PNG, JPEG, BMP, GIF, إلخ) والصور المتجهة (مثل SVG) من خلال كائن الصورة المخصص لـ PictureFrame. تتقاطع قائمة الصيغ المدعومة عادةً مع قدرات محرك تحويل الشرائح والصور.

How will adding dozens of large images affect PPTX size and performance?
إدراج صور كبيرة يزيد حجم الملف واستهلاك الذاكرة؛ ربط الصور يساعد في تقليل حجم العرض لكنه يتطلب بقاء الملفات الخارجية متاحة. يوفر Aspose.Slides إمكانية إضافة الصور عبر الرابط لتقليل حجم الملف.

How can I lock an image object from accidental moving/resizing?
استخدم قفل الشكل لإطار الصورة (مثلاً، تعطيل التحريك أو التحجيم). يُدعم نظام القفل مجموعة متنوعة من أنواع الأشكال بما في ذلك PictureFrame.

Is SVG vector fidelity preserved when exporting a presentation to PDF/images?
يسمح Aspose.Slides باستخراج SVG من PictureFrame كمتجه أصلي. عند التصدير إلى PDF أو الصيغ النقطية، قد يتم تحويله إلى نقطية حسب إعدادات التصدير؛ يبقى أن SVG الأصلي يُحفظ كمتجه ويظهر ذلك عند استخراج الصورة.