Quản lý Khung Ảnh trong Bản Trình Bày Sử Dụng C++

Giới thiệu

Khung ảnh là một hình dạng chứa hình ảnh—giống như một bức tranh trong khung.

Bạn có thể thêm hình ảnh vào một slide thông qua khung ảnh. Bằng cách này, bạn sẽ định dạng hình ảnh bằng cách định dạng khung ảnh.

Tạo một Khung Ảnh

  1. Tạo một thể hiện của lớp Presentation.
  2. Lấy tham chiếu tới slide thông qua chỉ mục của nó.
  3. Tạo một đối tượng IPPImage bằng cách thêm hình ảnh vào IImagescollection liên quan tới đối tượng presentation sẽ được dùng để lấp đầy hình dạng.
  4. Xác định chiều rộng và chiều cao của hình ảnh.
  5. Tạo một PictureFrame dựa trên chiều rộng và chiều cao của hình ảnh thông qua phương thức AddPictureFrame được mở ra bởi đối tượng shape liên quan tới slide đã tham chiếu.
  6. Thêm một khung ảnh (chứa ảnh) vào slide.
  7. Ghi bản trình bày đã sửa đổi dưới dạng tệp PPTX.

Đoạn mã C++ dưới đây cho bạn thấy cách tạo một khung ảnh:

// Đường dẫn tới thư mục tài liệu.
const String outPath = u"../out/PictureFrameFormatting_out.pptx";
const String filePath = u"../templates/Tulips.jpg";

// Tải bài thuyết trình mong muốn
SharedPtr<Presentation> pres = MakeObject<Presentation>();

// Truy cập slide đầu tiên
SharedPtr<ISlide> slide = pres->get_Slide(0);

// Tải hình ảnh sẽ được thêm vào bộ sưu tập hình ảnh của bài thuyết trình
// Lấy hình ảnh
auto image = Images::FromFile(filePath);

// Thêm hình ảnh vào bộ sưu tập hình ảnh của bài thuyết trình
SharedPtr<IPPImage> imgx = pres->get_Images()->AddImage(image);

// Thêm khung ảnh vào slide
SharedPtr<IPictureFrame> pf = slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, imgx);

// Đặt tỷ lệ rộng và cao tương đối
pf->set_RelativeScaleHeight(0.8);
pf->set_RelativeScaleWidth(1.35);
// Áp dụng một số định dạng cho PictureFrame
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);

//Writes the PPTX file to disk
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);

Tạo một Khung Ảnh với Tỷ Lệ Tương Đối

Bằng cách thay đổi tỷ lệ tương đối của hình ảnh, bạn có thể tạo một khung ảnh phức tạp hơn.

  1. Tạo một thể hiện của lớp Presentation.
  2. Lấy tham chiếu tới slide thông qua chỉ mục của nó.
  3. Thêm một hình ảnh vào bộ sưu tập hình ảnh của presentation.
  4. Tạo một đối tượng IPPImage bằng cách thêm hình ảnh vào IImagescollection liên quan tới đối tượng presentation sẽ được dùng để lấp đầy hình dạng.
  5. Xác định chiều rộng và chiều cao tương đối của hình ảnh trong khung ảnh.
  6. Ghi bản trình bày đã sửa đổi dưới dạng tệp PPTX.

Đoạn mã C++ dưới đây cho bạn thấy cách tạo một khung ảnh với tỷ lệ tương đối:

// Đường dẫn tới thư mục tài liệu.
const String outPath = u"../out/AddRelativeScaleHeightPictureFrame_out.pptx";
const String filePath = u"../templates/Tulips.jpg";

// Tải bài thuyết trình mong muốn
SharedPtr<Presentation> pres = MakeObject<Presentation>();

// Truy cập slide đầu tiên
SharedPtr<ISlide> slide = pres->get_Slide(0);

// Tải hình ảnh sẽ được thêm vào bộ sưu tập hình ảnh của bài thuyết trình
// Lấy hình ảnh
auto image = Images::FromFile(filePath);

// Thêm một hình ảnh vào bộ sưu tập hình ảnh của bài thuyết trình
SharedPtr<IPPImage> imgx = pres->get_Images()->AddImage(image);

// Thêm một khung ảnh vào slide
SharedPtr<IPictureFrame> pf = slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, imgx);

// Đặt tỷ lệ rộng và cao tương đối
pf->set_RelativeScaleHeight (0.8);
pf->set_RelativeScaleWidth(1.35);

//Ghi tệp PPTX vào đĩa
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);

Trích Xuất Hình Ảnh Raster từ Khung Ảnh

Bạn có thể trích xuất các hình ảnh raster từ các đối tượng PictureFrame và lưu chúng dưới dạng PNG, JPG và các định dạng khác. Ví dụ mã dưới đây minh họa cách trích xuất một hình ảnh từ tài liệu “sample.pptx” và lưu nó ở định dạng 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();

Trích Xuất Hình Ảnh SVG từ Khung Ảnh

Khi một bản trình bày chứa đồ họa SVG được đặt bên trong các hình dạng PictureFrame, Aspose.Slides cho C++ cho phép bạn lấy lại các hình ảnh vector gốc với độ trung thực hoàn toàn. Bằng cách duyệt qua bộ sưu tập hình dạng của slide, bạn có thể xác định mỗi PictureFrame, kiểm tra xem IPPImage bên dưới có chứa nội dung SVG hay không, và sau đó lưu hình ảnh đó vào đĩa hoặc luồng ở định dạng SVG gốc.

Đoạn mã dưới đây minh họa cách trích xuất một hình ảnh SVG từ một khung ảnh:

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

Lấy Độ Trong Suất của Hình Ảnh

Aspose.Slides cho phép bạn lấy hiệu ứng trong suốt áp dụng cho một hình ảnh. Đoạn mã C++ này trình bày thao tá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);
    }
}

Lấy Độ Sáng và Độ Tương Phản của Hình Ảnh

Aspose.Slides cho phép bạn lấy hiệu ứng độ sáng và độ tương phản áp dụng cho một hình ảnh. Giao diện ILuminance đại diện cho hiệu ứng biến đổi hình ảnh này.

Đoạn mã C++ này cho thấy cách lấy cài đặt độ sáng và độ tương phản từ một khung ảnh:

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

Định Dạng Khung Ảnh

Aspose.Slides cung cấp nhiều tùy chọn định dạng có thể áp dụng cho một khung ảnh. Sử dụng các tùy chọn này, bạn có thể thay đổi khung ảnh sao cho phù hợp với yêu cầu cụ thể.

  1. Tạo một thể hiện của lớp Presentation.
  2. Lấy tham chiếu tới slide thông qua chỉ mục của nó.
  3. Tạo một đối tượng IPPImage bằng cách thêm hình ảnh vào IImagescollection liên quan tới đối tượng presentation sẽ được dùng để lấp đầy hình dạng.
  4. Xác định chiều rộng và chiều cao của hình ảnh.
  5. Tạo một PictureFrame dựa trên chiều rộng và chiều cao của hình ảnh thông qua phương thức AddPictureFrame được mở ra bởi đối tượng IShapes liên quan tới slide đã tham chiếu.
  6. Thêm khung ảnh (chứa hình ảnh) vào slide.
  7. Đặt màu đường viền cho khung ảnh.
  8. Đặt độ dày đường viền cho khung ảnh.
  9. Xoay khung ảnh bằng cách cung cấp giá trị dương hoặc âm.
    • Giá trị dương xoay ảnh theo chiều kim đồng hồ.
    • Giá trị âm xoay ảnh ngược chiều kim đồng hồ.
  10. Thêm khung ảnh (chứa hình ảnh) vào slide.
  11. Ghi bản trình bày đã sửa đổi dưới dạng tệp PPTX.

Đoạn mã C++ này minh họa quy trình định dạng khung ảnh:

// Đường dẫn tới thư mục tài liệu.
const String outPath = u"../out/AddRelativeScaleHeightPictureFrame_out.pptx";
const String filePath = u"../templates/Tulips.jpg";

// Tải bài thuyết trình mong muốn
SharedPtr<Presentation> pres = MakeObject<Presentation>();

// Truy cập slide đầu tiên
SharedPtr<ISlide> slide = pres->get_Slides()->idx_get(0);

// Tải hình ảnh sẽ được thêm vào bộ sưu tập hình ảnh của bài thuyết trình
// Lấy hình ảnh
auto image = Images::FromFile(filePath);

// Thêm một hình ảnh vào bộ sưu tập hình ảnh của bài thuyết trình
SharedPtr<IPPImage> imgx = pres->get_Images()->AddImage(image);

// Thêm một khung ảnh vào slide
SharedPtr<IPictureFrame> pf = slide->get_Shapes()->AddPictureFrame(ShapeType::Rectangle, 50, 50, 100, 100, imgx);

// Đặt tỷ lệ rộng và cao tương đối
pf->set_RelativeScaleHeight (0.8);
pf->set_RelativeScaleWidth(1.35);

//Ghi tệp PPTX vào đĩa
pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);

Thêm Hình Ảnh dưới Dạng Liên Kết

Để tránh kích thước bản trình bày quá lớn, bạn có thể thêm hình ảnh (hoặc video) qua liên kết thay vì nhúng tệp trực tiếp vào bản trình bày. Đoạn mã C++ này cho bạn thấy cách thêm hình ảnh và video vào một 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ắt Ảnh

Đoạn mã C++ này cho bạn thấy cách cắt một hình ảnh hiện có trên slide:

using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System::Drawing;
    
auto presentation = System::MakeObject<Presentation>();
// Tạo đối tượng hình ảnh mới
auto newImage = presentation->get_Images()->AddImage(Images::FromFile(imagePath));

// Thêm một PictureFrame vào Slide
auto picFrame = presentation->get_Slides()->idx_get(0)->get_Shapes()->AddPictureFrame(Aspose::Slides::ShapeType::Rectangle, 100.0f, 100.0f, 420.0f, 250.0f, newImage);

// Cắt hình ảnh (giá trị phần trăm)
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);

// Lưu kết quả
presentation->Save(outPptxFile, Aspose::Slides::Export::SaveFormat::Pptx);

Xóa Các Vùng Đã Cắt của Khung Ảnh

Nếu bạn muốn xóa các vùng đã cắt của hình ảnh nằm trong khung, bạn có thể dùng phương thức IPictureFillFormat::DeletePictureCroppedAreas(). Phương thức này trả về hình ảnh đã cắt hoặc hình ảnh gốc nếu không cần cắt.

Đoạn mã C++ dưới đây minh họa thao tá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);

Nén Hình Ảnh

Bạn có thể nén một hình ảnh trong bản trình bày bằng phương thức IPictureFillFormat::CompressImage(). Phương thức này nén hình ảnh bằng cách giảm kích thước dựa trên kích thước hình dạng và độ phân giải được chỉ định, với tùy chọn xóa các vùng đã cắt.

Nó điều chỉnh kích thước và độ phân giải của hình ảnh tương tự như tính năng Picture Format → Compress Pictures → Resolution của PowerPoint.

Các ví dụ C++ sau đây cho thấy cách nén một hình ảnh trong bản trình bày bằng cách chỉ định độ phân giải mục tiêu và tùy chọn xóa các vùng đã cắt:

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

// Compress the image with a target resolution of 150 DPI (Web resolution) and remove cropped areas.
bool result = pictureFrame->get_PictureFormat()->CompressImage(true, PicturesCompression::Dpi150);

// Check the result of the compression.
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();

Hoặc sử dụng giá trị DPI tùy chỉnh trực tiếp:

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

// Nén hình ảnh tới 150 DPI (độ phân giải web), loại bỏ các khu vực đã cắt.
pictureFrame->get_PictureFormat()->CompressImage(true, 150.0f);

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

Khóa Tỷ Lệ Khung Hình

Nếu bạn muốn một hình dạng chứa hình ảnh duy trì tỷ lệ khung hình ngay cả sau khi thay đổi kích thước ảnh, bạn có thể dùng phương thức set_AspectRatioLocked() để đặt thiết lập Lock Aspect Ratio.

Đoạn mã C++ này cho bạn thấy cách khóa tỷ lệ khung hình của một shape:

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

Sử Dụng Thuộc Tính StretchOff

Bằng cách sử dụng các thuộc tính StretchOffsetLeft, StretchOffsetTop, StretchOffsetRightStretchOffsetBottom từ giao diện IPictureFillFormat và lớp PictureFillFormat, bạn có thể chỉ định một hình chữ nhật lấp đầy.

Khi xác định việc kéo giãn hình ảnh, một hình chữ nhật nguồn sẽ được thay đổi tỷ lệ để vừa với hình chữ nhật lấp đầy đã chỉ định. Mỗi cạnh của hình chữ nhật lấp đầy được định nghĩa bằng phần trăm độ lệch so với cạnh tương ứng của hộp bao quanh shape. Phần trăm dương chỉ định sự chèn vào trong; phần trăm âm chỉ định sự mở rộng ra ngoài.

  1. Tạo một thể hiện của lớp Presentation.
  2. Lấy tham chiếu tới slide thông qua chỉ mục của nó.
  3. Thêm một hình chữ nhật AutoShape.
  4. Tạo một hình ảnh.
  5. Đặt kiểu lấp đầy cho shape.
  6. Đặt chế độ lấp đầy ảnh cho shape.
  7. Thêm hình ảnh đã đặt để lấp đầy shape.
  8. Xác định độ lệch ảnh từ cạnh tương ứng của hộp bao quanh shape.
  9. Ghi bản trình bày đã sửa đổi dưới dạng tệp PPTX.

Đoạn mã C++ này minh họa quy trình sử dụng thuộc tính 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);

// Đặt hình ảnh kéo dãn từ mỗi phía trong phần thân hình dạng
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);

Câu Hỏi Thường Gặp

Làm thế nào để tôi biết những định dạng ảnh nào được hỗ trợ cho PictureFrame?

Aspose.Slides hỗ trợ cả ảnh raster (PNG, JPEG, BMP, GIF, v.v.) và ảnh vector (ví dụ, SVG) thông qua đối tượng ảnh được gán cho một PictureFrame. Danh sách các định dạng được hỗ trợ thường phản ánh khả năng của engine chuyển đổi slide và ảnh.

Việc thêm hàng chục ảnh lớn sẽ ảnh hưởng thế nào đến kích thước và hiệu năng của PPTX?

Nhúng ảnh lớn làm tăng kích thước tệp và mức tiêu thụ bộ nhớ; liên kết ảnh giúp giữ kích thước bản trình bày nhỏ hơn nhưng yêu cầu các tệp ngoại vi phải luôn có sẵn. Aspose.Slides cung cấp khả năng thêm ảnh qua liên kết để giảm kích thước tệp.

Làm sao để khóa một đối tượng ảnh tránh việc di chuyển/đổi kích thước vô tình?

Sử dụng shape locks cho một PictureFrame (ví dụ, vô hiệu hoá việc di chuyển hoặc thay đổi kích thước). Cơ chế khóa được mô tả cho các shape trong một bài viết bảo vệ riêng và được hỗ trợ cho nhiều loại shape, bao gồm PictureFrame.

Độ trung thực của vector SVG có được giữ khi xuất bản trình bày sang PDF/hình ảnh không?

Aspose.Slides cho phép trích xuất SVG từ một PictureFrame dưới dạng vector gốc. Khi xuất sang PDF hoặc định dạng raster, kết quả có thể bị raster hóa tùy thuộc vào cài đặt xuất; thực tế rằng SVG gốc được lưu dưới dạng vector được xác nhận bằng hành vi trích xuất.