Optimalizace správy obrázků v prezentacích pomocí PHP

Úvod

Obrázky činí prezentace poutavějšími a zajímavějšími. V Microsoft PowerPoint můžete do snímků vložit obrázky ze souboru, internetu nebo jiných míst. Podobně Aspose.Slides umožňuje přidávat obrázky do snímků ve vašich prezentacích různými postupy.

Aspose.Slides podporuje operace s obrázky v těchto populárních formátech: JPEG, PNG, GIF a dalších.

Přidání lokálně uložených obrázků do snímků

Můžete na snímek v prezentaci přidat jeden nebo několik obrázků z vašeho počítače. Tento ukázkový kód vám ukazuje, jak přidat obrázek do snímku:

  $pres = new Presentation();
  try {
    $slide = $pres->getSlides()->get_Item(0);
    $picture;
    $image = Images->fromFile("image.png");
    try {
      $picture = $pres->getImages()->addImage($image);
    } finally {
      if (!java_is_null($image)) {
        $image->dispose();
      }
    }
    $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 10, 10, 100, 100, $picture);
    $pres->save("pres.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Přidání obrázků z webu do snímků

Pokud obrázek, který chcete do snímku přidat, není k dispozici ve vašem počítači, můžete jej přidat přímo z webu.

Tento ukázkový kód vám ukazuje, jak přidat obrázek z webu do snímku :

  $pres = new Presentation();
  try {
    $slide = $pres->getSlides()->get_Item(0);
    $imageUrl = new URL("[REPLACE WITH URL]");
    $connection = $imageUrl->openConnection();
    $inputStream = $connection->getInputStream();
    $outputStream = new Java("java.io.ByteArrayOutputStream");
    $Array = new java_class("java.lang.reflect.Array");
    $Byte = new JavaClass("java.lang.Byte");
    try {
      $buffer = $Array->newInstance($Byte, 1024);
      $read;
      while ($read = $inputStream->read($buffer, 0, $Array->getLength($buffer)) != -1) {
        $outputStream->write($buffer, 0, $read);
      } 
      $outputStream->flush();
      $image = $pres->getImages()->addImage($outputStream->toByteArray());
      $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 10, 10, 100, 100, $image);
    } finally {
      if (!java_is_null($inputStream)) {
        $inputStream->close();
      }
      $outputStream->close();
    }
    $pres->save("pres.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Přidání obrázků do hlavních snímků (Slide Masters)

Hlavní snímek je vrchní snímek, který ukládá a řídí informace (téma, rozvržení, atd.) o všech snímcích pod ním. Když tedy přidáte obrázek do hlavního snímku, tento obrázek se objeví na každém snímku pod tímto hlavním snímkem.

Tento Java ukázkový kód vám ukazuje, jak přidat obrázek do hlavního snímku:

  $pres = new Presentation();
  try {
    $slide = $pres->getSlides()->get_Item(0);
    $masterSlide = $slide->getLayoutSlide()->getMasterSlide();
    $picture;
    $image = Images->fromFile("image.png");
    try {
      $picture = $pres->getImages()->addImage($image);
    } finally {
      if (!java_is_null($image)) {
        $image->dispose();
      }
    }
    $masterSlide->getShapes()->addPictureFrame(ShapeType::Rectangle, 10, 10, 100, 100, $picture);
    $pres->save("pres.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Přidání obrázků jako pozadí snímků

Můžete se rozhodnout použít obrázek jako pozadí pro konkrétní snímek nebo několik snímků. V takovém případě se podívejte, jak nastavit obrázek jako pozadí snímku.

Přidání SVG do prezentací

Můžete přidat nebo vložit jakýkoli obrázek do prezentace pomocí metody addPictureFrame patřící do třídy ShapeCollection.

Pro vytvoření objektu obrázku založeného na SVG obrázku můžete postupovat takto:

  1. Vytvořte objekt SvgImage pro vložení do ImageShapeCollection
  2. Vytvořte objekt PPImage z ISvgImage
  3. Vytvořte objekt PictureFrame pomocí třídy PPImage

Tento ukázkový kód vám ukazuje, jak implementovat výše uvedené kroky pro přidání SVG obrázku do prezentace:

  # Vytvořte instanci třídy Presentation, která představuje soubor PPTX
  $pres = new Presentation();
  try {
$Array = new JavaClass("java.lang.reflect.Array");
$Byte = (new JavaClass("java.lang.Byte"))->TYPE;
try {
    $dis = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", "image.svg"));
    $bytes = $Array->newInstance($Byte, $dis->available());
    $dis->readFully($bytes);
} finally {
    if (!java_is_null($dis)) $dis->close();
}
    $svgContent = new String($bytes);

    $svgImage = new SvgImage($svgContent);
    $ppImage = $pres->getImages()->addImage($svgImage);
    $pres->getSlides()->get_Item(0)->getShapes()->addPictureFrame(ShapeType::Rectangle, 0, 0, $ppImage->getWidth(), $ppImage->getHeight(), $ppImage);
    $pres->save("output.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Převod SVG na sadu tvarů

Převod SVG na sadu tvarů v Aspose.Slides je podobný funkčnosti PowerPointu používané pro práci s SVG obrázky:

PowerPoint Popup Menu

Funkčnost je poskytována jednou z přetížených metod addGroupShape třídy ShapeCollection, která přijímá objekt SvgImage jako první argument.

Tento ukázkový kód vám ukazuje, jak použít popsanou metodu k převodu SVG souboru na sadu tvarů:

  # Vytvořit novou prezentaci
  $presentation = new Presentation();
  try {
    # Načíst obsah souboru SVG
$Array = new JavaClass("java.lang.reflect.Array");
$Byte = (new JavaClass("java.lang.Byte"))->TYPE;
try {
    $dis = new Java("java.io.DataInputStream", new Java("java.io.FileInputStream", "image.svg"));
    $bytes = $Array->newInstance($Byte, $dis->available());
    $dis->readFully($bytes);
} finally {
    if (!java_is_null($dis)) $dis->close();
}
    $svgContent = $bytes;

    # Vytvořit objekt SvgImage
    $svgImage = new SvgImage($svgContent);
    # Získat velikost snímku
    $slideSize = $presentation->getSlideSize()->getSize();
    # Převést SVG obrázek na skupinu tvarů a přizpůsobit jej velikosti snímku
    $presentation->getSlides()->get_Item(0)->getShapes()->addGroupShape($svgImage, 0.0, 0.0, $slideSize->getWidth(), $slideSize->getHeight());
    # Uložit prezentaci ve formátu PPTX
    $presentation->save("output.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($presentation)) {
      $presentation->dispose();
    }
  }

Přidání obrázků jako EMF do snímků

Aspose.Slides for PHP via Java umožňuje generovat EMF obrázky z excelových listů a přidávat je jako EMF do snímků pomocí Aspose.Cells.

Tento ukázkový kód vám ukazuje, jak provést popsaný úkol:

  $book = new Workbook("chart.xlsx");
  $sheet = $book->getWorksheets()->get(0);
  $options = new ImageOrPrintOptions();
  $options->setHorizontalResolution(200);
  $options->setVerticalResolution(200);
  $options->setImageType(ImageType::EMF);
  # Uložit sešit do proudu
  $sr = new SheetRender($sheet, $options);
  $pres = new Presentation();
  try {
    $pres->getSlides()->removeAt(0);
    $EmfSheetName = "";
    for($j = 0; $j < java_values($sr->getPageCount()) ; $j++) {
      $EmfSheetName = "test" . $sheet->getName() . " Page" . $j + 1 . ".out.emf";
      $sr->toImage($j, $EmfSheetName);
      $picture;
      $image = Images->fromFile($EmfSheetName);
      try {
        $picture = $pres->getImages()->addImage($image);
      } finally {
        if (!java_is_null($image)) {
          $image->dispose();
        }
      }
      $slide = $pres->getSlides()->addEmptySlide($pres->getLayoutSlides()->getByType(SlideLayoutType::Blank));
      $m = $slide->getShapes()->addPictureFrame(ShapeType::Rectangle, 0, 0, $pres->getSlideSize()->getSize()->getWidth(), $pres->getSlideSize()->getSize()->getHeight(), $picture);
    }
    $pres->save("output.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Nahrazení obrázků ve sbírce obrázků

Aspose.Slides umožňuje nahradit obrázky uložené v kolekci obrázků prezentace (včetně těch, které používají tvary snímků). Tato sekce ukazuje několik přístupů k aktualizaci obrázků v kolekci. API poskytuje jednoduché metody pro nahrazení obrázku pomocí surových bajtových dat, instance IImage nebo jiného obrázku, který již v kolekci existuje.

Postupujte podle následujících kroků:

  1. Načtěte soubor prezentace, který obsahuje obrázky, pomocí třídy Presentation.
  2. Načtěte nový obrázek ze souboru do bajtového pole.
  3. Nahraďte cílový obrázek novým obrázkem pomocí bajtového pole.
  4. Ve druhém přístupu načtěte obrázek do objektu IImage a nahraďte cílový obrázek tímto objektem.
  5. Ve třetím přístupu nahraďte cílový obrázek obrázkem, který již v kolekci prezentace existuje.
  6. Uložte upravenou prezentaci jako soubor PPTX.
// Vytvořte instanci třídy Presentation, která představuje soubor prezentace.
$presentation = new Presentation("sample.pptx");
try {
    // První způsob.
    $imagePath = (new Java("java.io.File", "image0.jpeg"))->toPath();
    $imageData = (new Java("java.nio.file.Files"))->readAllBytes($imagePath);
    $oldImage = $presentation->getImages()->get_Item(0);
    $oldImage->replaceImage($imageData);

    // Druhý způsob.
    $newImage = Images::fromFile("image1.png");
    $oldImage = $presentation->getImages()->get_Item(1);
    $oldImage->replaceImage($newImage);
    $newImage->dispose();
    
    // Třetí způsob.
    $oldImage = $presentation->getImages()->get_Item(2);
    $oldImage->replaceImage($presentation->getImages()->get_Item(3));
    
    // Uložit prezentaci do souboru.
    $presentation->save("output.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

Často kladené otázky

Zůstane po vložení původní rozlišení obrázku zachováno?

Ano. Původní pixely jsou zachovány, ale finální vzhled závisí na tom, jak je obrázek škálován na snímku a jaká komprese je aplikována při uložení.

Jaký je nejlepší způsob, jak najednou nahradit stejné logo na desítkách snímků?

Umístěte logo na hlavní snímek nebo rozvržení a nahraďte jej v kolekci obrázků prezentace — aktualizace se projeví ve všech prvcích, které tento zdroj používají.

Může být vložený SVG převeden na editovatelné tvary?

Ano. SVG můžete převést na skupinu tvarů, po čemž se jednotlivé části stanou editovatelnými pomocí standardních vlastností tvaru.

Jak nastavit obrázek jako pozadí pro více snímků najednou?

Přiřaďte obrázek jako pozadí na hlavním snímku nebo příslušném rozvržení — všechny snímky používající tento hlavní snímek/rozvržení zdědí pozadí.

Jak zabránit „nafouknutí“ prezentace kvůli mnoha obrázkům?

Znovu použijte jediný zdroj obrázku místo duplicit, zvolte rozumná rozlišení, aplikujte kompresi při ukládání a opakovanou grafiku umístěte na hlavní snímek, kde je to vhodné.