เพิ่มประสิทธิภาพการประมวลผลภาพด้วย Modern API
บทนำ
โดยประวัติแล้ว Aspose Slides มีการพึ่งพา System.Drawing และใน API สาธารณะมีคลาสต่อไปนี้จาก System.Drawing:
ตั้งแต่เวอร์ชัน 24.4 API สาธารณะนี้ถูกประกาศว่าเลิกใช้แล้ว
เนื่องจากการสนับสนุน System.Drawing ใน .NET 6 ขึ้นไปถูกลบสำหรับระบบที่ไม่ใช่ Windows (breaking change) Slides จึงได้นำแนวทางแบบสองแพ็กเกจมาใช้:
- Aspose.Slides.NET – รองรับ .NET 6+ สำหรับ Windows, .NETStandard สำหรับ Windows/Linux/macOS, .NETFramework 2+ (Windows) โดยมีการพึ่งพา System.Drawing.Common
- Aspose.Slides.NET6.CrossPlatform – เวอร์ชัน Windows/Linux/macOS ที่ไม่มีการพึ่งพาใด ๆ
ความไม่สะดวกของ Aspose.Slides.NET6.CrossPlatform คือมันได้ทำการจำลอง System.Drawing ของตัวเองใน namespace เดียวกัน (เพื่อสนับสนุนความเข้ากันได้ย้อนหลังกับ API สาธารณะ) ดังนั้นเมื่อใช้ Aspose.Slides.NET6.CrossPlatform ร่วมกับ System.Drawing จาก .NET Framework หรือแพ็กเกจ System.Drawing.Common พร้อมกัน จะเกิดการชนกันของชื่อเว้นแต่จะใช้ alias
เพื่อกำจัดการพึ่งพา System.Drawing ในแพ็กเกจหลัก Aspose.Slides.NET เราได้เพิ่ม “Modern API” – คือ API ที่ควรใช้แทน API ที่เลิกใช้ ซึ่งลายเซ็นของมันมีการพึ่งพา type ต่อไปนี้จาก System.Drawing: Image และ Bitmap ส่วน PrinterSettings และ Graphics ถูกประกาศว่าเลิกใช้และการสนับสนุนถูกลบออกจาก API สาธารณะของ Slides
ในเวอร์ชันปัจจุบัน ให้ถือว่า API สาธารณะที่พึ่งพา System.Drawing เป็นแบบ legacy/เลิกใช้ ใช้ Modern API สำหรับโค้ดใหม่และเมื่อย้าย workflow การประมวลผลภาพที่มีอยู่
Modern API
เพิ่มคลาสและ enum ต่อไปนี้เข้าสู่ API สาธารณะ:
- Aspose.Slides.IImage – แสดงถึงภาพแบบ raster หรือ vector
- Aspose.Slides.ImageFormat – แสดงรูปแบบไฟล์ของภาพ
- Aspose.Slides.Images – วิธีการสร้างและทำงานกับอินเตอร์เฟส IImage
โปรดทราบว่า IImage สามารถทำการกำจัด (dispose) ได้ (มัน implements อินเตอร์เฟส IDisposable และควรใช้ภายใน using หรือทำการกำจัดด้วยวิธีอื่นที่เหมาะสม)
ใช้ GetImage เพื่อเรนเดอร์สไลด์หรือรูปทรงเดียว ใช้ GetImages เพื่อเรนเดอร์หลายสไลด์ของงานนำเสนอ ใช้เมธอดของ Images เพื่อโหลดภาพ, AddImage พร้อมกับ IImage เพื่อเพิ่มภาพลงในงานนำเสนอ, และ ReplaceImage พร้อมกับ IImage เพื่ออัปเดตภาพที่มีอยู่ในงานนำเสนอ
ตัวอย่างสถานการณ์การใช้ API ใหม่อาจมีลักษณะดังนี้:
using (Presentation pres = new Presentation())
{
IPPImage ppImage;
// สร้างอินสแตนซ์ที่กำจัดได้ของ IImage จากไฟล์บนดิสก์.
using (IImage image = Images.FromFile("image.png"))
{
// สร้างภาพ PowerPoint โดยเพิ่มอินสแตนซ์ของ IImage ไปยังคอลเลกชันภาพของการนำเสนอ.
ppImage = pres.Images.AddImage(image);
}
// เพิ่มรูปร่างรูปภาพบนสไลด์ #1
pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);
// รับอินสแตนซ์ของ IImage ที่แสดงสไลด์ #1.
using (var slideImage = pres.Slides[0].GetImage(new Size(1920, 1080)))
{
// บันทึกภาพลงบนดิสก์.
slideImage.Save("slide1.jpeg", ImageFormat.Jpeg);
}
}
การแทนที่โค้ดเก่าด้วย Modern API
เพื่ออำนวยความสะดวกในการเปลี่ยนแปลง อินเทอร์เฟสของ IImage จะทำซ้ำลายเซ็นแยกของคลาส Image และ Bitmap โดยทั่วไป คุณเพียงแค่ต้องแทนที่การเรียกเมธอดเก่าที่ใช้ System.Drawing ด้วยเมธอดใหม่
การสร้าง Thumbnail ของสไลด์
API Legacy/เลิกใช้:
using (Presentation pres = new Presentation("pres.pptx"))
{
pres.Slides[0].GetThumbnail().Save("slide1.png");
}
Modern API:
using (Presentation pres = new Presentation("pres.pptx"))
{
pres.Slides[0].GetImage().Save("slide1.png");
}
การสร้าง Thumbnail ของรูปทรง
API Legacy/เลิกใช้:
using (Presentation pres = new Presentation("pres.pptx"))
{
pres.Slides[0].Shapes[0].GetThumbnail().Save("shape.png");
}
Modern API:
using (Presentation pres = new Presentation("pres.pptx"))
{
pres.Slides[0].Shapes[0].GetImage().Save("shape.png");
}
การสร้าง Thumbnail ของงานนำเสนอ
API Legacy/เลิกใช้:
using (Presentation pres = new Presentation("pres.pptx"))
{
var bitmaps = pres.GetThumbnails(new RenderingOptions(), new Size(1980, 1028));
try
{
for (var index = 0; index < bitmaps.Length; index++)
{
Bitmap thumbnail = bitmaps[index];
thumbnail.Save($"slide{index}.png", ImageFormat.Png);
}
}
finally
{
foreach (Bitmap bitmap in bitmaps)
{
bitmap.Dispose();
}
}
}
Modern API:
using (Presentation pres = new Presentation("pres.pptx"))
{
var images = pres.GetImages(new RenderingOptions(), new Size(1980, 1028));
try
{
for (var index = 0; index < images.Length; index++)
{
IImage thumbnail = images[index];
thumbnail.Save($"slide{index}.png", ImageFormat.Png);
}
}
finally
{
foreach (IImage image in images)
{
image.Dispose();
}
}
}
การเพิ่มรูปภาพลงในงานนำเสนอ
API Legacy/เลิกใช้:
using (Presentation pres = new Presentation())
{
IPPImage ppImage;
using (Image image = Image.FromFile("image.png"))
{
ppImage = pres.Images.AddImage(image);
}
pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);
}
Modern API:
using (Presentation pres = new Presentation())
{
IPPImage ppImage;
using (IImage image = Aspose.Slides.Images.FromFile("image.png"))
{
ppImage = pres.Images.AddImage(image);
}
pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);
}
เมธอด/คุณสมบัติที่เลิกใช้และการแทนที่ใน Modern API
Presentation
| ลายเซ็นเมธอด | ลายเซ็นเมธอดทดแทน |
|---|---|
| public Bitmap[] GetThumbnails(IRenderingOptions options) | GetImages(IRenderingOptions options) |
| public Bitmap[] GetThumbnails(IRenderingOptions options, int[] slides) | GetImages(IRenderingOptions options, int[] slides) |
| public Bitmap[] GetThumbnails(IRenderingOptions options, float scaleX, float scaleY) | GetImages(IRenderingOptions options, float scaleX, float scaleY) |
| public Bitmap[] GetThumbnails(IRenderingOptions options, int[] slides, float scaleX, float scaleY) | GetImages(IRenderingOptions options, int[] slides, float scaleX, float scaleY) |
| public Bitmap[] GetThumbnails(IRenderingOptions options, Size imageSize) | GetImages(IRenderingOptions options, Size imageSize) |
| public Bitmap[] GetThumbnails(IRenderingOptions options, int[] slides, Size imageSize) | GetImages(IRenderingOptions options, int[] slides, Size imageSize) |
| public void Save(string fname, SaveFormat format, HttpResponse response, bool showInline) | No Modern API replacement |
| public void Save(string fname, SaveFormat format, ISaveOptions options, HttpResponse response, bool showInline) | No Modern API replacement |
| public void Print() | No Modern API replacement |
| public void Print(PrinterSettings printerSettings) | No Modern API replacement |
| public void Print(string printerName) | No Modern API replacement |
| public void Print(PrinterSettings printerSettings, string presName) | No Modern API replacement |
Shape
| ลายเซ็นเมธอด | ลายเซ็นเมธอดทดแทน |
|---|---|
| public Bitmap GetThumbnail() | GetImage |
| public Bitmap GetThumbnail(ShapeThumbnailBounds bounds, float scaleX, float scaleY) | GetImage(ShapeThumbnailBounds bounds, float scaleX, float scaleY) |
Slide
| ลายเซ็นเมธอด | ลายเซ็นเมธอดทดแทน |
|---|---|
| public Bitmap GetThumbnail(float scaleX, float scaleY) | GetImage(float scaleX, float scaleY) |
| public Bitmap GetThumbnail() | GetImage |
| public Bitmap GetThumbnail(IRenderingOptions options) | GetImage(IRenderingOptions options) |
| public Bitmap GetThumbnail(Size imageSize) | GetImage(Size imageSize) |
| public Bitmap GetThumbnail(ITiffOptions options) | GetImage(ITiffOptions options) |
| public Bitmap GetThumbnail(IRenderingOptions options, float scaleX, float scaleY) | GetImage(IRenderingOptions options, float scaleX, float scaleY) |
| public Bitmap GetThumbnail(IRenderingOptions options, Size imageSize) | GetImage(IRenderingOptions options, Size imageSize) |
| public void RenderToGraphics(IRenderingOptions options, Graphics graphics) | No Modern API replacement |
| public void RenderToGraphics(IRenderingOptions options, Graphics graphics, float scaleX, float scaleY) | No Modern API replacement |
| public void RenderToGraphics(IRenderingOptions options, Graphics graphics, Size renderingSize) | No Modern API replacement |
Output
| ลายเซ็นเมธอด | ลายเซ็นเมธอดทดแทน |
|---|---|
| public IOutputFile Add(string path, Image image) | Add(string path, IImage image) |
ImageCollection
| ลายเซ็นเมธอด | ลายเซ็นเมธอดทดแทน |
|---|---|
| IPPImage AddImage(Image image) | AddImage(IImage image) |
ImageWrapperFactory
| ลายเซ็นเมธอด | ลายเซ็นเมธอดทดแทน |
|---|---|
| IImageWrapper CreateImageWrapper(Image image) | CreateImageWrapper(IImage image) |
PPImage
| ลายเซ็นเมธอด/คุณสมบัติ | ลายเซ็นเมธอดทดแทน |
|---|---|
| void ReplaceImage(Image newImage) | ReplaceImage(IImage newImage) |
| Image SystemImage { get; } | IImage Image { get; } |
PatternFormat
| ลายเซ็นเมธอด | ลายเซ็นเมธอดทดแทน |
|---|---|
| Bitmap GetTileImage(Color background, Color foreground) | GetTile(Color background, Color foreground) |
| Bitmap GetTileImage(Color styleColor) | GetTile(Color styleColor) |
IPatternFormatEffectiveData
| ลายเซ็นเมธอด | ลายเซ็นเมธอดทดแทน |
|---|---|
| Bitmap GetTileImage(Color background, Color foreground) | GetTileIImage(SlidesImage image) |
การสนับสนุน API สำหรับ Graphics และ PrinterSettings
คลาส Graphics ไม่ได้รับการสนับสนุนสำหรับเวอร์ชันข้ามแพลตฟอร์มของ .NET 6 ขึ้นไป ใน Aspose Slides ให้ใช้เมธอดการเรนเดอร์ภาพของ Modern API แทน API ที่เรนเดอร์ไปยัง Graphics: ISlide
- public void RenderToGraphics(IRenderingOptions options, Graphics graphics)
- public void RenderToGraphics(IRenderingOptions options, Graphics graphics, float scaleX, float scaleY)
- public void RenderToGraphics(IRenderingOptions options, Graphics graphics, Size renderingSize)
เช่นเดียวกัน API ที่เกี่ยวข้องกับการพิมพ์ผ่าน PrinterSettings ไม่มีการแทนที่โดย Modern API โดยตรง:
- public void Presentation.Print
- public void Print(PrinterSettings printerSettings)
- public void Print(string printerName)
- public void Print(PrinterSettings printerSettings, string presName)
FAQ
ทำไมถึงตัดการสนับสนุน Graphics ลง?
การสนับสนุน Graphics ถูกเลิกใช้ใน API สาธารณะเพื่อทำให้การทำงานกับการเรนเดอร์และภาพเป็นแบบเดียวกัน ลดการพึ่งพาแพลตฟอร์มเฉพาะ และเปลี่ยนไปใช้แนวทางข้ามแพลตฟอร์มด้วย IImage แทน ให้ใช้ GetImage หรือ GetImages แทนการเรนเดอร์ไปยัง Graphics
IImage มีประโยชน์เชิงปฏิบัติอย่างไรเมื่อเทียบกับ Image/Bitmap?
IImage ทำให้การทำงานกับภาพ raster และ vector เป็นหนึ่งเดียว, ทำให้การบันทึกเป็นหลายรูปแบบผ่าน ImageFormat ง่ายขึ้น, ลดการพึ่งพา System.Drawing, และทำให้โค้ดพกพาได้ดีขึ้นในสภาพแวดล้อมต่าง ๆ
Modern API จะส่งผลต่อประสิทธิภาพการสร้าง thumbnail หรือไม่?
การเปลี่ยนจาก GetThumbnail ไปเป็น GetImage ไม่ทำให้สถานการณ์แย่ลง: เมธอดใหม่ให้ความสามารถเช่นเดียวกันสำหรับการสร้างภาพพร้อมตัวเลือกและขนาดต่าง ๆ พร้อมยังคงรองรับตัวเลือกการเรนเดอร์ ผลลัพธ์ที่เร็วหรือช้าจะขึ้นอยู่กับกรณีใช้ แต่โดยหลักการการแทนที่เป็นเทียบเท่ากัน