بهبود پردازش تصویر با API مدرن
مقدمه
در گذشته، Aspose Slides وابستگی به System.Drawing دارد و در API عمومی کلاسهای زیر را ارائه میدهد:
از نسخه 24.4 به بعد، این API عمومی اعلام شده است که منسوخ شده است.
از آنجا که پشتیبانی از System.Drawing در نسخههای .NET6 و بالاتر برای نسخههای غیر ویندوزی حذف شده است (تغییر شکنی)، Slides یک رویکرد دو بستهای پیادهسازی کرده است:
- Aspose.Slides.NET ‑ پشتیبانی برای .NET6+ در ویندوز، .NETStandard برای ویندوز/لینوکس/macOS، .NETFramework 2+ (ویندوز).
- دارای وابستگی به System.Drawing.Common.
- Aspose.Slides.NET6.CrossPlatform ‑ نسخه ویندوز/لینوکس/macOS بدون وابستگیها.
مشکل بسته Aspose.Slides.NET6.CrossPlatform این است که نسخهٔ خود از System.Drawing را در همان فضای نام پیادهسازی میکند (برای پشتیبانی از سازگاری با API عمومی). بنابراین، هنگامی که Aspose.Slides.NET6.CrossPlatform و System.Drawing از .NET Framework یا بسته System.Drawing.Common همزمان استفاده شوند، یک تضاد نام رخ میدهد مگر اینکه از نام مستعار استفاده شود.
برای حذف وابستگیها به System.Drawing در بستهٔ اصلی Aspose.Slides.NET، ما به اصطلاح «API مدرن» را اضافه کردیم ‑ یعنی API که باید به جای API منسوخ شده استفاده شود و امضاهای آن شامل وابستگی به انواع زیر از System.Drawing هستند: Image و Bitmap. PrinterSettings و Graphics منسوخ اعلام شده و پشتیبانی آنها از API عمومی Slides حذف شده است.
در نسخههای کنونی، API عمومی که به System.Drawing وابسته است به عنوان Legacy/Deprecated در نظر گرفته میشود. برای کد جدید و هنگام مهاجرت فرآیندهای موجود پردازش تصویر، از API مدرن استفاده کنید.
API مدرن
کلاسها و شمارندههای زیر به API عمومی اضافه شدهاند:
- Aspose.Slides.IImage ‑ نمایانگر تصویر رستری یا برداری.
- Aspose.Slides.ImageFormat ‑ نمایانگر فرمت فایل تصویر.
- Aspose.Slides.Images ‑ متدهایی برای ایجاد نمونه و کار با رابط IImage.
لطفاً توجه داشته باشید که IImage قابل حذف است (این رابط 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);
}
// یک شکل تصویر روی اسلاید شماره ۱ اضافه کنید
pres.Slides[0].Shapes.AddPictureFrame(ShapeType.Rectangle, 10, 10, 100, 100, ppImage);
// یک نمونه از IImage که اسلاید شماره ۱ را نمایندگی میکند دریافت کنید.
using (var slideImage = pres.Slides[0].GetImage(new Size(1920, 1080)))
{
// تصویر را بر روی دیسک ذخیره کنید.
slideImage.Save("slide1.jpeg", ImageFormat.Jpeg);
}
}
جایگزینی کدهای قدیمی با API مدرن
برای آسانسازی انتقال، رابط IImage امضای جداگانهٔ کلاسهای Image و Bitmap را تکرار میکند. به طور کلی فقط کافیست فراخوانی به روش قدیمی که از System.Drawing استفاده میکند را با روش جدید جایگزین کنید.
دریافت تصویر بندانگشتی اسلاید
API Legacy/Deprecated:
using (Presentation pres = new Presentation("pres.pptx"))
{
pres.Slides[0].GetThumbnail().Save("slide1.png");
}
API مدرن:
using (Presentation pres = new Presentation("pres.pptx"))
{
pres.Slides[0].GetImage().Save("slide1.png");
}
دریافت تصویر بندانگشتی شکل
API Legacy/Deprecated:
using (Presentation pres = new Presentation("pres.pptx"))
{
pres.Slides[0].Shapes[0].GetThumbnail().Save("shape.png");
}
API مدرن:
using (Presentation pres = new Presentation("pres.pptx"))
{
pres.Slides[0].Shapes[0].GetImage().Save("shape.png");
}
دریافت تصویر بندانگشتی ارائه
API Legacy/Deprecated:
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();
}
}
}
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/Deprecated:
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);
}
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);
}
متدها/ویژگیهای منسوخ و جایگزینهای آنها در 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) | هیچ جایگزینی در API مدرن وجود ندارد |
| public void Save(string fname, SaveFormat format, ISaveOptions options, HttpResponse response, bool showInline) | هیچ جایگزینی در API مدرن وجود ندارد |
| public void Print() | هیچ جایگزینی در API مدرن وجود ندارد |
| public void Print(PrinterSettings printerSettings) | هیچ جایگزینی در API مدرن وجود ندارد |
| public void Print(string printerName) | هیچ جایگزینی در API مدرن وجود ندارد |
| public void Print(PrinterSettings printerSettings, string presName) | هیچ جایگزینی در API مدرن وجود ندارد |
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) | هیچ جایگزینی در API مدرن وجود ندارد |
| public void RenderToGraphics(IRenderingOptions options, Graphics graphics, float scaleX, float scaleY) | هیچ جایگزینی در API مدرن وجود ندارد |
| public void RenderToGraphics(IRenderingOptions options, Graphics graphics, Size renderingSize) | هیچ جایگزینی در API مدرن وجود ندارد |
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 برای نسخههای Cross‑Platform .NET6 و بالاتر پشتیبانی نمیشود. در Aspose Slides، بهجای API که به Graphics رندر میکند، از متدهای رندر تصویر API مدرن استفاده کنید: 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 جایگزین مستقیم در API مدرن ندارد:
- public void Presentation.Print
- public void Print(PrinterSettings printerSettings)
- public void Print(string printerName)
- public void Print(PrinterSettings printerSettings, string presName)
سوالات متداول
چرا Graphics حذف شد؟
پشتیبانی از Graphics در API عمومی منسوخ شده است تا کار با رندر و تصاویر یکپارچه شود، وابستگی به پلتفرم خاص حذف شود و به رویکرد Cross‑Platform با IImage منتقل شود. بهجای رندر به [Graphics] از GetImage یا GetImages استفاده کنید.
فایدهٔ عملی IImage نسبت به Image/Bitmap چیست؟
IImage کار با تصاویر رستری و برداری را یکپارچه میکند، ذخیرهٔ به فرمتهای مختلف را از طریق ImageFormat ساده میسازد، وابستگی به System.Drawing را کاهش میدهد و کد را در محیطهای مختلف قابل حملتر میسازد.
آیا API مدرن بر عملکرد تولید تصویرهای بندانگشتی تأثیر میگذارد؟
تبدیل از GetThumbnail به GetImage عملکرد سناریوها را تخریبی نمیکند: روشهای جدید همان قابلیتها را برای تولید تصاویر با گزینهها و اندازهها فراهم میکنند و همچنان از گزینههای رندر پشتیبانی میکنند. سود یا کاهش خاصی بستگی به سناریو دارد، اما از نظر کارکرد جایگزینها برابرند.