C# Bitmap画图问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# Bitmap画图问题相关的知识,希望对你有一定的参考价值。
我先在Bitmap上画上一个底层图形,然后单击不同的按钮再画上不同的图形,但是每次只显示底层图形和对应按钮设置的图形,这个要怎么实现,或者怎么实现这样的功能,如图
参考技术A 你的需求是 :"一个背景,多个不同遮盖图层,单击不同按钮的时候显示不同的遮盖层 +背景“?这种需要透明、遮罩的效果最好使用WPF来做,非常简单。而winform对透明支持的很差。
WPF中思路非常简单(但是可能需要你看一点WPF的基础)。
<Grid Name = "Container" >
<Image Name = "MyBackground" /> <!--这个是背景-->
</Grid>
然后再创建多个你要的遮盖层 ,可以直接创建成用户控件, 比如
<UserControl Name="MyLayer1>
<Grid>
<Image Name = "Len1" > <!--1号图层-->
</Grid>
</UserControl>
需要遮罩的时候, 把MyLayer1这个控件直接“加”到Container里面,
MyLen1就会在MyBackground上方出现,类似PS里的图层叠加。
Background是背景层,就是你上面的黑色的雷达图,Len1是遮罩图片,就是你上面发的白色的线条图片,但是Len1图片必须是透明的png格式。
最后效果就可以实现你要的这样追问
嗯,谢了。
但是现在我是用winform来做,不知道有没有什么方法来实现这样的功能。有想过每次new一个Bitmap来实现不同的遮罩层,但是这样不知道效果怎么样,内存会很吃力...
c# only Second Bitmap.Save 产生 GDI+ 异常中发生一般错误
【中文标题】c# only Second Bitmap.Save 产生 GDI+ 异常中发生一般错误【英文标题】:c# only Second Bitmap.Save produce A generic error occurred in GDI+ exception 【发布时间】:2017-05-04 09:17:58 【问题描述】:我正在使用以下代码在两个图像之间进行比较并保存结果。 在第一次运行中,我成功创建并保存了结果图像, 但在第二次运行中,我得到以下异常:
An exception of type 'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dll but was not handled in user code
Additional information: A generic error occurred in GDI+.
代码:
MagickImage magickBaseImg = new MagickImage(new Bitmap(baseImageFileName));
MagickImage magickTargetImg = new MagickImage(new Bitmap(targetImageFileName));
var diffImg = new MagickImage();
magickBaseImg.Compare(magickTargetImg, ErrorMetric.RootMeanSquared, diffImg, Channels.Red);
Bitmap ImgToSave = diffImg.ToBitmap();
DateTime currentTime = DateTime.Now;
String differencesImageSavingPath = @"C:\test\DiffImage" + currentTime.ToString("ddMMyyyyHHmm") + ".bmp";
**ImgToSave.Save(differencesImageSavingPath, System.Drawing.Imaging.ImageFormat.Bmp);**
differencesImageFileName = differencesImageSavingPath;
DiffrenceImage.Source = new BitmapImage(new Uri(differencesImageFileName));
带有**标记的行是在第二次运行时抛出异常的行。 已经阅读并尝试使用“使用”和 .dispose 修复它,如下所示: A Generic error occurred in GDI+ in Bitmap.Save method 和这里: A generic error occurred in GDI+, JPEG Image to MemoryStream
但它不起作用。
例如,以下代码也不起作用:
MagickImage magickBaseImg = new MagickImage(new Bitmap(baseImageFileName));
MagickImage magickTargetImg = new MagickImage(new Bitmap(targetImageFileName));
var diffImg = new MagickImage();
magickBaseImg.Compare(magickTargetImg, ErrorMetric.RootMeanSquared, diffImg, Channels.Red);
Bitmap ImgToSave = diffImg.ToBitmap();
DateTime currentTime = DateTime.Now;
String differencesImageSavingPath = @"C:\test\DiffImage" + currentTime.ToString("ddMMyyyyHHmm") + ".bmp";
using (var tempImg = new Bitmap(ImgToSave))
tempImg.Save(differencesImageSavingPath, System.Drawing.Imaging.ImageFormat.Bmp);
differencesImageFileName = differencesImageSavingPath;
DiffrenceImage.Source = new BitmapImage(new Uri(differencesImageFileName));
【问题讨论】:
确定图片没有在其他地方打开? tempImg 无法打开 - 我创建了一个新实例并在“使用”语句中调用它 这仍然不妨碍您在其他地方使用它 你读过它,但它仍然是同样的原因。使用 using 和 Dispose 确实没有帮助。 - 见here 您多久调用一次该方法?当您将图像保存为带有分钟的文件名并将其分配给 DifferenceImage.Source 时,它可能已打开并因此受到写保护。如果您在不同的分钟内调用该方法,则可能不会发生错误。 【参考方案1】:我不确定为什么保存位图会失败,但不需要将其设为位图。Magick.NET 库支持读取和写入 BMP 图像。以下是如何更改代码的示例:
using (MagickImage magickBaseImg = new MagickImage(baseImageFileName))
using (MagickImage magickTargetImg = new MagickImage(targetImageFileName))
using (var diffImg = new MagickImage())
magickBaseImg.Compare(magickTargetImg, ErrorMetric.RootMeanSquared, diffImg, Channels.Red);
DateTime currentTime = DateTime.Now;
string differencesImageSavingPath = @"C:\test\DiffImage" + currentTime.ToString("ddMMyyyyHHmm") + ".bmp";
diffImg.Save(differencesImageSavingPath);
differencesImageFileName = differencesImageSavingPath;
DiffrenceImage.Source = new BitmapImage(new Uri(differencesImageFileName));
【讨论】:
以上是关于C# Bitmap画图问题的主要内容,如果未能解决你的问题,请参考以下文章
C++中(HBITMAP)bitmap.m_hObject如何写成C#
从 VB 转换为 C#:bitmap.save() 参数错误