从 png 文件添加剪贴画
Posted
技术标签:
【中文标题】从 png 文件添加剪贴画【英文标题】:adding a clipart from png file 【发布时间】:2012-12-15 08:36:10 【问题描述】:我在将剪贴画(来自 png 文件)添加到 bmp 对象时遇到问题。我在 jpeg 图像中添加了一些剪贴画,保存后,我得到一个谜团:一些剪贴画存在于保存的图像中,但有些没有。
这是我如何将剪贴画添加到图像的代码:
using (System.Drawing.Graphics gfx = System.Drawing.Graphics.FromImage(this._image))
gfx.CompositingMode = CompositingMode.SourceOver;
gfx.CompositingQuality = CompositingQuality.HighQuality;
gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
gfx.DrawImage(image, posX, posY, newWidth, newHeight);
gfx.Save();
谁能解释我做错了什么或为什么会出现这种情况?
编辑: 当我在 ASP.NET 应用程序中使用此代码时会发生这种情况,当我在 Windows 应用程序中使用它时一切都很好
【问题讨论】:
您添加了仅当您在 ASP.NET 应用程序中使用代码时才会出现此问题的信息。请详细说明您如何加载主图像、剪贴画图像以及如何保存最终图像。 【参考方案1】:我不确定这是否是您的问题的原因,但gfx.Save()
行不会将您绘制的图像保存回图像,但会保存Graphics
对象的状态。为了将更改保存回图像,请确保调用Image.Save()
方法并仔细检查以确保您没有在代码中的某处恢复以前的图像。更多关于Graphics.Save
方法的信息可以在这里找到:http://msdn.microsoft.com/en-us/library/system.drawing.graphics.save(v=vs.100).aspx。
更新
您在 cmets 中写道,这是一个透明度问题。如果这是原因,请查看从文件加载剪贴画图像的代码。这也可能是由图像文件中使用的各种像素格式引起的。将您的图像加载算法更改为类似这样可能会解决问题:
加载你的背景图片,假设它是这样完成的:Image backgroundImg = new Bitmap(backgroundImgPath);
创建一个新的空图像作为所有图像的基础:this._image = new Bimap(backgroundImg.Width, backgroundImg.Height, PixelFormat.Format32bppArgb);
用gfx.CompositingMode = CompositingMode.SourceCopy;
将backgroundImg
的内容绘制到this._image
上
然后,您可以像现在一样绘制剪贴画(只需注释掉 gfx.Save();
方法)
如果这有帮助,请告诉我。
【讨论】:
据我了解,在保存状态后,我的所有剪贴画都必须出现在图像中,但在我的情况下出现问题 我认为不需要保存Graphics
对象,因为它在此之后立即被释放。问题在于代码的不同部分,即应用新剪贴画的代码。
我对此进行了深入研究,并注意到图像中存在剪贴画,但不透明度非常高(它们太透明)。这让我更加困惑......它们如何变得透明?还是要深挖
可能是像素格式问题。看看我更新的答案。以上是关于从 png 文件添加剪贴画的主要内容,如果未能解决你的问题,请参考以下文章