إدارة إطارات الصور في العروض التقديمية باستخدام C++
إطار الصورة هو شكل يحتوي على صورة — إنه مثل صورة داخل إطار.
يمكنك إضافة صورة إلى شريحة عبر إطار صورة. بهذه الطريقة، يمكنك تنسيق الصورة عن طريق تنسيق إطار الصورة.
نصيحة
توفر Aspose محولات مجانية—JPEG إلى PowerPoint وPNG إلى PowerPoint—تسمح للناس بإنشاء عروض تقديمية بسرعة من الصور.إنشاء إطار صورة
- إنشاء كائن من فئة Presentation class.
- احصل على مرجع الشريحة عبر فهرستها.
- إنشاء كائن IPPImage عن طريق إضافة صورة إلى مجموعة IImagescollection المرتبطة بكائن العرض الذي سيُستخدم لملء الشكل.
- حدد عرض وارتفاع الصورة.
- إنشاء PictureFrame استنادًا إلى عرض وارتفاع الصورة عبر طريقة
AddPictureFrameالتي يوفرها كائن الشكل المرتبط بالشريحة المشار إليها. - إضافة إطار صورة (المحتوي على الصورة) إلى الشريحة.
- حفظ العرض المعدل كملف PPTX.
يوضح لك هذا الكود C++ كيفية إنشاء إطار صورة:
// مسار دليل المستندات.
const String outPath = u"../out/PictureFrameFormatting_out.pptx";
const String filePath = u"../templates/Tulips.jpg";
// تحميل العرض التقديمي المطلوب
SharedPtr<Presentation> pres = MakeObject<Presentation>();
// الوصول إلى الشريحة الأولى
SharedPtr<ISlide> slide = pres->get_Slide(0);
// تحميل الصورة التي ستُضاف إلى مجموعة صور العرض التقديمي
// الحصول على الصورة
auto image = Images::FromFile(filePath);
// إضافة صورة إلى مجموعة صور العرض التقديمي
SharedPtr<IPPImage> imgx = pres->get_Images()->AddImage(image);
// إضافة إطار صورة إلى الشريحة
SharedPtr<IPictureFrame> pf = slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, imgx);
// تعيين نسبة العرض والارتفاع النسبية
pf->set_RelativeScaleHeight(0.8);
pf->set_RelativeScaleWidth(1.35);
// تطبيق بعض التنسيقات على إطار الصورة
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);
//كتابة ملف PPTX إلى القرص
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);
إنشاء إطار صورة مع مقياس نسبي
عن طريق تعديل مقياس الصورة النسبي، يمكنك إنشاء إطار صورة أكثر تعقيدًا.
- إنشاء كائن من فئة Presentation class.
- احصل على مرجع الشريحة عبر فهرستها.
- إضافة صورة إلى مجموعة صور العرض.
- إنشاء كائن IPPImage عن طريق إضافة صورة إلى مجموعة IImagescollection المرتبطة بكائن العرض الذي سيُستخدم لملء الشكل.
- تحديد العرض والارتفاع النسبيين للصورة داخل إطار الصورة.
- حفظ العرض المعدل كملف PPTX.
يوضح لك هذا الكود C++ كيفية إنشاء إطار صورة مع مقياس نسبي:
// مسار دليل المستندات.
const String outPath = u"../out/AddRelativeScaleHeightPictureFrame_out.pptx";
const String filePath = u"../templates/Tulips.jpg";
// تحميل العرض التقديمي المطلوب
SharedPtr<Presentation> pres = MakeObject<Presentation>();
// الوصول إلى الشريحة الأولى
SharedPtr<ISlide> slide = pres->get_Slide(0);
// تحميل الصورة التي ستُضاف إلى مجموعة صور العرض التقديمي
// الحصول على الصورة
auto image = Images::FromFile(filePath);
// إضافة صورة إلى مجموعة صور العرض التقديمي
SharedPtr<IPPImage> imgx = pres->get_Images()->AddImage(image);
// إضافة إطار صورة إلى الشريحة
SharedPtr<IPictureFrame> pf = slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, imgx);
// تعيين نسبة العرض والارتفاع النسبية
pf->set_RelativeScaleHeight (0.8);
pf->set_RelativeScaleWidth(1.35);
// كتابة ملف PPTX إلى القرص
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);
استخراج الصور النقطية من إطارات الصورة
يمكنك استخراج الصور النقطية من كائنات PictureFrame وحفظها بصيغ PNG، JPG، وغيرها. يوضح المثال البرمجي أدناه كيفية استخراج صورة من المستند “sample.pptx” وحفظها بتنسيق PNG.
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 من إطارات الصورة
عندما يحتوي عرض على رسومات SVG موضوعة داخل أشكال PictureFrame ، يسمح Aspose.Slides للـ C++ باسترجاع الصور المتجهة الأصلية بجودة كاملة. من خلال استعراض مجموعة أشكال الشريحة، يمكنك تحديد كل PictureFrame، وفحص ما إذا كان كائن IPPImage يحتوي على محتوى SVG، ثم حفظ تلك الصورة إلى القرص أو تدفق بصيغتها الأصلية SVG.
يوضح المثال البرمجي التالي كيفية استخراج صورة SVG من إطار صورة:
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();
الحصول على شفافية الصورة
تسمح لك Aspose.Slides بالحصول على تأثير الشفافية المطبق على الصورة. يظهر هذا الكود C++ العملية:
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);
}
}
تنسيق إطار الصورة
توفر Aspose.Slides العديد من خيارات التنسيق التي يمكن تطبيقها على إطار الصورة. باستخدام هذه الخيارات، يمكنك تعديل إطار الصورة ليتطابق مع المتطلبات المحددة.
- إنشاء كائن من فئة Presentation class.
- احصل على مرجع الشريحة عبر فهرستها.
- إنشاء كائن IPPImage عن طريق إضافة صورة إلى مجموعة IImagescollection المرتبطة بكائن العرض الذي سيُستخدم لملء الشكل.
- حدد عرض وارتفاع الصورة.
- إنشاء
PictureFrameاستنادًا إلى عرض وارتفاع الصورة عبر طريقة AddPictureFrame التي يوفرها كائن IShapes المرتبط بالشريحة المشار إليها. - إضافة إطار الصورة (المحتوي على الصورة) إلى الشريحة.
- تعيين لون حد إطار الصورة.
- تعيين عرض حد إطار الصورة.
- تدوير إطار الصورة عن طريق إعطائه قيمة إيجابية أو سلبية.
- قيمة إيجابية تدور الصورة مع عقارب الساعة.
- قيمة سلبية تدور الصورة عكس عقارب الساعة.
- إضافة إطار الصورة (المحتوي على الصورة) إلى الشريحة.
- حفظ العرض المعدل كملف PPTX.
يوضح هذا الكود C++ عملية تنسيق إطار الصورة:
// مسار دليل المستندات.
const String outPath = u"../out/AddRelativeScaleHeightPictureFrame_out.pptx";
const String filePath = u"../templates/Tulips.jpg";
// تحميل العرض التقديمي المطلوب
SharedPtr<Presentation> pres = MakeObject<Presentation>();
// الوصول إلى الشريحة الأولى
SharedPtr<ISlide> slide = pres->get_Slides()->idx_get(0);
// تحميل الصورة التي ستُضاف إلى مجموعة صور العرض التقديمي
// الحصول على الصورة
auto image = Images::FromFile(filePath);
// إضافة صورة إلى مجموعة صور العرض التقديمي
SharedPtr<IPPImage> imgx = pres->get_Images()->AddImage(image);
// إضافة إطار صورة إلى الشريحة
SharedPtr<IPictureFrame> pf = slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, imgx);
// تعيين نسبة العرض والارتفاع النسبية
pf->set_RelativeScaleHeight (0.8);
pf->set_RelativeScaleWidth(1.35);
// كتابة ملف PPTX إلى القرص
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);
نصيحة
قامت Aspose مؤخرًا بتطوير صانع كولاج مجاني. إذا احتجت إلى دمج صور JPG/JPEG أو PNG، أو إنشاء شبكات من الصور، يمكنك استخدام هذه الخدمة.إضافة صورة كارتباط
لتجنب أحجام عروض تقديمية كبيرة، يمكنك إضافة الصور (أو الفيديوهات) من خلال روابط بدلاً من تضمين الملفات مباشرةً في العروض. يظهر لك هذا الكود C++ كيفية إضافة صورة وفيديو إلى عنصر نائب:
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);
قص الصور
يوضح لك هذا الكود C++ كيفية قص صورة موجودة على شريحة:
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System::Drawing;
auto presentation = System::MakeObject<Presentation>();
// إنشاء كائن صورة جديد
auto newImage = presentation->get_Images()->AddImage(Images::FromFile(imagePath));
// إضافة إطار صورة إلى شريحة
auto picFrame = presentation->get_Slides()->idx_get(0)->get_Shapes()->AddPictureFrame(Aspose::Slides::ShapeType::Rectangle, 100.0f, 100.0f, 420.0f, 250.0f, newImage);
// اقتصاص الصورة (قيم النسبة المئوية)
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);
// حفظ النتيجة
presentation->Save(outPptxFile, Aspose::Slides::Export::SaveFormat::Pptx);
حذف المناطق المقصوصة من الصورة
إذا رغبت في حذف المناطق المقصوصة من صورة موجودة في إطار، يمكنك استخدام طريقة IPictureFillFormat::DeletePictureCroppedAreas(). تُعيد هذه الطريقة الصورة المقتطة أو الصورة الأصلية إذا لم يكن القص ضروريًا.
يوضح هذا الكود C++ العملية:
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);
ملاحظة
تضيف طريقة IPictureFillFormat::DeletePictureCroppedAreas() الصورة المقتطة إلى مجموعة صور العرض. إذا كانت الصورة مستخدمة فقط في PictureFrame المعالجة، يمكن لهذا الإعداد تقليل حجم العرض. وإلا، سيزيد عدد الصور في العرض الناتج.
تحوِّل هذه الطريقة ملفات WMF/EMF إلى صور PNG نقطية في عملية القص.
قفل نسبة العرض إلى الارتفاع
إذا أردت أن يحتفظ الشكل الذي يحتوي على صورة بنسبة عرضه إلى ارتفاعه حتى بعد تغيير أبعاد الصورة، يمكنك استخدام طريقة set_AspectRatioLocked() لتفعيل إعداد قفل نسبة العرض إلى الارتفاع.
يوضح هذا الكود C++ كيفية قفل نسبة عرض الشكل:
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);
// set shape to have to preserve aspect ratio on resizing
pictureFrame->get_PictureFrameLock()->set_AspectRatioLocked(true);
ملاحظة
إعداد قفل نسبة العرض إلى الارتفاع يحافظ فقط على نسبة الشكل وليس الصورة التي يحتويها.استخدام خاصية StretchOff
باستخدام الخصائص StretchOffsetLeft، StretchOffsetTop، StretchOffsetRight وStretchOffsetBottom من واجهة IPictureFillFormat وفئة PictureFillFormat، يمكنك تحديد مستطيل تعبئة.
عند تحديد تمديد الصورة، يتم تحجيم المستطيل المصدر ليناسب مستطيل التعبئة المحدد. كل حافة من حواف مستطيل التعبئة تُعرف بنسبة إزاحة من الحافة المقابلة لمستطيل حدود الشكل. النسبة الموجبة تعني داخلي، والنسبة السالبة تعني خارجي.
- إنشاء كائن من فئة Presentation.
- احصل على مرجع الشريحة عبر فهرستها.
- إضافة مستطيل
AutoShape. - إنشاء صورة.
- تعيين نوع تعبئة الشكل.
- تعيين وضع تعبئة صورة الشكل.
- إضافة صورة تعبئة لتعبئة الشكل.
- تحديد إزاحات الصورة من الحافة المقابلة لمستطيل حدود الشكل.
- حفظ العرض المعدل كملف PPTX.
يوضح هذا الكود C++ عملية استخدام خاصية StretchOff:
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);
// يضبط تمدد الصورة من كل جانب في جسم الشكل
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);
الأسئلة المتكررة
كيف يمكنني معرفة تنسيقات الصور المدعومة لإطار الصورة؟
يدعم Aspose.Slides كلًّا من الصور النقطية (PNG، JPEG، BMP، GIF، إلخ) والصور المتجهة (مثل SVG) عبر كائن الصورة المُعيّن إلى PictureFrame. عمومًا تتقاطع قائمة التنسيقات المدعومة مع قدرات محرك التحويل للشرائح والصور.
كيف سيؤثر إضافة العشرات من الصور الكبيرة على حجم PPTX والأداء؟
تؤدي إضافة الصور الكبيرة إلى زيادة حجم الملف واستهلاك الذاكرة؛ ربط الصور يساعد على تقليل حجم العرض لكنه يتطلب توافر الملفات الخارجية. يوفر Aspose.Slides إمكانية إضافة الصور عبر رابط لتقليل حجم الملف.
كيف يمكنني قفل كائن الصورة لمنع تحريكه/تغييره غير مقصود؟
استخدم قفل الأشكال لإطار الصورة (مثلاً، تعطيل التحريك أو تغيير الحجم). يُشرح آلية القفل للأشكال في مقالة الحماية المنفصلة [/slides/cpp/applying-protection-to-presentation/] وتُدعم لأنواع متعددة من الأشكال بما في ذلك PictureFrame.
هل يتم الحفاظ على دقة متجهات SVG عند تصدير العرض إلى PDF/صور؟
يتيح Aspose.Slides استخراج SVG من PictureFrame كمتجه أصلي. عند التصدير إلى PDF أو تنسيقات نقطية، قد يتم تحويل النتيجة إلى نقطية بحسب إعدادات التصدير؛ ومع ذلك يبقى أن الـ SVG الأصلي مخزنًا كمتجه كما يؤكد سلوك الاستخراج.