Сохранение прозрачности при использовании imageformat.memorybmp - PullRequest
1 голос
/ 24 января 2020

Я комбинирую 2 изображения, первое изображение будет холстом, а второе изображение будет наложением. Оба изображения не имеют реального файла, вместо этого они генерируются и сохраняются в потоке памяти.

Холст

 MemoryStream canvasStream = new MemoryStream();
 var canvas =  new Bitmap(canvasWidth, canvasHeight, PixelFormat.Format32bppArgb);
 canvas.Save(canvasStream, ImageFormat.Png);

Наложение

Это меньше, чем холст, и он будет находиться в середине холст. Он будет выглядеть как рамка изображения или просто с изображением с отступом 20 пикселей.

 MemoryStream overlayStream = new MemoryStream();
 var canvas =  new Bitmap(overlayWidth, overlayHeight, PixelFormat.Format32bppArgb);
 canvas.Save(overlayStream, ImageFormat.Png);

После сохранения в потоке памяти оба эти изображения по умолчанию имеют формат изображения Imageformat.MemoryBmp , а не Imageformat.PNG . Следовательно, потеря прозрачности.

Объединение холста и наложения

        Bitmap combinedImage = new Bitmap(canvas.Width, canvas.Height, PixelFormat.Format24bppRgb);

        using (Graphics graphic = Graphics.FromImage(combinedImage))
        {
            graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphic.Clear(Color.White);

            int BGCanvasXCenter = 0;
            Rectangle rectDest = new Rectangle(0, 0, canvas.Width, canvas.Height);

            if (fixSize)
            {
                // center image
                BGCanvasXCenter = (canvas.Width / 2) - (overlay.Width / 2);
                rectDest = new Rectangle(BGCanvasXCenter, 0, overlay.Width, overlay.Height);
            }

            var imageAttributes = new ImageAttributes();
            imageAttributes.SetWrapMode(WrapMode.TileFlipXY);

            graphic.DrawImage(
                overlay,
                rectDest,
                0, 0, overlay.Width, overlay.Height,
                GraphicsUnit.Pixel,
                imageAttributes
            );
        }

Есть ли способ сохранить прозрачность при использовании потока памяти? Как мне установить формат изображения в PNG?

Обратите внимание, что во время процесса не требуется сохранять фактический файл, поэтому я прибегаю к памяти.

Заранее спасибо!

...