c# - 使用 imageformat.memorybmp 时保持透明度
问题描述
我正在组合 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 默认为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?
请注意,要求不是在此过程中保存实际文件,这就是我求助于 memorystream 的原因。
提前致谢!
解决方案
推荐阅读
- javascript - 变量未将 Promise 结果存储在节点中
- html - 如何删除标题上方和每一侧的空白空间?
- php - Laravel 8.15.0/Jetstream - 如何注册新刀片 x-jet-newblade?
- wpf - 问:从 listview 绑定的文本框更新 viewmodel 属性
- kubernetes - K8s PersistentVolume 在多个 PersistentVolumeClaims 之间共享,用于本地测试
- javascript - 根据匹配数字删除/添加类
- python - Python如何在Docker中接收SIGINT以停止服务?
- javascript - (Svelte 3)我可以将图像放在使用它们的组件附近吗?
- python - 烧瓶邮件连接重置错误:[WinError 10054]
- c# - 扩展方法 Average() C#