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

معرفی

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

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

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

  1. یک نمونه از Presentation class ایجاد کنید.
  2. از طریق ایندکس، مرجع یک اسلاید را دریافت کنید.
  3. با افزودن یک تصویر به IImagescollection که به شیء presentation مرتبط است و برای پر کردن شکل استفاده می‌شود، یک شیء IPPImage ایجاد کنید.
  4. عرض و ارتفاع تصویر را مشخص کنید.
  5. با استفاده از متد AddPictureFrame که توسط شیء shape مرتبط با اسلاید مرجع ارائه می‌شود، یک PictureFrame بر اساس عرض و ارتفاع تصویر ایجاد کنید.
  6. قاب تصویر (شامل تصویر) را به اسلاید اضافه کنید.
  7. ارائه‌ی تغییر یافته را به صورت فایل PPTX ذخیره کنید.
// مسیر پوشه اسناد.
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);

ایجاد یک قاب تصویر با مقیاس نسبی

با تغییر مقیاس نسبی یک تصویر، می‌توانید یک قاب تصویر پیچیده‌تر ایجاد کنید.

  1. یک نمونه از Presentation class ایجاد کنید.
  2. از طریق ایندکس، مرجع یک اسلاید را دریافت کنید.
  3. یک تصویر را به مجموعه تصاویر ارائه اضافه کنید.
  4. با افزودن یک تصویر به IImagescollection که به شیء presentation مرتبط است و برای پر کردن شکل استفاده می‌شود، یک شیء IPPImage ایجاد کنید.
  5. عرض و ارتفاع نسبی تصویر را در قاب تصویر مشخص کنید.
  6. ارائه‌ی تغییر یافته را به صورت فایل PPTX ذخیره کنید.
// مسیر پوشه اسناد.
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 بومی ذخیره کنید.

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 به شما امکان می‌دهد اثر روشنایی و کنتراست اعمال شده به یک تصویر را دریافت کنید. رابط ILuminance این اثر تبدیل تصویر را نشان می‌دهد.

این کد C++ نشان می‌دهد چگونه تنظیمات روشنایی و کنتراست را از یک قاب تصویر دریافت کنید:

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

قاب‌بندی تصویر

Aspose.Slides گزینه‌های قالب‌بندی متعددی را ارائه می‌دهد که می‌توانند بر روی یک قاب تصویر اعمال شوند. با استفاده از این گزینه‌ها می‌توانید قاب تصویر را به گونه‌ای تغییر دهید که با نیازمندی‌های خاص مطابقت داشته باشد.

  1. یک نمونه از Presentation class ایجاد کنید.
  2. از طریق ایندکس، مرجع یک اسلاید را دریافت کنید.
  3. با افزودن یک تصویر به IImagescollection که به شیء presentation مرتبط است و برای پر کردن شکل استفاده می‌شود، یک شیء IPPImage ایجاد کنید.
  4. عرض و ارتفاع تصویر را مشخص کنید.
  5. با استفاده از متد AddPictureFrame که توسط شیء IShapes مرتبط با اسلاید مرجع ارائه می‌شود، یک PictureFrame بر اساس عرض و ارتفاع تصویر ایجاد کنید.
  6. قاب تصویر (شامل تصویر) را به اسلاید اضافه کنید.
  7. رنگ خط قاب تصویر را تنظیم کنید.
  8. عرض خط قاب تصویر را تنظیم کنید.
  9. قاب تصویر را با مقدار مثبت یا منفی چرخش دهید.
    • مقدار مثبت تصویر را به صورت ساعتگرد می‌چرخاند.
    • مقدار منفی تصویر را به صورت پادساعتگرد می‌چرخاند.
  10. قاب تصویر (شامل تصویر) را به اسلاید اضافه کنید.
  11. ارائه‌ی تغییر یافته را به صورت فایل PPTX ذخیره کنید.
// مسیر پوشه اسناد.
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);

افزودن تصویر به‌عنوان لینک

برای جلوگیری از بزرگ شدن اندازه ارائه، می‌توانید به جای تعبیه مستقیم فایل‌ها، تصاویر (یا ویدئوها) را از طریق لینک‌ها اضافه کنید. این کد C++ نشان می‌دهد چگونه یک تصویر و ویدئو را به یک placeholder اضافه کنید:

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));

// افزودن یک PictureFrame به اسلاید
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() استفاده کنید. این متد تصویر برش‌خورده یا تصویر اصلی را در صورتی که نیاز به برش نباشد برمی‌گرداند.

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::CompressImage() یک تصویر را در یک ارائه فشرده کنید. این متد تصویر را با کاهش اندازه بر اساس اندازه شکل و وضوح مشخص‌شده فشرده می‌کند و امکان حذف نواحی برش‌خورده را فراهم می‌سازد.

این کار اندازه و وضوح تصویر را مشابه ویژگی Picture Format -> Compress Pictures -> Resolution در PowerPoint تنظیم می‌کند.

مثال‌های C++ زیر نشان می‌دهند چگونه می‌توان با تعیین یک وضوح هدف و به‌صورت اختیاری حذف نواحی برش‌خورده، یک تصویر را در ارائه فشرده کرد:

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

// تصویر را با وضوح هدف 150 DPI (وضوح وب) فشرده کنید و نواحی برش‌خورده را حذف کنید.
bool result = pictureFrame->get_PictureFormat()->CompressImage(true, PicturesCompression::Dpi150);

// بررسی نتیجه فشرده‌سازی.
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();

یا به‌صورت مستقیم با مقدار DPI سفارشی:

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

// تصویر را به 150 DPI (وضوح وب) فشرده کنید و نواحی برش‌خورده را حذف کنید.
pictureFrame->get_PictureFormat()->CompressImage(true, 150.0f);

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

قفل نسبت ابعاد

اگر می‌خواهید شکلی که حاوی تصویر است حتی پس از تغییر ابعاد تصویر، نسبت ابعاد خود را حفظ کند، می‌توانید از متد set_AspectRatioLocked() برای تنظیم گزینه Lock Aspect Ratio استفاده کنید.

این کد 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، می‌توانید یک مستطیل پرکننده تعیین کنید.

هنگامی که کشش تصویر مشخص شود، یک مستطیل منبع به‌صورت مقیاس‌دار برای پر کردن مستطیل پرکننده تعیین‌شده تنظیم می‌شود. هر لبه از مستطیل پرکننده با یک افست درصدی نسبت به لبه‌ متقابل جعبه مرزی شکل تعریف می‌شود. یک درصد مثبت نشان‌دهندهٔ درونی شدن (inset) است؛ یک درصد منفی نشان‌دهندهٔ بیرون‌زدگی (outset).

  1. یک نمونه از Presentation ایجاد کنید.
  2. از طریق ایندکس، مرجع یک اسلاید را دریافت کنید.
  3. یک مستطیل AutoShape اضافه کنید.
  4. یک تصویر ایجاد کنید.
  5. نوع پر کردن شکل را تنظیم کنید.
  6. حالت پر کردن تصویر شکل را تنظیم کنید.
  7. یک تصویر تنظیم‌شده برای پر کردن شکل اضافه کنید.
  8. افست‌های تصویر را نسبت به لبه‌های متناظر جعبه مرزی شکل مشخص کنید.
  9. ارائه‌ی تغییر یافته را به صورت فایل 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);

FAQ

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

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

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

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

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

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

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

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