C# 抠图

咋了啦 2011-01-24 11:46:17
现在我有一张人物照片,背景是纯色的(注:这里的纯色是指单一颜色,因为通过相机拍照后,颜色RGB值变化很大,比如看起来是红色,GB的值就有很大的不同)。


我现在需要把照片里面的人物扣出来,然后替换背景。


大家有么好的思路。
...全文
795 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
huwei001982 2011-03-21
  • 打赏
  • 举报
回复
使用 ps 吧
yexia_0 2011-03-21
  • 打赏
  • 举报
回复
最近正好看这方面的资料呢。
A_A66 2011-01-25
  • 打赏
  • 举报
回复
支持一个!
wufanglu 2011-01-25
  • 打赏
  • 举报
回复
如果有这么方便的话,PS早就能实现了,现在PS还得手工去圈。
楼主的头像是很好的例子,牙齿与耳朵很难处理的。
wy811007 2011-01-25
  • 打赏
  • 举报
回复
牛人啊. 我来看看
bustersword 2011-01-24
  • 打赏
  • 举报
回复
切个多边形- -
一克代码 2011-01-24
  • 打赏
  • 举报
回复
主要还根据图片的轮廓!
wuyq11 2011-01-24
  • 打赏
  • 举报
回复
还是使用专业工具
缭绕飘渺 2011-01-24
  • 打赏
  • 举报
回复
你直接拿PS扣出来不行吗
这个东西有必要拿程序去实现他吗
除非你是做研究
yinrongg 2011-01-24
  • 打赏
  • 举报
回复
期待 高人
dylike 2011-01-24
  • 打赏
  • 举报
回复
容差取值范围:0-255
dylike 2011-01-24
  • 打赏
  • 举报
回复
给你写了一个,希望你满意:
/// <summary>
/// 获取经容差计算后的最终图,参考色彩点为源图坐标(1,1)
/// </summary>
/// <param name="SourceBitmap">源图</param>
/// <param name="Tolerance">容差</param>
/// <returns></returns>
/// <remarks></remarks>
private Bitmap GetFinalBitmap_Forli_007(Bitmap SourceBitmap, int Tolerance)
{
try {
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), Imaging.ImageLockMode.ReadWrite, 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;
} catch {
return null;
}
}
private bool IsNearValue(int B, int G, int R, Color Cr, int Tol)
{
try {
if (Math.Max(Cr.B, B) - Math.Min(Cr.B, B) <= Tol && Math.Max(Cr.G, G) - Math.Min(Cr.G, G) <= Tol && Math.Max(Cr.R, R) - Math.Min(Cr.R, R) <= Tol) {
return true;
} else {
return false;
}
} catch {
return false;
}
}
白鸽 2011-01-24
  • 打赏
  • 举报
回复
using (Bitmap bmp = new Bitmap(@""))
{
Color pixelColor = bmp.GetPixel(1, 1);
//像素点颜色的 Alpha 值
byte alpha = pixelColor.A;
//颜色的 RED 分量值
byte red = pixelColor.R;
//颜色的 GREEN 分量值
byte green = pixelColor.G;
//颜色的 BLUE 分量值
byte blue = pixelColor.B;
}
分析图片的ARGB试试
ycproc 2011-01-24
  • 打赏
  • 举报
回复
这个 用什么 处理 ?
咋了啦 2011-01-24
  • 打赏
  • 举报
回复
楼上的照片比较特殊的,其实真正照出来的照片,因为光线等,背景并不是纯色的。
mjp1234airen4385 2011-01-24
  • 打赏
  • 举报
回复
mjp1234airen4385 2011-01-24
  • 打赏
  • 举报
回复
效果如下:
mjp1234airen4385 2011-01-24
  • 打赏
  • 举报
回复
12楼的确实可以,但是和11楼的效果是一样的。
isaced 2011-01-24
  • 打赏
  • 举报
回复
楼上正解!
  • 打赏
  • 举报
回复
[img=http://hi.csdn.net/attachment/201101/24/0_1295850495ugi2.gif]发个图好难[/img]
加载更多回复(6)

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧