Я комбинирую 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?
Обратите внимание, что во время процесса не требуется сохранять фактический файл, поэтому я прибегаю к памяти.
Заранее спасибо!