مدیریت قاب‌های تصویر در ارائه‌ها با استفاده از PHP

مقدمه

قاب تصویر یک شکل است که یک تصویر را در بر می‌گیرد—مانند یک تصویر درون قاب.

می‌توانید یک تصویر را از طریق یک قاب تصویر به اسلاید اضافه کنید. به این ترتیب می‌توانید تصویر را با قالب‌بندی قاب تصویر قالب‌بندی کنید.

ایجاد یک قاب تصویر

  1. یک نمونه از کلاس Presentation ایجاد کنید.
  2. مرجع یک اسلاید را از طریق شاخص آن دریافت کنید.
  3. یک شیء PPImage با افزودن یک تصویر به ImageCollection مربوط به شیء ارائه که برای پر کردن شکل استفاده می‌شود، ایجاد کنید.
  4. عرض و ارتفاع تصویر را مشخص کنید.
  5. یک PictureFrame بر اساس عرض و ارتفاع تصویر از طریق متد addPictureFrame که توسط شیء shape مربوط به اسلاید مرجع ارائه می‌شود، ایجاد کنید.
  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")));
    # اضافه کردن Picture Frame با ارتفاع و عرض معادل تصویر
    $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 برای 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 نشان می‌دهد چگونه یک تصویر و ویدیو را در یک placeholder اضافه کنید:

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

سؤالات متداول

چگونه می‌توانم بفهمم چه فرمت‌های تصویری برای PictureFrame پشتیبانی می‌شوند؟

Aspose.Slides هر دو نوع تصویر رستری (PNG, JPEG, BMP, GIF و غیره) و تصاویر برداری (مثلاً SVG) را از طریق شیء تصویری که به یک PictureFrame اختصاص داده می‌شود، پشتیبانی می‌کند. فهرست فرمت‌های پشتیبانی‌شده عموماً با توانایی‌های موتور تبدیل اسلاید و تصویر همپوشانی دارد.

اضافه‌کردن ده‌ها تصویر بزرگ چه تأثیری بر اندازه و عملکرد فایل PPTX دارد؟

جاسازی تصاویر بزرگ حجم فایل و استفاده از حافظه را افزایش می‌دهد؛ لینک کردن تصاویر به کاهش حجم ارائه کمک می‌کند اما فایل‌های خارجی باید در دسترس بمانند. Aspose.Slides امکان افزودن تصویر به‌صورت لینک را برای کاهش حجم فایل فراهم می‌کند.

چگونه می‌توانم یک شیء تصویری را از جابجایی/تغییر اندازه تصادفی قفل کنم؟

از قفل‌های شکل برای یک PictureFrame استفاده کنید (مثلاً غیر فعال کردن جابجایی یا تغییر اندازه). این مکانیزم قفل‌گذاری برای انواع مختلف شکل‌ها، از جمله PictureFrame پشتیبانی می‌شود.

آیا صحت برداری SVG هنگام خروجی‌گیری ارائه به PDF/تصاویر حفظ می‌شود؟

Aspose.Slides اجازه می‌دهد تا یک SVG را از یک PictureFrame به‌عنوان بردار اصلی استخراج کنید. هنگام خروجی‌گیری به PDF یا فرمت‌های رستری، نتیجه ممکن است بسته به تنظیمات خروجی به صورت رستری شود؛ اما این که SVG اصلی به‌صورت بردار ذخیره شده است، توسط رفتار استخراج تأیید می‌شود.