도형에 3D 효과와 그림자 적용 방법
Aspose.Slides FOSS는 모든 도형에 두 개의 독립적인 효과 시스템을 제공합니다:
shape.effect_format(): 2D 시각 효과: 외부 그림자, 글로우, 블러, 부드러운 가장자리shape.three_d_format(): 3D 외관: 베벨, 카메라 퍼스펙티브, 라이트 릭, 재질, 깊이
두 시스템을 동일한 형태에 결합할 수 있습니다.
전제 조건
git clone https://github.com/aspose-slides-foss/Aspose.Slides-FOSS-for-Cpp.git
cd Aspose.Slides-FOSS-for-Cpp && mkdir build && cd build
cmake . && cmake --build .외부 그림자 추가
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::RECTANGLE, 100, 100, 300, 120);
shape.text_frame()->set_text("Shadowed Shape");
auto& ef = shape.effect_format();
ef.enable_outer_shadow_effect();
auto* shadow = ef.outer_shadow_effect();
shadow->set_blur_radius(10); // softness in points
shadow->set_direction(315); // 315 deg = upper-left
shadow->set_distance(8); // offset in points
shadow->shadow_color().set_color(
asf::Color::from_argb(128, 0, 0, 0));
prs.save("shadow.pptx", asf::SaveFormat::PPTX);
return 0;
}공통 direction 값: 0=오른쪽, 45=오른쪽 아래, 90=아래, 180=왼쪽, 270=위, 315=왼쪽 위.
글로우 효과 추가
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::ELLIPSE, 150, 100, 250, 250);
auto& ef = shape.effect_format();
ef.enable_glow_effect();
auto* glow = ef.glow_effect();
glow->set_radius(20);
glow->color().set_color(asf::Color::gold);
prs.save("glow.pptx", asf::SaveFormat::PPTX);
return 0;
}가우시안 블러 적용
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::RECTANGLE, 100, 100, 350, 180);
shape.effect_format().set_blur_effect(10, true);
prs.save("blur.pptx", asf::SaveFormat::PPTX);
return 0;
}grow=true은 흐림 영역을 도형 경계 밖으로 확장합니다; grow=false은 흐림을 도형 내부에서 클립합니다.
3D 베벨 적용
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::RECTANGLE, 150, 150, 280, 120);
shape.text_frame()->set_text("3D Button");
auto& tdf = shape.three_d_format();
tdf.bevel_top().set_bevel_type(asf::BevelPresetType::CIRCLE);
tdf.bevel_top().set_width(12);
tdf.bevel_top().set_height(6);
prs.save("bevel.pptx", asf::SaveFormat::PPTX);
return 0;
}BevelPresetType 값: CIRCLE, RELAXED_INSET, COOL_SLANT, DIVOT, RIBLET, HARD_EDGE, SLOPE, CONVEX
카메라와 라이트 릭을 사용한 3D 베벨
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::RECTANGLE, 150, 150, 280, 120);
shape.text_frame()->set_text("Metal Button");
auto& tdf = shape.three_d_format();
tdf.bevel_top().set_bevel_type(asf::BevelPresetType::CIRCLE);
tdf.bevel_top().set_width(10);
tdf.bevel_top().set_height(5);
tdf.camera().set_camera_type(asf::CameraPresetType::PERSPECTIVE_ABOVE);
tdf.light_rig().set_light_type(asf::LightRigPresetType::BALANCED);
tdf.light_rig().set_direction(asf::LightingDirection::TOP);
tdf.set_material(asf::MaterialPresetType::METAL);
tdf.set_depth(20);
prs.save("3d-metal.pptx", asf::SaveFormat::PPTX);
return 0;
}그림자와 3D 베벨 결합
두 효과 시스템을 동시에 동일한 도형에 활성화할 수 있습니다:
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::ROUND_CORNER_RECTANGLE, 150, 150, 320, 130);
shape.text_frame()->set_text("Premium Card");
// Solid fill
shape.fill_format().set_fill_type(asf::FillType::SOLID);
shape.fill_format().solid_fill_color().set_color(
asf::Color::from_argb(255, 30, 80, 180));
// 3D bevel
auto& tdf = shape.three_d_format();
tdf.bevel_top().set_bevel_type(asf::BevelPresetType::CIRCLE);
tdf.bevel_top().set_width(8);
tdf.camera().set_camera_type(asf::CameraPresetType::PERSPECTIVE_ABOVE);
tdf.set_material(asf::MaterialPresetType::PLASTIC);
// Drop shadow
auto& ef = shape.effect_format();
ef.enable_outer_shadow_effect();
auto* shadow2 = ef.outer_shadow_effect();
shadow2->set_blur_radius(12);
shadow2->set_direction(270);
shadow2->set_distance(6);
shadow2->shadow_color().set_color(
asf::Color::from_argb(80, 0, 0, 0));
prs.save("premium-card.pptx", asf::SaveFormat::PPTX);
return 0;
}효과 확인 및 제거
#include <Aspose/Slides/Foss/presentation.h>
#include <iostream>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::RECTANGLE, 100, 100, 200, 100);
auto& ef = shape.effect_format();
ef.enable_outer_shadow_effect();
ef.enable_glow_effect();
std::cout << "Has effects: " << !ef.is_no_effects() << "\n"; // 1
ef.disable_outer_shadow_effect();
ef.disable_glow_effect();
std::cout << "Has effects: " << !ef.is_no_effects() << "\n"; // 0
return 0;
}