111,129
社区成员
发帖
与我相关
我的任务
分享
class NotCohereSeparate
{
public NotCohereSeparate() { }
public NotCohereSeparate(Bitmap b)
{
Bmp = new Bitmap(b); //转换为Format32bppRgb
}
Bitmap bmp;
Bitmap bmpNew;
public Bitmap Bmp
{
set
{
bmp = value;
bmpNew = new Bitmap(bmp.Width * 2, bmp.Height);
}
get { return bmpNew; }
}
int iLeft = 0;
int iRight1 = 0;
int iRight2 = 0;
int iAdd = 0;
public void Separate()
{
for (int w = 0; w < bmp.Width; w++)
{
for (int h = 0; h < bmp.Height; h++)
{
if (bmp.GetPixel(w, h).R == 0)
{
iLeft = w;
iRight2 = w;
Copy(w, h, EGetOrCopy.Get);
if (iRight1 > iLeft) { iAdd += iRight1 - iLeft + 1; }
Copy(w, h, EGetOrCopy.Copy);
w = iRight2 + 1;
iRight1 = iRight2;
break;
}
}
}
}
enum EGetOrCopy { Get, Copy }
void Check(int w,int h,EGetOrCopy goc)
{
if (w < 0 || w > bmp.Width || h < 0 || h > bmp.Height) return;
if (goc.Equals(EGetOrCopy.Copy))
{
if (bmp.GetPixel(w, h).R == 0)
{
bmp.SetPixel(w, h, Color.FromArgb(255, 255, 255));
bmpNew.SetPixel(w + iAdd, h, Color.FromArgb(0, 0, 0));
}
}
else
{
if (bmp.GetPixel(w, h).R == 0 && bmp.GetPixel(w, h).G == 0)
{
if (iLeft > w) iLeft = w;
if (iRight2 < w) iRight2 = w;
bmp.SetPixel(w, h, Color.FromArgb(0, 255, 0));
}
}
Copy(w, h, goc);
}
void Copy(int w, int h, EGetOrCopy goc)
{
Check(w - 1, h - 1, goc);
Check(w - 1, h, goc);
Check(w - 1, h + 1, goc);
Check(w, h - 1, goc);
Check(w, h + 1, goc);
Check(w + 1, h - 1, goc);
Check(w + 1, h, goc);
Check(w + 1, h + 1, goc);
}
}
if(!callbycopy)
{
Copy(w, h, goc);
}void Check(int w,int h,int x,int y,EGetOrCopy goc)
{
w += x;
y += y;
if (w < 0 || w > bmp.Width || h < 0 || h > bmp.Height) return;
if (goc.Equals(EGetOrCopy.Copy))
{
if (bmp.GetPixel(w, h).R == 0)
{
bmp.SetPixel(w, h, Color.FromArgb(255, 255, 255));
bmpNew.SetPixel(w + iAdd, h, Color.FromArgb(0, 0, 0));
}
}
else
{
if (bmp.GetPixel(w, h).R == 0 && bmp.GetPixel(w, h).G == 0)
{
if (iLeft > w) iLeft = w;
if (iRight2 < w) iRight2 = w;
bmp.SetPixel(w, h, Color.FromArgb(0, 255, 0));
}
}
Copy(w, h, x, y, goc);
}
void Copy(int w, int h, EGetOrCopy goc)
{
Check(w, h, -1, -1, goc);
Check(w, h, -1, 0, goc);
Check(w, h, -1, 1, goc);
Check(w, h, 0, -1, goc);
Check(w, h, 0, 1, goc);
Check(w, h, 1, -1, goc);
Check(w, h, 1, 0, goc);
Check(w, h, 1, 1, goc);
}