C#中绘制图片及透明图片清空问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中绘制图片及透明图片清空问题相关的知识,希望对你有一定的参考价值。
在做一个绘图的工具,因为刷新频率有点高,所以考虑用多图层的方式,将图片不变动的部分和变动部分分开,从而减少每次刷新时绘图的范围和变动率。于是使用了透明图片。现在有两个问题困扰了我很久。
第一个:图像显示。
使用PictureBox控件。在显示时使用如下代码:
Graphics g = PBox.CreateGraphics();
g.DrawImage(m_ValueLayr, 0, 0);
g.Dispose();
但是这么做的结果是界面没有任何显示。本来可以使用PBox.Image = m_valueLayer。这样的方式,但是如果是透明图,就会出错的。所以想明确知道,为什么上述代码是不能显示的。
第二个:透明图片清空算法。
对于非透明图片,要清空整个图片上的图形可以使用类似于
Graphics g = Graphics.FromImage(m_valueLayer);
g.Clear(Color.White);
但是,我现在是一张透明图,如果使用上述代码,那么由于Color.White是被设置成了透明的:
m_ValueLayer.MakeTransparent(Color.White);
所以上述方法就失效了。那么是否存在一种方法,可以清空透明图片上的图形,哪怕是部分清空也行。
重述两个问题:
第一,利用CreateGraphics方法绘图后,控件上不显示图片。
第二,透明图片清空方法?
Bitmap bmp = new Bitmap(PBox.Width, PBox.Height);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(m_ValueLayr, 0, 0);
PBox.Image=bmp;//缺少这句话就只是在内存内绘制了图片,但是没有让它显示到控件里;
g.Dispose();
第二:
你是否可以换个思路,先把原图产生在内存里作为一张底图,然后在内存中把改变的部分修改好,然后一并显示?追问
对于第二个问题,我已经放弃了……所以使用你建议的方式来处理了。只不过增加了其他的操作来减少刷新而已。
但是对于第一个问题,我还是不很了解。
如果必须使用PBox.Image = bmp这种方式,那么PBox.CreateGraphics()这个方法不是没有意义了么?我想使用这个方法的话怎么用呢?
private void Form1_Paint(object sender, PaintEventArgs e)
Graphics g = PBox.CreateGraphics();
g.DrawImage(m_ValueLayr, 0, 0);
g.Dispose();
因为是存在在内存里显示,所以需要放在From的paint里不断刷新才可以显示出来,一旦没有刷新就图片表面上看就没有了。如果你是直接用PBox.Image = bmp,那么就不用不断刷新来维护图片的显示。
第一个问题,去掉那个Dispose试试
第二个问题,和业务逻辑比较相关,建议你学习网上现成的画图程序,不是要你抄袭,但站在前人肩膀上才能看得更远
http://www.codeproject.com/Articles/22549/OpenS-CAD-a-simple-D-CAD-application
使用PBox的Paint事件
private void PBox_Paint(object sender, PaintEventArgs e)
Graphics g = e.Graphics;
g.DrawImage(m_ValueLayr, 0, 0);
g.Dispose();
C# WinForm应用程序,PictureBox控件透明效果的相关问题。
C# WinForm应用程序
PictureBox控件里面放了一个圆形的图片(图片为png格式,中间是圆形,四周透明),
将 PictureBox 的前景色和背景色均设置成了透明,如下:
BackColor = Color.Transparent;
ForeColor = Color.Transparent;
但实际情况是:希望透明的部分,只是显示为 Form 的背景颜色(所以放在Form上的时候,看起来是透明的),但是当两个这样的 PictureBox 有重叠的时候,就发现并不是想要的效果。见图片。
问题:如何实现完全的透明,即两个 PictureBox有重叠部分时,四个角(本该是透明的)不会遮挡另一个PictureBox。
说明:1 先于 2 创建和绘制。
补充:我大概明白原因所在了,将 PictureBox的背景色设置成 透明,这里的透明,是针对其父容器(即 Form )而言。也就是说,当 1 覆盖 2 时,1 的四个角是透明的,显示的还是 Form的背景色,而不是 2 的颜色,所以就产生了遮挡的效果。
那,有没有办法解决这个问题?
用GDI+确实可以实现,但有个问题我不太懂,我需要 这个图片响应鼠标点击事件,而且还要可以拖动。这个,如果直接用 GDI+ 在 FORM 上绘图,要怎么实现?
追答你看附件的效果对你有没有用?
以上是关于C#中绘制图片及透明图片清空问题的主要内容,如果未能解决你的问题,请参考以下文章