从 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 文件添加剪贴画的主要内容,如果未能解决你的问题,请参考以下文章

将剪贴板中的位图保存到 wpf 应用程序中的 png

MindMaster使用技巧

开源项目将图片转换为字符画

如何在处理中加载的 png 图像上创建颜色剪贴蒙版?

如何从剪贴板中查找所有文件的名称

如何从 Bundle 中获取 PNG 文件的资源路径?