1.先把图像转成数组(二进制流),遍历,判断哪些连续的颜色相同的像素是背景,把人物部分"抠"出来
2.将另一个背景图片作为底图,同样转数组,将人物部分循环赋值进去
3.将新数组重新转回图像显示
2.将另一个背景图片作为底图,同样转数组,将人物部分循环赋值进去
3.将新数组重新转回图像显示
解决方案 »
- winform 程序执行退出后如何又重新启动程序呢?就是类似注销功能。
- 关于Mutex在线程函数和timer中的使用
- c# 如何更改一个exe文件的图标
- Winform中的checkedListBox控件,某几个选项被选中的问题
- 请教DevExpress.XtraGrid.GridControl问题,高手请进,急!谢谢
- 请问大家在做c#连接SQL的时候,用的什么版本SQL
- WPF中FrameworkElement的KeyDown事件无法触发
- 网上2005的1.5G和3G有什么区别
- 存储过程
- .net书籍评比
- Arcgis Engine开发在Scenecontrol上添加text动态更新时内存不断增长
- 没有实现IEnumerable接口怎么也有Getenumerator()?
if (_tmpB != null)
_tmpB.Dispose();
//释放旧临时图内存
Color SourceColor = SourceBitmap.GetPixel(1, 1);
_tmpB = new Bitmap(SourceBitmap);
System.Drawing.Imaging.BitmapData bmpDATA = new System.Drawing.Imaging.BitmapData();
bmpDATA = _tmpB.LockBits(new Rectangle(0, 0, _tmpB.Width, _tmpB.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
byte[] BTS = new byte[bmpDATA.Stride * bmpDATA.Height + 1];
System.Runtime.InteropServices.Marshal.Copy(bmpDATA.Scan0, BTS, 0, BTS.Length - 1);
for (int I = 0; I <= BTS.Length - 4; I += 4)
{
if (IsNearValue(BTS[I], BTS[I + 1], BTS[I + 2], SourceColor, Tolerance) == true)
{
BTS[I + 3] = 0;
}
}
System.Runtime.InteropServices.Marshal.Copy(BTS, 0, bmpDATA.Scan0, BTS.Length - 1);
_tmpB.UnlockBits(bmpDATA);
return _tmpB;
不过这需要你自己进行测试,没有标准
跟你给出的目标图片的背景色差,前景色差,都有关系
如果阀值设置的过小,那么背景可能不完整(把部分背景当人物了)
如果阀值设置的过大,而前景色差比较小,那么可能把人物一部分当做背景了