เพิ่มประสิทธิภาพการประมวลผลภาพด้วย 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 สาธารณะ:

โปรดทราบว่า 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

เช่นเดียวกัน API ที่เกี่ยวข้องกับการพิมพ์ผ่าน PrinterSettings ไม่มีการแทนที่โดย Modern API โดยตรง:

IPresentation:

FAQ

ทำไมถึงตัดการสนับสนุน Graphics ลง?

การสนับสนุน Graphics ถูกเลิกใช้ใน API สาธารณะเพื่อทำให้การทำงานกับการเรนเดอร์และภาพเป็นแบบเดียวกัน ลดการพึ่งพาแพลตฟอร์มเฉพาะ และเปลี่ยนไปใช้แนวทางข้ามแพลตฟอร์มด้วย IImage แทน ให้ใช้ GetImage หรือ GetImages แทนการเรนเดอร์ไปยัง Graphics

IImage มีประโยชน์เชิงปฏิบัติอย่างไรเมื่อเทียบกับ Image/Bitmap?

IImage ทำให้การทำงานกับภาพ raster และ vector เป็นหนึ่งเดียว, ทำให้การบันทึกเป็นหลายรูปแบบผ่าน ImageFormat ง่ายขึ้น, ลดการพึ่งพา System.Drawing, และทำให้โค้ดพกพาได้ดีขึ้นในสภาพแวดล้อมต่าง ๆ

Modern API จะส่งผลต่อประสิทธิภาพการสร้าง thumbnail หรือไม่?

การเปลี่ยนจาก GetThumbnail ไปเป็น GetImage ไม่ทำให้สถานการณ์แย่ลง: เมธอดใหม่ให้ความสามารถเช่นเดียวกันสำหรับการสร้างภาพพร้อมตัวเลือกและขนาดต่าง ๆ พร้อมยังคงรองรับตัวเลือกการเรนเดอร์ ผลลัพธ์ที่เร็วหรือช้าจะขึ้นอยู่กับกรณีใช้ แต่โดยหลักการการแทนที่เป็นเทียบเท่ากัน