Képkeretek kezelése prezentációkban C++ segítségével

Bevezetés

A képkeret egy olyan alakzat, amely képet tartalmaz – ez olyan, mint egy kép egy keretben.

Képet adhat hozzá egy diára egy képkereten keresztül. Így a képet a képkeret formázásával formázhatja.

Képkeret létrehozása

  1. Hozzon létre egy példányt a Presentation class osztályból.
  2. Szerezze meg a dia hivatkozását az indexe alapján.
  3. Hozzon létre egy IPPImage objektumot úgy, hogy képet ad hozzá a IImagescollection gyűjteményhez, amely a prezentáció objektumhoz kapcsolódik, és a forma kitöltésére lesz használva.
  4. Adja meg a kép szélességét és magasságát.
  5. Hozzon létre egy PictureFrame objektumot a kép szélessége és magassága alapján az AddPictureFrame metódus használatával, amely a hivatkozott diához kapcsolódó alakzat objektumnál érhető el.
  6. Adjon hozzá egy képkeretet (amely a képet tartalmazza) a diához.
  7. Írja ki a módosított prezentációt PPTX fájlként.
// A dokumentumok könyvtárának elérési útja.
const String outPath = u"../out/PictureFrameFormatting_out.pptx";
const String filePath = u"../templates/Tulips.jpg";

// Betölti a kívánt prezentációt.
SharedPtr<Presentation> pres = MakeObject<Presentation>();

// Az első diát eléri.
SharedPtr<ISlide> slide = pres->get_Slide(0);

// Betölti a képet, amely a prezentáció képgyűjteményéhez lesz hozzáadva.
// Lekéri a képet.
auto image = Images::FromFile(filePath);

// Képet ad a prezentáció képgyűjteményéhez.
SharedPtr<IPPImage> imgx = pres->get_Images()->AddImage(image);

// Képkeretet ad a diához.
SharedPtr<IPictureFrame> pf = slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, imgx);

// Beállítja a relatív méretezés szélességét és magasságát.
pf->set_RelativeScaleHeight(0.8);
pf->set_RelativeScaleWidth(1.35);
// Formáz néhány beállítást a képkeretre.
pf->get_LineFormat()->get_FillFormat()->set_FillType(FillType::Solid);
pf->get_LineFormat()->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Blue());
pf->get_LineFormat()->set_Width ( 20);
pf->set_Rotation( 45);

// A PPTX fájlt lemezre írja.
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);

Képkeret létrehozása relatív méretezéssel

A kép relatív méretezésének módosításával összetettebb képkeretet hozhat létre.

  1. Hozzon létre egy példányt a Presentation class osztályból.
  2. Szerezze meg a dia hivatkozását az indexe alapján.
  3. Adjon hozzá egy képet a prezentáció képgyűjteményéhez.
  4. Hozzon létre egy IPPImage objektumot úgy, hogy képet ad hozzá a IImagescollection gyűjteményhez, amely a prezentáció objektumhoz kapcsolódik, és a forma kitöltésére lesz használva.
  5. Adja meg a kép relatív szélességét és magasságát a képkeretben.
  6. Írja ki a módosított prezentációt PPTX fájlként.
// A dokumentumok könyvtárának elérési útja.
const String outPath = u"../out/AddRelativeScaleHeightPictureFrame_out.pptx";
const String filePath = u"../templates/Tulips.jpg";

// Betölti a kívánt prezentációt.
SharedPtr<Presentation> pres = MakeObject<Presentation>();

// Eléri az első diát.
SharedPtr<ISlide> slide = pres->get_Slide(0);

// Betölti a képet, amely a prezentáció képgyűjteményéhez lesz hozzáadva.
// Lekéri a képet.
auto image = Images::FromFile(filePath);

// Képet ad a prezentáció képgyűjteményéhez.
SharedPtr<IPPImage> imgx = pres->get_Images()->AddImage(image);

// Képkeretet ad a diához.
SharedPtr<IPictureFrame> pf = slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, imgx);

// Beállítja a relatív méretezés szélességét és magasságát.
pf->set_RelativeScaleHeight (0.8);
pf->set_RelativeScaleWidth(1.35);

// A PPTX fájlt lemezre írja.
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);

Raszteres képek kinyerése képkeretekből

Raszteres képeket nyerhet ki a PictureFrame objektumokból, és elmentheti őket PNG, JPG és más formátumokban. Az alábbi kódrészlet bemutatja, hogyan nyerhet ki egy képet a “sample.pptx” dokumentumból, és mentheti PNG formátumban.

auto presentation = MakeObject<Presentation>(u"sample.pptx");
auto firstSlide = presentation->get_Slide(0);
auto firstShape = firstSlide->get_Shape(0);
    
if (ObjectExt::Is<IPictureFrame>(firstShape))
{
    auto pictureFrame = ExplicitCast<IPictureFrame>(firstShape);
    auto image = pictureFrame->get_PictureFormat()->get_Picture()->get_Image()->get_SystemImage();

    image->Save(u"slide_1_shape_1.png", ImageFormat::get_Png());
}

presentation->Dispose();

SVG képek kinyerése képkeretekből

Amikor egy prezentáció SVG grafikákat tartalmaz, amelyek a PictureFrame alakzatokban vannak elhelyezve, az Aspose.Slides for C++ lehetővé teszi, hogy a teljes pontossággal visszanyerje az eredeti vektorképeket. A dia alakzatgyűjteményének bejárásával azonosíthatja minden egyes PictureFrame, ellenőrizheti, hogy az alá tartozó IPPImage tartalmaz-e SVG tartalmat, majd mentheti a képet a lemezre vagy egy adatfolyamra natív SVG formátumban.

auto presentation = MakeObject<Presentation>(u"sample.pptx");

auto slide = presentation->get_Slide(0);
auto shape = slide->get_Shape(0);

if (ObjectExt::Is<IPictureFrame>(shape))
{
    auto pictureFrame = ExplicitCast<IPictureFrame>(shape);
    auto svgImage = pictureFrame->get_PictureFormat()->get_Picture()->get_Image()->get_SvgImage();
    if (svgImage != nullptr)
    {
        File::WriteAllText(u"output.svg", svgImage->get_SvgContent());
    }
}

presentation->Dispose();

Kép átlátszóságának lekérése

Az Aspose.Slides lehetővé teszi, hogy lekérje egy képre alkalmazott átlátszósági effektust. Ez a C++ kód bemutatja a műveletet:

auto presentation = System::MakeObject<Presentation>(u"Test.pptx");
auto pictureFrame = System::ExplicitCast<IPictureFrame>(presentation->get_Slide(0)->get_Shape(0));
auto imageTransform = pictureFrame->get_PictureFormat()->get_Picture()->get_ImageTransform();
for (auto&& effect : imageTransform)
{
    if (System::ObjectExt::Is<IAlphaModulateFixed>(effect))
    {
        float transparencyValue = 100.0f - (System::ExplicitCast<IAlphaModulateFixed>(effect))->get_Amount();
        System::Console::WriteLine(System::String(u"Picture transparency: ") + transparencyValue);
    }
}

Kép fényerősségének és kontrasztjának lekérése

Az Aspose.Slides lehetővé teszi, hogy lekérje egy képre alkalmazott fényerő és kontraszt effektust. A ILuminance interfész képzi ezt a képtranszformációs effektust.

Ez a C++ kód bemutatja, hogyan lehet lekérni a fényerő és kontraszt beállításait egy képkeretből:

auto presentation = System::MakeObject<Presentation>(u"sample.pptx");
auto slide = presentation->get_Slide(0);

auto shape = slide->get_Shape(0);
auto pictureFrame = System::ExplicitCast<IPictureFrame>(shape);

auto imageTransform = pictureFrame->get_PictureFormat()->get_Picture()->get_ImageTransform();
for (auto&& effect : imageTransform)
{
    if (System::ObjectExt::Is<ILuminance>(effect))
    {
        auto luminance = System::ExplicitCast<ILuminance>(effect)->GetEffective();
        auto brightness = luminance->get_Brightness();
        auto contrast = luminance->get_Contrast();

        Console::WriteLine(System::String(u"Brightness: ") + brightness);
        Console::WriteLine(System::String(u"Contrast: ") + contrast);
    }
}

presentation->Dispose();

Képkeret formázása

Az Aspose.Slides számos formázási lehetőséget kínál, amelyeket egy képkeretre lehet alkalmazni. Ezekkel a beállításokkal a képkeretet a specifikus követelményekhez igazíthatja.

  1. Hozzon létre egy példányt a Presentation class osztályból.
  2. Szerezze meg a dia hivatkozását az indexe alapján.
  3. Hozzon létre egy IPPImage objektumot úgy, hogy képet ad hozzá a IImagescollection gyűjteményhez, amely a prezentáció objektumhoz kapcsolódik, és a forma kitöltésére lesz használva.
  4. Adja meg a kép szélességét és magasságát.
  5. Hozzon létre egy PictureFrame-et a kép szélessége és magassága alapján a AddPictureFrame metódus használatával, amely a hivatkozott diához kapcsolódó IShapes objektumnál érhető el.
  6. Adjon hozzá a képkeretet (amely a képet tartalmazza) a diához.
  7. Állítsa be a képkeret vonalszínét.
  8. Állítsa be a képkeret vonalvastagságát.
  9. Forgassa el a képkeretet pozitív vagy negatív érték megadásával.
    • A pozitív érték az óramutató járásával megegyező irányban forgatja a képet.
    • A negatív érték az óramutató járásával ellentétes irányban forgatja a képet.
  10. Adjon hozzá a képkeretet (amely a képet tartalmazza) a diához.
  11. Írja ki a módosított prezentációt PPTX fájlként.
// A dokumentumok könyvtárának elérési útja.
const String outPath = u"../out/AddRelativeScaleHeightPictureFrame_out.pptx";
const String filePath = u"../templates/Tulips.jpg";

// Betölti a kívánt prezentációt.
SharedPtr<Presentation> pres = MakeObject<Presentation>();

// Az első diát eléri.
SharedPtr<ISlide> slide = pres->get_Slides()->idx_get(0);

// Betölti a képet, amely a prezentáció képgyűjteményéhez lesz hozzáadva.
// Lekéri a képet.
auto image = Images::FromFile(filePath);

// Képet ad a prezentáció képgyűjteményéhez.
SharedPtr<IPPImage> imgx = pres->get_Images()->AddImage(image);

// Képkeretet ad a diához.
SharedPtr<IPictureFrame> pf = slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, imgx);

// Beállítja a relatív méretezés szélességét és magasságát.
pf->set_RelativeScaleHeight (0.8);
pf->set_RelativeScaleWidth(1.35);

// A PPTX fájlt lemezre írja.
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);

Kép hozzáadása linkként

A nagy méretű prezentációk elkerülése érdekében képeket (vagy videókat) is hozzáadhat linkeken keresztül, ahelyett, hogy a fájlokat közvetlenül beágyazná a prezentációba. Ez a C++ kód bemutatja, hogyan adjon hozzá egy képet és videót egy helyőrzőhöz:

auto presentation = System::MakeObject<Presentation>(u"input.pptx");
auto shapesToRemove = System::MakeObject<System::Collections::Generic::List<System::SharedPtr<IShape>>>();
auto shapes = presentation->get_Slides()->idx_get(0)->get_Shapes();

for (auto& autoShape : shapes)
{
    if (autoShape->get_Placeholder() == nullptr)
        continue;

    switch (autoShape->get_Placeholder()->get_Type())
    {
        case Aspose::Slides::PlaceholderType::Picture:
        {
            auto pictureFrame = shapes->AddPictureFrame(Aspose::Slides::ShapeType::Rectangle, autoShape->get_X(), autoShape->get_Y(), autoShape->get_Width(), autoShape->get_Height(), nullptr);
            pictureFrame->get_PictureFormat()->get_Picture()->set_LinkPathLong(u"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 Aspose::Slides::PlaceholderType::Media:
        {
            auto videoFrame = shapes->AddVideoFrame(autoShape->get_X(), autoShape->get_Y(), autoShape->get_Width(), autoShape->get_Height(), u"");
            videoFrame->get_PictureFormat()->get_Picture()->set_LinkPathLong(u"https://upload.wikimedia.org/wikipedia/commons/3/3a/I.M_at_Old_School_Public_Broadcasting_in_October_2016_02.jpg");
            videoFrame->set_LinkPathLong(u"https://youtu.be/t_1LYZ102RA");
            shapesToRemove->Add(autoShape);
            break;
        }
    }
}

for (auto& shape : shapesToRemove)
{
    shapes->Remove(shape);
}

presentation->Save(u"output.pptx", Aspose::Slides::Export::SaveFormat::Pptx);

Képek vágása

Ez a C++ kód bemutatja, hogyan vághat le egy meglévő képet egy dián:

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System::Drawing;
    
auto presentation = System::MakeObject<Presentation>();
// Új képobjektumot hoz létre
auto newImage = presentation->get_Images()->AddImage(Images::FromFile(imagePath));

// Képkeretet ad egy diához
auto picFrame = presentation->get_Slides()->idx_get(0)->get_Shapes()->AddPictureFrame(Aspose::Slides::ShapeType::Rectangle, 100.0f, 100.0f, 420.0f, 250.0f, newImage);

// Levágja a képet (százalékos értékek)
picFrame->get_PictureFormat()->set_CropLeft(23.6f);
picFrame->get_PictureFormat()->set_CropRight(21.5f);
picFrame->get_PictureFormat()->set_CropTop(3.0f);
picFrame->get_PictureFormat()->set_CropBottom(31.0f);

// Elmenti az eredményt
presentation->Save(outPptxFile, Aspose::Slides::Export::SaveFormat::Pptx);

Kép vágott területeinek törlése

Ha törölni szeretné egy keretben lévő kép vágott területeit, használhatja az IPictureFillFormat::DeletePictureCroppedAreas() metódust. Ez a metódus visszaadja a vágott képet, vagy az eredeti képet, ha a vágás nem szükséges.

Ez a C++ kód bemutatja a műveletet:

System::SharedPtr<Presentation> presentation = System::MakeObject<Presentation>(u"PictureFrameCrop.pptx");
System::SharedPtr<ISlide> slide = presentation->get_Slide(0);

// Gets the PictureFrame from the first slide
System::SharedPtr<IPictureFrame> picFrame = System::AsCast<IPictureFrame>(slide->get_Shape(0));

// Deletes cropped areas of the PictureFrame image and returns the cropped image
System::SharedPtr<IPPImage> croppedImage = picFrame->get_PictureFormat()->DeletePictureCroppedAreas();

// Saves the result
presentation->Save(u"PictureFrameDeleteCroppedAreas.pptx", SaveFormat::Pptx);

Képek tömörítése

A prezentációban lévő képet a IPictureFillFormat::CompressImage() metódussal lehet tömöríteni.
Ez a metódus a képet a forma mérete és a megadott felbontás alapján csökkenti, lehetőséget adva a vágott területek törlésére is.

A kép méretét és felbontását úgy állítja be, mint a PowerPoint Picture Format -> Compress Pictures -> Resolution funkciója.

Az alábbi C++ példák bemutatják, hogyan lehet tömöríteni egy képet a prezentációban célfelbontás megadásával és opcionálisan a vágott területek eltávolításával:

auto presentation = System::MakeObject<Presentation>(u"demo.pptx");
auto slide = presentation->get_Slide(0);
auto pictureFrame = System::AsCast<IPictureFrame>(slide->get_Shape(0));

// Tömöríti a képet 150 DPI (web felbontás) célfelbontással, és eltávolítja a vágott területeket.
bool result = pictureFrame->get_PictureFormat()->CompressImage(true, PicturesCompression::Dpi150);

// Ellenőrzi a tömörítés eredményét.
if (result)
{
    System::Console::WriteLine(u"Image successfully compressed.");
}
else
{
    System::Console::WriteLine(u"Image compression failed or no changes were necessary.");
}

presentation->Save(u"CompressedImage.pptx", SaveFormat::Pptx);
presentation->Dispose();

Vagy közvetlenül egy egyéni DPI érték használatával:

auto presentation = System::MakeObject<Presentation>(u"demo.pptx");
auto slide = presentation->get_Slide(0);
auto pictureFrame = System::AsCast<IPictureFrame>(slide->get_Shape(0));

// A képet 150 DPI-re (web felbontás) tömöríti, a vágott területeket eltávolítva.
pictureFrame->get_PictureFormat()->CompressImage(true, 150.0f);

presentation->Save(u"CompressedImage.pptx", SaveFormat::Pptx);
presentation->Dispose();

Oldalarány zárolása

Ha egy képet tartalmazó alakzatot szeretne megtartani az oldalarányát a kép méretének módosítása után is, használhatja a set_AspectRatioLocked() metódust a Lock Aspect Ratio beállítás aktiválásához.

Ez a C++ kód bemutatja, hogyan zárolható egy alakzat oldalaránya:

System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>(u"pres.pptx");

System::SharedPtr<ILayoutSlide> layout = pres->get_LayoutSlides()->GetByType(SlideLayoutType::Custom);
System::SharedPtr<ISlide> emptySlide = pres->get_Slides()->AddEmptySlide(layout);

System::SharedPtr<IImage> image = Images::FromFile(u"image.png");
System::SharedPtr<IPPImage> presImage = pres->get_Images()->AddImage(image);

System::SharedPtr<IPictureFrame> pictureFrame = emptySlide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 50.0f, 150.0f, static_cast<float>(presImage->get_Width()), static_cast<float>(presImage->get_Height()), presImage);

// Állítsa be az alakzatot, hogy átméretezéskor megőrizze az oldalarányt
pictureFrame->get_PictureFrameLock()->set_AspectRatioLocked(true);

StretchOff tulajdonság használata

A StretchOffsetLeft, StretchOffsetTop, StretchOffsetRight és StretchOffsetBottom tulajdonságok használatával az IPictureFillFormat interfészből és a PictureFillFormat osztályból megadhat egy kitöltő téglalapot.

Ha a kép nyújtása meg van adva, a forrástéglalapot a megadott kitöltő téglalaphoz méretezi át. A kitöltő téglalap minden éle egy százalékos eltolással van meghatározva az alakzat határoló dobozának megfelelő élétől. A pozitív százalék egy behúzást jelent, a negatív százalék pedig egy kitágulást.

  1. Hozzon létre egy példányt a Presentation osztályból.
  2. Szerezze meg a dia hivatkozását az indexe alapján.
  3. Adjon hozzá egy AutoShape téglalapot.
  4. Hozzon létre egy képet.
  5. Állítsa be az alakzat kitöltéstípusát.
  6. Állítsa be az alakzat képkitöltési módját.
  7. Adjon hozzá egy beállított képet az alakzat kitöltéséhez.
  8. Adja meg a kép eltolásait a alakzat határoló dobozának megfelelő élétől.
  9. Írja ki a módosított prezentációt PPTX fájlként.
auto pres = System::MakeObject<Presentation>();
auto ppImage = pres->get_Images()->AddImage(Images::FromFile(u"image.png"));
auto slide = pres->get_Slide(0);
auto pictureFrame = slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 10.0f, 10.0f, 400.0f, 400.0f, ppImage);

// Beállítja a képet, hogy minden oldalról nyújtva legyen az alakzat testében
auto pictureFormat = pictureFrame->get_PictureFormat();
pictureFormat->set_PictureFillMode(PictureFillMode::Stretch);
pictureFormat->set_StretchOffsetLeft(24.0f);
pictureFormat->set_StretchOffsetRight(24.0f);
pictureFormat->set_StretchOffsetTop(24.0f);
pictureFormat->set_StretchOffsetBottom(24.0f);

pres->Save(u"imageStretch.pptx", SaveFormat::Pptx);

GYIK

Hogyan tudom megtudni, hogy mely képformátumok támogatottak a PictureFrame esetén?
Az Aspose.Slides támogatja mind a raszteres képeket (PNG, JPEG, BMP, GIF stb.), mind a vektorképeket (például SVG) a PictureFrame‑hez rendelt képobjektumon keresztül. A támogatott formátumok listája általában átfedésben van a dia és a képkonverziós motor képességeivel.

Hogyan befolyásolja a PPTX méretét és teljesítményét a tucatnyi nagy kép hozzáadása?
A nagy képek beágyazása növeli a fájlméretet és a memóriahasználatot; a képek linkként való hozzáadása segít csökkenteni a prezentáció méretét, de az külső fájloknak elérhetőnek kell maradniuk. Az Aspose.Slides lehetőséget biztosít a képek linkkel történő hozzáadására a fájlméret csökkentése érdekében.

Hogyan tudom zárolni egy képobjektumot a véletlen mozgatás/átméretezés ellen?
Használjon shape locks egy PictureFrame esetén (például a mozgatás vagy átméretezés letiltásával). A zárolási mechanizmus a formákra vonatkozóan egy külön protection article leírásban található, és különféle forma típusok, köztük a PictureFrame számára támogatott.

Megmarad-e az SVG vektor pontossága, amikor egy prezentációt PDF-re/képre exportálunk?
Az Aspose.Slides lehetővé teszi az SVG kinyerését egy PictureFrame‑ből eredeti vektorként. Amikor PDF-re exportálunk vagy raszteres formátumokra, az eredmény a export beállításaitól függően rasterizálódhat; a kinyerési viselkedés megerősíti, hogy az eredeti SVG vektor formában van tárolva.