
C# 关于图片颜色处理的问题,在线等 下面是代码 希望高手 能帮我详细分析并注释一下。回到精彩的另有加分
classPixelColor:IComparable<PixelColor>{privateSystem.Drawing.Color_Color;privateint_...
class PixelColor : IComparable<PixelColor>
{
private System.Drawing.Color _Color;
private int _Count;
public System.Drawing.Color Color
{
get
{
return _Color;
}
set
{
_Color = value;
}
}
public int Count
{
get
{
return _Count;
}
set
{
_Count = value;
}
}
public PixelColor(System.Drawing.Color color)
{
Color = color;
}
static public PixelColor operator ++(PixelColor pixelColor)
{
if (pixelColor != null)
{
pixelColor.Count++;
return pixelColor;
}
else
{
return null;
}
}
public override string ToString()
{
return string.Format("Color={0} Count={1}", Color, Count);
}
#region IComparable<PixelColor> Members
public int CompareTo(PixelColor other)
{
return other.Count.CompareTo(this.Count);
}
#endregion
}
static private List<PixelColor> GetPixelColorFromImageFile(string fileName)
{
System.Drawing.Image image = System.Drawing.Image.FromFile(fileName);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(image);
Dictionary<System.Drawing.Color, PixelColor> _ColorDict = new Dictionary<System.Drawing.Color, PixelColor>();
for (int x = 0; x < bitmap.Width; x++)
{
for (int y = 0; y < bitmap.Height; y++)
{
System.Drawing.Color color = bitmap.GetPixel(x, y);
if (!_ColorDict.ContainsKey(color))
{
_ColorDict.Add(color, new PixelColor(color));
}
_ColorDict[color]++;
}
}
List<PixelColor> pixelColorList = new List<PixelColor>();
foreach (PixelColor pixelColor in _ColorDict.Values)
{
pixelColorList.Add(pixelColor);
}
pixelColorList.Sort();
return pixelColorList;
}
小弟是初学者,希望楼下能够尽量详尽的加上点注释。小弟还会继续追加至少一百分的。 展开
{
private System.Drawing.Color _Color;
private int _Count;
public System.Drawing.Color Color
{
get
{
return _Color;
}
set
{
_Color = value;
}
}
public int Count
{
get
{
return _Count;
}
set
{
_Count = value;
}
}
public PixelColor(System.Drawing.Color color)
{
Color = color;
}
static public PixelColor operator ++(PixelColor pixelColor)
{
if (pixelColor != null)
{
pixelColor.Count++;
return pixelColor;
}
else
{
return null;
}
}
public override string ToString()
{
return string.Format("Color={0} Count={1}", Color, Count);
}
#region IComparable<PixelColor> Members
public int CompareTo(PixelColor other)
{
return other.Count.CompareTo(this.Count);
}
#endregion
}
static private List<PixelColor> GetPixelColorFromImageFile(string fileName)
{
System.Drawing.Image image = System.Drawing.Image.FromFile(fileName);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(image);
Dictionary<System.Drawing.Color, PixelColor> _ColorDict = new Dictionary<System.Drawing.Color, PixelColor>();
for (int x = 0; x < bitmap.Width; x++)
{
for (int y = 0; y < bitmap.Height; y++)
{
System.Drawing.Color color = bitmap.GetPixel(x, y);
if (!_ColorDict.ContainsKey(color))
{
_ColorDict.Add(color, new PixelColor(color));
}
_ColorDict[color]++;
}
}
List<PixelColor> pixelColorList = new List<PixelColor>();
foreach (PixelColor pixelColor in _ColorDict.Values)
{
pixelColorList.Add(pixelColor);
}
pixelColorList.Sort();
return pixelColorList;
}
小弟是初学者,希望楼下能够尽量详尽的加上点注释。小弟还会继续追加至少一百分的。 展开
3个回答
展开全部
//定义PixelColor类,并且该类实现IComparable接口
class PixelColor : IComparable<PixelColor>
{
//类中的私有字段
private System.Drawing.Color _Color;
private int _Count;
//直接访问私有字段可能会有安全性上的问题,所以将它们公布称属性
public System.Drawing.Color Color
{
get
{
return _Color;
}
set
{
_Color = value;
}
}
//这个跟上面一样也是一个属性
public int Count
{
get
{
return _Count;
}
set
{
_Count = value;
}
}
//类的构造器,这个不需要多说什么了吧
public PixelColor(System.Drawing.Color color)
{
Color = color;
}
//在这里使用到了运算符的重载,重载的是++运算符
//其实就是告诉编译器当我操作的类型是PixelColor时,并且我使用了++这个运算符时,你去给我执行我指定的++操作
static public PixelColor operator ++(PixelColor pixelColor)
{
if (pixelColor != null)
{
pixelColor.Count++;
return pixelColor;
}
else
{
return null;
}
}
//重载了Tostring方法,意思跟上面差不多,都是为了给PixelColor提供你自己的实现
public override string ToString()
{
return string.Format("Color={0} Count={1}", Color, Count);
}
#region IComparable<PixelColor> Members
//在这里就实现了IComparable接口中要求实现的方法
//因为你上面写上了:IComparable<PixelColor>这样的字眼,所以这里方法的实现是强制的,如果你不实现这个方法,那么编译时报错.
public int CompareTo(PixelColor other)
{
return other.Count.CompareTo(this.Count);
}
#endregion
}
//上面类差不多就那些吧.然后这里是具体会使用到PixelColor这个类的方法
//函数的名称也取得挺好的,看名字就能猜出意思,提取一张图片上所有像素点的颜色值
static private List<PixelColor> GetPixelColorFromImageFile(string fileName)
{
System.Drawing.Image image = System.Drawing.Image.FromFile(fileName);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(image);
//声明了一个字典集合,里面的键就是color,而对应的值就是你刚刚写好的那个类PixelColor
//你可以简单的认为这里就是存储了一个一个的键值对,两个一组,有很多组.
Dictionary<System.Drawing.Color, PixelColor> _ColorDict = new Dictionary<System.Drawing.Color, PixelColor>();
//这个循环就是关键的提取操作,两层循环,一次遍历整张图片所有像素点。
for (int x = 0; x < bitmap.Width; x++)
{
for (int y = 0; y < bitmap.Height; y++)
{
System.Drawing.Color color = bitmap.GetPixel(x, y);
//很明显的,像素点的颜色值可能会有重复的,所以这里判断下,字典集合中如果
//已经存在了的像素的颜色值那么就不要再插入了
if (!_ColorDict.ContainsKey(color))
{
_ColorDict.Add(color, new PixelColor(color));
}
_ColorDict[color]++;
}
}
//后续的没什么了吧,简单的集合排序,遍历操作
List<PixelColor> pixelColorList = new List<PixelColor>();
foreach (PixelColor pixelColor in _ColorDict.Values)
{
pixelColorList.Add(pixelColor);
}
pixelColorList.Sort();
//返回这个包含了像素点颜色值的list(集合)
return pixelColorList;
}
class PixelColor : IComparable<PixelColor>
{
//类中的私有字段
private System.Drawing.Color _Color;
private int _Count;
//直接访问私有字段可能会有安全性上的问题,所以将它们公布称属性
public System.Drawing.Color Color
{
get
{
return _Color;
}
set
{
_Color = value;
}
}
//这个跟上面一样也是一个属性
public int Count
{
get
{
return _Count;
}
set
{
_Count = value;
}
}
//类的构造器,这个不需要多说什么了吧
public PixelColor(System.Drawing.Color color)
{
Color = color;
}
//在这里使用到了运算符的重载,重载的是++运算符
//其实就是告诉编译器当我操作的类型是PixelColor时,并且我使用了++这个运算符时,你去给我执行我指定的++操作
static public PixelColor operator ++(PixelColor pixelColor)
{
if (pixelColor != null)
{
pixelColor.Count++;
return pixelColor;
}
else
{
return null;
}
}
//重载了Tostring方法,意思跟上面差不多,都是为了给PixelColor提供你自己的实现
public override string ToString()
{
return string.Format("Color={0} Count={1}", Color, Count);
}
#region IComparable<PixelColor> Members
//在这里就实现了IComparable接口中要求实现的方法
//因为你上面写上了:IComparable<PixelColor>这样的字眼,所以这里方法的实现是强制的,如果你不实现这个方法,那么编译时报错.
public int CompareTo(PixelColor other)
{
return other.Count.CompareTo(this.Count);
}
#endregion
}
//上面类差不多就那些吧.然后这里是具体会使用到PixelColor这个类的方法
//函数的名称也取得挺好的,看名字就能猜出意思,提取一张图片上所有像素点的颜色值
static private List<PixelColor> GetPixelColorFromImageFile(string fileName)
{
System.Drawing.Image image = System.Drawing.Image.FromFile(fileName);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(image);
//声明了一个字典集合,里面的键就是color,而对应的值就是你刚刚写好的那个类PixelColor
//你可以简单的认为这里就是存储了一个一个的键值对,两个一组,有很多组.
Dictionary<System.Drawing.Color, PixelColor> _ColorDict = new Dictionary<System.Drawing.Color, PixelColor>();
//这个循环就是关键的提取操作,两层循环,一次遍历整张图片所有像素点。
for (int x = 0; x < bitmap.Width; x++)
{
for (int y = 0; y < bitmap.Height; y++)
{
System.Drawing.Color color = bitmap.GetPixel(x, y);
//很明显的,像素点的颜色值可能会有重复的,所以这里判断下,字典集合中如果
//已经存在了的像素的颜色值那么就不要再插入了
if (!_ColorDict.ContainsKey(color))
{
_ColorDict.Add(color, new PixelColor(color));
}
_ColorDict[color]++;
}
}
//后续的没什么了吧,简单的集合排序,遍历操作
List<PixelColor> pixelColorList = new List<PixelColor>();
foreach (PixelColor pixelColor in _ColorDict.Values)
{
pixelColorList.Add(pixelColor);
}
pixelColorList.Sort();
//返回这个包含了像素点颜色值的list(集合)
return pixelColorList;
}
更多追问追答
追问
能详细说下 访问私有字段的话 会出现什么安全问题?举个大概的例子说明就行。
追答
这个好说, 还是用代码举个例子吧,最简单的情况下比如说你有一个类叫做person用来模拟现实世界中“人”这个对象的,那么你可能会这样定他:
class person
{
public string name;
public int age;
}
这个对象包含两个字段,一个是姓名一个是年龄,而且这两个字段访问修饰符都是public就是告诉别人这两个字段你都可以访问到,那这个时候就会有问题了丫,一个程序员在写程序的时候用了你的类,然后很不幸的他还写错了代码:
person one=new person();
one.name="zhangsan";
one.age=-10;//看到没,这里就是问题所在,age因为被公布为公共的了,所以别人可以胡乱赋值给它,你见过谁的年龄会是-10这种吗。那这个时候把age定义为私有的,然后公布一个属性出来,属性里面我们可以做些逻辑上的判断,比如如果年龄0 && age<130)
{
_age=value;
}
}
}
}
恩。。。大致上就是这样吧,希望能帮上你的忙哈~
2011-03-04
展开全部
银铃轻响,是思念和祝福的投递。轻轻地一声问候,不想惊扰你,只想真切地祝你新春快乐!
追问
大哥 太不着边际了。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
“笨蛋程序员 ”讲的很好..基本就那个意思
追问:能详细说下 访问私有字段的话 会出现什么安全问题?举个大概的例子说明就行。
举个例子,大白天人多的时候你不敢进女厕所,但大半夜没人了你就可以进去访问了。因为女厕所它是public的私有字段~~
但是假设厕所门口有个24小时营业厕所的所长,那你肯定进不去了呗,因为他限制了你只能进男厕所,那么这里所长就是个属性,
里面有个 if(人.性别=="男"){ //只能访问男厕所,禁止访问女厕所 }
再比如,你手上有张中了500W的彩票,好吧..偶过来找你,叫你把彩票给偶。你当然不会给...因为彩票是你自己的东西,是你私有的,外人想要访问它就得通过你设置的属性来访问(这里你并没有设置属性,所以偶是100%拿不到你的彩票的^_^)。当然你可以提供一个属性“给我1000W就把彩票送你”,这时候偶就只能通过抱1000W给你来访问你的私有彩票了。
综上述所:属性可以操作类内部的所有成员,外部想访问内部私有的成员的话,只有当类提供了属性出来让外部访问才行。
最后一个比喻:属性就相当于银行的保安,而私有字段相当于金库里的钱。想要拿钱你自己看着办。^_^
追问:能详细说下 访问私有字段的话 会出现什么安全问题?举个大概的例子说明就行。
举个例子,大白天人多的时候你不敢进女厕所,但大半夜没人了你就可以进去访问了。因为女厕所它是public的私有字段~~
但是假设厕所门口有个24小时营业厕所的所长,那你肯定进不去了呗,因为他限制了你只能进男厕所,那么这里所长就是个属性,
里面有个 if(人.性别=="男"){ //只能访问男厕所,禁止访问女厕所 }
再比如,你手上有张中了500W的彩票,好吧..偶过来找你,叫你把彩票给偶。你当然不会给...因为彩票是你自己的东西,是你私有的,外人想要访问它就得通过你设置的属性来访问(这里你并没有设置属性,所以偶是100%拿不到你的彩票的^_^)。当然你可以提供一个属性“给我1000W就把彩票送你”,这时候偶就只能通过抱1000W给你来访问你的私有彩票了。
综上述所:属性可以操作类内部的所有成员,外部想访问内部私有的成员的话,只有当类提供了属性出来让外部访问才行。
最后一个比喻:属性就相当于银行的保安,而私有字段相当于金库里的钱。想要拿钱你自己看着办。^_^
追问
呵呵,感谢您的回答,不过分不能给你了。但是十分感谢,如果有机会 我再给你分吧 谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询