OverviewFilesCommitsIssuesDocsReleasesPeers

ifsrenderer-linux / WpfDisplay / Helper / GDIHelper.cs

44 lines · csharp ref:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime;
using System.Threading.Tasks;

using IFSEngine.Rendering;

namespace WpfDisplay.Helper;

internal class GDIHelper
{
    /// <summary>
    /// Sample code showing how to save the render output with gdi. 
    /// Currently not in use
    /// </summary>
    public static async Task SaveImageWithGDI(RendererGL renderer)
    {
        Bitmap b = null;
        Task genTask = Task.Run(async () =>
        {
            b = new Bitmap(renderer.HistogramWidth, renderer.HistogramHeight);

            var bits = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
            await renderer.CopyPixelDataToBitmap(bits.Scan0);
            b.UnlockBits(bits);

            b.RotateFlip(RotateFlipType.RotateNoneFlipY);
            //TODO: option to remove alpha channel

        });

        if (DialogHelper.ShowExportImageDialog(renderer.LoadedParams.Title, out string path))
        {
            await genTask;
            b.Save(path, ImageFormat.Png);
        }
        b.Dispose();

        GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
        GC.Collect();
    }
}