WPF怎么实现为图片去背景?我这两种方案错在哪了?请大神指点指点!!!!!

Jane_sl Jane_sl 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
如题,不知道大家有谁做过这一方面的功能,我的思路是这样的:鼠标点击一点,取出该点的颜色,然后将图片上的这个颜色替换成透明的;如果鼠标滑动,就将所划过的颜色存储成一个列表,遍历图片,将图片中与列表相同的颜色替换成透明的。不知道这个思路对不对?
我将代码贴在下面,第一种方法,出来的图片带条纹,不能完全去除,我怀疑是不是我对byte数组解读的不对,第二种方法原有的颜色倒是去掉了,但是背景色变成了白色,而不是透明色,很伤脑筋!还望大神指点一二,非常感谢!

 #region 方法一:修改byte[]的颜色

//将图片转成byte数组存入内存中,在数组中修改鼠标点击的颜色, i:B i+1:G i+2:R i+3:Alpha 颜色一致的话改为 R:0xff,B:0xff,G:0xff Alpha:0
BitmapData bmpData = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);

byte[] maskImageRGBData = new byte[bmpData.Stride * bmpData.Height];

System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, maskImageRGBData, 0, maskImageRGBData.Length);

//鼠标选中的当前颜色
byte[] curColorBytes = new byte[3];
//curColorBytes[0] = 0xff;
//curColorBytes[1] = 0xff;
//curColorBytes[2] = 0xff;
//curColorBytes[3] = 0;
curColorBytes[0] = currentColor.B;
curColorBytes[1] = currentColor.G;
curColorBytes[2] = currentColor.R;


for (int j = 0; j + 2 < maskImageRGBData.Length; j += 4)
{
if(curColorBytes[0]==maskImageRGBData[j]&&curColorBytes[1]==maskImageRGBData[j+1]&&curColorBytes[2]==maskImageRGBData[j+2])
{
maskImageRGBData[j] = 0xff;
maskImageRGBData[j+1] = 0xff;
maskImageRGBData[j+2] = 0xff;
maskImageRGBData[j+3] = 0;
}
}

System.Runtime.InteropServices.Marshal.Copy(maskImageRGBData, 0, bmpData.Scan0, maskImageRGBData.Length);
bmp.UnlockBits(bmpData);
#endregion

#region 方法二:直接修改该像素点的值 currentColor即为鼠标获取到的像素点

if (bmp != null)
{
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
cur = bmp.GetPixel(i, j);
if (cur.Equals(currentColor))
{
bmp.SetPixel(i, j, System.Drawing.Color.FromArgb(0x00, 0xff, 0xff, 0xff));//System.Drawing.Color.Transparent); //
bmp.MakeTransparent(cur);
}
}
}
}
#endregion
bmp.Save("d://111.png");
...全文

相关推荐

评论 5
收藏 已收藏
分享
返回顶部
Jane_sl
WPF/Silverlight 8,757 成员 12,031 内容