|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2011-9-27 13:09:09
|
显示全部楼层
现在传上C#程序部分源码及程序,可执行程序,.Net3.5ourdev_680098G40RT0.rar(文件大小:4K) (原文件名:main.rar)
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Diagnostics;
class Progarm
{
//处理指定点
static void ProcessDot(Bitmap bmp,Bitmap desBmp,Color clBack,Color clEdge,int x,int y)
{
if( (x>=0)&&(x<bmp.Width) )
{
if( (y>=0)&&(y<bmp.Height) )
{
if(bmp.GetPixel(x,y)==clBack)
{
desBmp.SetPixel(x,y,clEdge);
}
}
}
}
/*
static void ProcessDotMatrix(byte *srcP ,byte * desP,int width,int height,Color clBack,Color clEdge,int x,int y)
{
if( (x>=0)&&(x<width) )
{
if( (y>=0)&&(y<height) )
{
Color tc=*(Color *)(srcP+x*height+y);
if(tc==clBack)
{
*(Color *)(desP+x*height+y)=clEdge;
}
}
}
}
*/
static void ProcessPcbColor(Bitmap bmp,Bitmap desBmp,Color clPad,Color clBack,Color clEdge)
{
//循环处理每一个点
for(int x=0;x<bmp.Width;x++)
{
for(int y=0;y<bmp.Height;y++)
{
//只处理焊盘色
int offset=1;
Color t=bmp.GetPixel(x,y);
if(t!=clPad)
{
desBmp.SetPixel(x,y,t);
continue;
}
/*
if(Math.Abs(t.G-clPad.G)>offset)
{
desBmp.SetPixel(x,y,t);
continue;
}
else if(Math.Abs(t.B-clPad.B)>offset)
{
desBmp.SetPixel(x,y,t);
continue;
}
else if(Math.Abs(t.R-clPad.R)>offset)
{
desBmp.SetPixel(x,y,t);
continue;
}
*/
ProcessDot(bmp,desBmp,clBack,clEdge,x-1,y-1);
ProcessDot(bmp,desBmp,clBack,clEdge,x,y-1);
ProcessDot(bmp,desBmp,clBack,clEdge,x+1,y-1);
ProcessDot(bmp,desBmp,clBack,clEdge,x-1,y);
ProcessDot(bmp,desBmp,clBack,clEdge,x+1,y);
ProcessDot(bmp,desBmp,clBack,clEdge,x-1,y+1);
ProcessDot(bmp,desBmp,clBack,clEdge,x+1,y);
ProcessDot(bmp,desBmp,clBack,clEdge,x+1,y+1);
}
}//end of for(int x=0;
}
static void ProcessPcbColorMatrix(Bitmap bmp,Bitmap desBmp,Color clPad,Color clBack,Color clEdge)
{
BitmapData srcBmpData=bmp.LockBits(new Rectangle(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadOnly,bmp.PixelFormat);
BitmapData desBmpData=desBmp.LockBits(new Rectangle(0,0,desBmp.Width,desBmp.Height),ImageLockMode.ReadOnly,desBmp.PixelFormat);
unsafe
{
int width=bmp.Width;
int height=bmp.Height;
byte * srcP=(byte *)srcBmpData.Scan0.ToPointer();
byte * desP=(byte *)desBmpData.Scan0.ToPointer();
byte green=clPad.G;
byte blue=clPad.B;
byte red=clPad.R;
//循环处理每一个点
for(int x=0;x<width;x++)
{
for(int y=0;y<height;y++)
{
//只处理焊盘色
int offset=32;
if(Math.Abs(srcP[x*height+y]-red)>offset)
{
continue;
}
if(Math.Abs(srcP[x*height+y+1]-green)>offset)
{
continue;
}
if(Math.Abs(srcP[x*height+y+2]-blue)>offset)
{
continue;
}
//左上点
srcP+=srcBmpData.Stride-width*3;
desP+=srcBmpData.Stride-width*3;
}
}
}
bmp.UnlockBits(srcBmpData);
desBmp.UnlockBits(desBmpData);
/*
ProcessDot(bmp,desBmp,clBack,clEdge,x-1,y-1);
ProcessDot(bmp,desBmp,clBack,clEdge,x,y-1);
ProcessDot(bmp,desBmp,clBack,clEdge,x+1,y-1);
ProcessDot(bmp,desBmp,clBack,clEdge,x-1,y);
ProcessDot(bmp,desBmp,clBack,clEdge,x+1,y);
ProcessDot(bmp,desBmp,clBack,clEdge,x-1,y+1);
ProcessDot(bmp,desBmp,clBack,clEdge,x+1,y);
ProcessDot(bmp,desBmp,clBack,clEdge,x+1,y+1);
*/
}
static void ProcessPcbBitmap(String srcFile,String desFile,Color clPad,Color clBack,Color clEdge,Color clTemp)
{
Bitmap bmp=new Bitmap(srcFile);
Bitmap desBmp=new Bitmap(bmp.Width,bmp.Height);//,PixelFormat.Format32bppRgb);
if(clPad!=clEdge)
{
ProcessPcbColor(bmp,desBmp,clPad,clBack,clEdge);
}
else
{
//首先变为零时色
ProcessPcbColor(bmp,desBmp,clPad,clBack,clTemp);
//再将临时色替换为描边色
for(int x=0;x<bmp.Width;x++)
{
for(int y=0;y<bmp.Height;y++)
{
if( (x==0)&&(y==0) )
{
desBmp.SetPixel(x,y,clBack);
continue;
}
else if( (x==0)&&(y==1) )
{
desBmp.SetPixel(x,y,clBack);
continue;
}
else if( (x==0)&&(y==2) )
{
desBmp.SetPixel(x,y,clBack);
continue;
}
if(desBmp.GetPixel(x,y)==clTemp)
{
desBmp.SetPixel(x,y,clEdge);
}
}
}
}
desBmp.Save(desFile);
desBmp.Save(".\\out.bmp");
bmp.Dispose();
desBmp.Dispose();
}
static void CopyFile(String srcFileName,String desFileName)
{
Bitmap srcBmp=new Bitmap(srcFileName);
int width=srcBmp.Width;
int height=srcBmp.Height;
Bitmap desBmp=new Bitmap(width,height,srcBmp.PixelFormat);
BitmapData srcBmpData=srcBmp.LockBits(new Rectangle(0,0,width,height),ImageLockMode.ReadWrite,srcBmp.PixelFormat);
BitmapData desBmpData=desBmp.LockBits(new Rectangle(0,0,width,height),ImageLockMode.ReadWrite,desBmp.PixelFormat);
int stride=srcBmpData.Stride;
unsafe
{
byte * srcP=(byte *)srcBmpData.Scan0.ToPointer();
byte * desP=(byte *)desBmpData.Scan0.ToPointer();
for(int y=0;y<height;y++)
{
for(int x=0;x<width;x++)
{
for(int i=0;i<3;i++)
{
//byte temp=srcP[x+y*stride+i];
//*(desP+x+y*stride+i)=*(srcP+x+y*stride+i);
//
}
//srcP+=srcBmpData.Stride-width*3;
//desP+=srcBmpData.Stride-width*3;
}
}
}
srcBmp.UnlockBits(srcBmpData);
desBmp.UnlockBits(desBmpData);
desBmp.Save(desFileName);
}
static void ProcessBmpFile(String fileName)
{
Bitmap bmp=new Bitmap(fileName);
//显示图像宽高
/*
String msg=String.Format("Width:{0} Height:{1}",bmp.Width,bmp.Height);
Console.WriteLine(msg);
*/
Color clPad=bmp.GetPixel(0,0);//焊盘色
Color clEdge=bmp.GetPixel(0,1);//描边色
Color clTemp=bmp.GetPixel(0,2);//零时色
Color clBack=bmp.GetPixel(0,3);//覆铜色
/*
//不处理边角颜色
bmp.SetPixel(0,0,clBack);
bmp.SetPixel(0,1,clBack);
bmp.SetPixel(0,2,clBack);
*/
String preFile=".\\t.bmp";
bmp.Save(preFile);//保存原始文件
String tempFileFormat=".\\t{0}.bmp";
int ProcessNum=4;
int count=0;
String desFile=String.Format(tempFileFormat,count++);
ProcessPcbBitmap(preFile,desFile,clPad,clBack,clEdge,clTemp);
for(int n=0;n<(ProcessNum-1);n++)
{
preFile=desFile;
desFile=String.Format(tempFileFormat,count++);
ProcessPcbBitmap(preFile,desFile,clEdge,clBack,clEdge,clTemp);
}
}
static void Main(string [] args)
{
if(args.Length!=1)
{
Console.WriteLine("Usage: app.exe filename.bmp");
Console.ReadKey();
return;
}
String fileName=args[0];
Console.WriteLine("file:{0}", fileName);
/*
Bitmap srcBmp=new Bitmap(fileName);
int width=srcBmp.Width;
int height=srcBmp.Height;
BitmapData srcBmpData=srcBmp.LockBits(new Rectangle(0,0,width,height),ImageLockMode.ReadOnly,srcBmp.PixelFormat);
Console.Write("width:{0},height:{1},stribe:{2}",width,height,srcBmpData.Stride);
*/
//CopyFile(fileName,".\\out.bmp");
ProcessBmpFile(fileName);
//Process.Start("c:\\winavr-20100110\\utils\\bin\\rm.exe t*.bmp");
}
} |
|