涂抹的肯定可以实现,可我这没现成的例子,倒有一个逆反效果以及浮雕效果的图片处理实例,希望能给楼主一点点帮助: 逆反处理: private void buttonNifan_Click(object sender, EventArgs e) { Bitmap bmp = new Bitmap(pictureBox1.Image); Color c=new Color (); int r = 0; int g = 0; int b = 0; int i = 0; int j = 0; for (i = 0; i <= pictureBox1 .Width ;i++) //逆反操作不能用于动画; for (j = 0; j <=pictureBox1 .Height ;j ++) { c = bmp.GetPixel(i,j); r = c.R; g = c.G; b = c.B; r = 255 - r; g = 255 - g; b = 255 - b; if (r < 0) r = 0; if (r> 255) r= 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; c = Color.FromArgb(r,g,b); //c = Color.FromArgb(255 - c.R, 255 - c.G, 255 - c.B); //另类表示 bmp.SetPixel(i, j, c); } pictureBox2.Refresh(); pictureBox2.Image = bmp; buttonFudiao.Enabled = true; } 浮雕效果: private void buttonFudiao_Click(object sender, System.EventArgs e) { Bitmap bmp1 = new Bitmap(pictureBox1.Image); Bitmap bmp2 = new Bitmap(pictureBox2.Image); Color c1 = new Color(); Color c2 = new Color(); Color c = new Color(); int i, j, r = 0, g = 0, b = 0;
for (i=0;i<pictureBox1 .Width ;i++) for (j = 0; j < pictureBox1.Height; j++) { c1 = bmp1.GetPixel(i, j); c2 = bmp1.GetPixel(i + 1, j + 1); r = Math.Abs(c1.R - c2.R + 128); g = Math.Abs(c1.G - c2.G + 128); b = Math.Abs(c1.B - c2.B + 128); if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; c = Color.FromArgb(r, g, b); bmp2.SetPixel(i,j ,c); } pictureBox2.Refresh(); pictureBox2.Image = bmp2; }
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<InkCanvas></InkCanvas>
</Grid>
</Window>完成. ^_______^你如果用的是winform, 那么可以用WPF做墨迹控件,在winform中载入WPF控件。
逆反处理:
private void buttonNifan_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(pictureBox1.Image);
Color c=new Color ();
int r = 0;
int g = 0;
int b = 0;
int i = 0;
int j = 0;
for (i = 0; i <= pictureBox1 .Width ;i++) //逆反操作不能用于动画;
for (j = 0; j <=pictureBox1 .Height ;j ++)
{
c = bmp.GetPixel(i,j);
r = c.R;
g = c.G;
b = c.B;
r = 255 - r;
g = 255 - g;
b = 255 - b;
if (r < 0)
r = 0;
if (r> 255)
r= 255; if (g < 0)
g = 0;
if (g > 255)
g = 255; if (b < 0)
b = 0;
if (b > 255)
b = 255; c = Color.FromArgb(r,g,b);
//c = Color.FromArgb(255 - c.R, 255 - c.G, 255 - c.B); //另类表示
bmp.SetPixel(i, j, c);
}
pictureBox2.Refresh();
pictureBox2.Image = bmp;
buttonFudiao.Enabled = true;
}
浮雕效果:
private void buttonFudiao_Click(object sender, System.EventArgs e)
{
Bitmap bmp1 = new Bitmap(pictureBox1.Image);
Bitmap bmp2 = new Bitmap(pictureBox2.Image);
Color c1 = new Color();
Color c2 = new Color();
Color c = new Color(); int i, j, r = 0, g = 0, b = 0;
for (i=0;i<pictureBox1 .Width ;i++)
for (j = 0; j < pictureBox1.Height; j++)
{
c1 = bmp1.GetPixel(i, j);
c2 = bmp1.GetPixel(i + 1, j + 1); r = Math.Abs(c1.R - c2.R + 128);
g = Math.Abs(c1.G - c2.G + 128);
b = Math.Abs(c1.B - c2.B + 128); if (r < 0)
r = 0;
if (r > 255)
r = 255; if (g < 0)
g = 0;
if (g > 255)
g = 255; if (b < 0)
b = 0;
if (b > 255)
b = 255; c = Color.FromArgb(r, g, b);
bmp2.SetPixel(i,j ,c);
}
pictureBox2.Refresh();
pictureBox2.Image = bmp2; }
涂抹效果包含3层:
1 源区域色的二次模糊
2 鼠标速度的快速检查
3 DX的加速
在我实际开发过程中,第1步,也就是二次模糊是没问题的,而在.NET中,由于窗体界面本身的PAINT现象,会造成大量MOUSEMOVE检测点的丢失,第3点,用DX加速亦得开发一套内存接管与鼠标处理的开放接口.
我不想做的原因主要就是:我不会DX编程.所以也是提醒一下,虽然只是一个涂抹,在鼠标移动时不同的速度,也是要不同的计算的,并且在实时的鼠控(鼠标控制)绘制中,鼠标移动一个点,画面就得重画一次,在这个过程中,不但PAINT造成了大量MOUSEMOVE点的丢失,更是很难想象不使用DX加速的情况下,即使是使用LOCKBITS这样的直接内存操作,也是无法达到的.
我只是说说我的经验,没有提供技术信息,分就不用了.
凡是涉及到鼠标操作的滤镜,因为要实时的显示处理的结果,即使设置了Clipregion,不断的移动也会造成mousemove事件中鼠标点的丢失,这样给人的感觉就是绘制的不连续。开源的软件paint.net中也有一些鼠标动态调整的效果,可惜那个是个很庞大的工程,我还不晓得他是如何实现的。