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.
Tip
Az Aspose ingyenes konvertereket biztosít – JPEG to PowerPoint és PNG to PowerPoint –, amelyek lehetővé teszik, hogy gyorsan prezentációkat hozzanak létre képekből.Képkeret létrehozása
- Hozzon létre egy példányt a Presentation class osztályból.
- Szerezze meg a dia hivatkozását az indexe alapján.
- 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.
- Adja meg a kép szélességét és magasságát.
- Hozzon létre egy PictureFrame objektumot a kép szélessége és magassága alapján az
AddPictureFramemetódus használatával, amely a hivatkozott diához kapcsolódó alakzat objektumnál érhető el. - Adjon hozzá egy képkeretet (amely a képet tartalmazza) a diához.
- Í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.
- Hozzon létre egy példányt a Presentation class osztályból.
- Szerezze meg a dia hivatkozását az indexe alapján.
- Adjon hozzá egy képet a prezentáció képgyűjteményéhez.
- 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.
- Adja meg a kép relatív szélességét és magasságát a képkeretben.
- Í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.
- Hozzon létre egy példányt a Presentation class osztályból.
- Szerezze meg a dia hivatkozását az indexe alapján.
- 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.
- Adja meg a kép szélességét és magasságát.
- 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. - Adjon hozzá a képkeretet (amely a képet tartalmazza) a diához.
- Állítsa be a képkeret vonalszínét.
- Állítsa be a képkeret vonalvastagságát.
- 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.
- Adjon hozzá a képkeretet (amely a képet tartalmazza) a diához.
- Í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);
Tip
Az Aspose nemrég fejlesztett egy ingyenes Collage Maker szolgáltatást. Ha valaha meg kellene összevonni JPG/JPEG vagy PNG képeket, vagy rácsokat kellene készíteni fényképekből, használhatja ezt a szolgáltatást.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);
NOTE
Az IPictureFillFormat::DeletePictureCroppedAreas() metódus a vágott képet hozzáadja a prezentáció képgyűjteményéhez. Ha a képet csak a feldolgozott PictureFrame használja, ez a beállítás csökkentheti a prezentáció méretét. Ellenkező esetben a keletkező prezentációban lévő képek száma nő.
Ez a metódus a vágási művelet során WMF/EMF metafájlokat raszteres PNG képpé konvertál.
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();
NOTE
A metódus a képet alacsonyabb felbontásra konvertálja a forma mérete és a megadott DPI alapján. A vágott területek is törölhetők a fájlméret optimalizálása érdekében.Ha a kép metafájl (WMF/EMF) vagy SVG, a tömörítés nem lesz alkalmazva. Emellett a JPEG minőség megmarad vagy enyhén csökken a felbontás függvényében, hasonlóan ahhoz, ahogyan a PowerPoint kezeli a magas felbontású JPEG-eket.
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);
NOTE
Ez a Lock Aspect Ratio beállítás csak az alakzat oldalarányát őrzi meg, nem a benne lévő képét.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.
- Hozzon létre egy példányt a Presentation osztályból.
- Szerezze meg a dia hivatkozását az indexe alapján.
- Adjon hozzá egy
AutoShapetéglalapot. - Hozzon létre egy képet.
- Állítsa be az alakzat kitöltéstípusát.
- Állítsa be az alakzat képkitöltési módját.
- Adjon hozzá egy beállított képet az alakzat kitöltéséhez.
- Adja meg a kép eltolásait a alakzat határoló dobozának megfelelő élétől.
- Í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.