2009年4月22日
     摘要: 好久没有写了,真是灰常地惭愧。Heroes都已经放到第24集了,而我只写到第11集,实在是很惭愧。我在前面几章里面提到过ColorMatrix,可以将图像的色彩进行仿射变换。但是如果要对图像的色彩进行非线性变换的话,那就必须用到更强悍的API了。在Windows早期,有一套标准的色彩管理的API,叫做ICM 2.0 (Image Color Management 2.0)。在Windows Vis...  阅读全文
posted @ 2009-04-22 23:44 Hotcan 阅读(1375) | 评论 (3)编辑
  2008年11月26日

10. Graphics的几个属性。

今天我来讲讲Graphics在DrawImage里的几个的属性。

Graphics是GDI+里面的大拿,可以用来画线,画矩形,甚至可以用来画各种各样的材质。通过不同的Pen,Brush来实现。具体的使用方法是所有想用GDI+的同学的基础,我就不详细讲了,具体可以参考MSDN:http://msdn.microsoft.com/en-us/library/haxsc50a(VS.80).aspx。我主要来讲2个大家不太注意的属性。

a.Graphics.CompositingMode

这是一个枚举属性,可以取的值有2种,一种是SourceOver, 另外一种是SourceCopy。这定义了Graphics如何将当前颜色和背景合成。如果是SourceCopy,那么颜色不和当前背景合成。如果是SourceOver,那么背景颜色会和当前的颜色混合,算法如下:

显示颜色 = 源颜色 × alpha / 255 + 背景颜色 × (255 - alpha) / 255

新颜色的透明分量是255,也就是不透明。我们来看看下面的代码:

        private int CompositeColor(int color, int alpha, int backgroudColor)
        {
            
//显示颜色 = 源颜色 × alpha / 255 + 背景颜色 × (255 - alpha) / 255
            return color * alpha / 255 + backgroudColor * (255 - alpha) / 255;
        }
        
private void Draw(object sender, EventArgs e)
        {
            
this.BackColor = Color.FromArgb(255255255);
            Graphics g 
= this.CreateGraphics();
            g.CompositingMode 
= System.Drawing.Drawing2D.CompositingMode.SourceOver;
            g.FillRectangle(
new SolidBrush(Color.FromArgb(12725500)), new Rectangle(00200200));

            g.CompositingMode 
= System.Drawing.Drawing2D.CompositingMode.SourceCopy;
            g.FillRectangle(
new SolidBrush(Color.FromArgb(12725500)), new Rectangle(2000200200));

            
            g.CompositingMode 
= System.Drawing.Drawing2D.CompositingMode.SourceCopy;
            g.FillRectangle(
new SolidBrush(Color.FromArgb(
                
255,
                CompositeColor(
255127255),
                CompositeColor(
0127255),
                CompositeColor(
0127255))
                ), 
new Rectangle(0200200200));
          
            g.Dispose();           
        }

 

第1个色块和第2个色块分别是混合和不混合的,如果我们用不混合的方式希望得到混合的效果,那么应该用第三个色块的写法。从下面的图像中我们可以很清楚地看到结果。

b.Graphics.CompositingQuality

合成质量,一共有5种

  成员名称 说明
AssumeLinear 假定线性值。 
Default 默认质量。 
GammaCorrected 使用灰度校正。 
HighQuality 高质量、低速度复合。 
HighSpeed 高速度、低质量。 
Invalid 无效质量。 
这部分东西稍有点学问,MSDN里面没怎么讲清楚,有些实践派的同学用了其他的几个相关的属性来解释GDI+中的图像质量,例如http://www.cnblogs.com/adow/archive/2007/10/05/914573.html,不过不得精髓。我来解释一下图像合成的一些理论基础。这里还需要和另外一个属性InterpolationMode加以区分。这个属性的具体使用我会在下一节讲到,而合成质量与插值不是一回事。

根据我们上一节的算法,图像的合成是浮点运算,计算量非常大。此外,由于图像存储最后是需要被量化的,所以在量化的过程中会不可避免地出现锯齿的情况,为了平滑锯齿,又需要大量的计算。还有一个问题,如果我们有很多层不同的透明图像,需要进行合成,那么每一层都需要进行合成运算。其实这种合成运算式可以被优化的。CompositingQuality这个属性就是GDI+用来解决这些问题的。MSDN里面只是简单地说质量越高速度越慢,具体的算法不得而知。

HighQuality使用平滑技术去除在合成中出现的锯齿,并合成当前的Gamma灰度信息,这种计算是最慢的,并且出来的颜色与非GammaCorrected是不一样的。

GammaCorrected 合成当前Gamma灰度信息,但是不进行计算优化。

HighSpeed优化计算速度,出来的质量稍微有点差,如果不是对质量要求很高时看不出来的。

AssumeLinear的质量比Default稍好,速度稍慢,这种算法是假定合成中插值的像素变化是线性的。

Default就是最基本的计算方法。

Invalid未知,我也不知道,要是有知道的朋友可以告诉我。

其中HighQuality/GammaCorrected效果一样,其余四种一样。可以参考下图。

 

posted @ 2008-11-26 18:40 Hotcan 阅读(2953) | 评论 (1)编辑
  2008年11月20日

昨天晚上看了Heroes第9集,Eclipse又要来了,激动中。

今天来讲讲上个星期遗留下来的东西:ColorMatrix。

9. Color Matrix

图像的本质是什么?对不同的人来说这是不同的东西。在计算机的世界中,啥东西都是数据,图像也是一种数据。从自然界的光变成计算机的数据,需要通过采样和量化的处理。图像在计算机中,其实是一个二维数组,从数学上来说,这其实是一个矩阵。图像中的每一个点都是个四维向量,也就是(R,G,B,A), 在RGBA色彩空间中,我们可以使用一个矩阵对每一个点(R,G,B,A)作矩阵乘法运算,这样就可以对图像色彩进行变换。这种做法其实是从三维空间坐标系中的仿射变换类推过来的。具体关于仿射变换,可以参考http://en.wikipedia.org/wiki/Affine_transformation对于仿射变换的介绍。

色彩矩阵就是这个用来对色彩作仿射变换的矩阵。这是一个5*5的矩阵,如图

其实和在空间中的仿射变换完全一样,可以实现缩放,旋转,平移等功能。我看到网上有个人写了一篇深入浅出的文章"GDI+ ColorMatrix的完全揭秘与代码实现" http://blog.csdn.net/maozefa/archive/2008/09/08/2896752.aspx 写得不错,只是没有理解到ColorMatrix应用的精髓。简单套用了一些什么颜色剪切,颜色旋转,颜色平移的概念,这些东西其实在三维空间中很好理解,但是在色彩空间中,就完全不是那么回事情了,什么叫做颜色旋转60度呢? 这东西忽悠人很有用,只是看完了还是不知道怎么用,有兴趣的同学可以去看看。我下面举几个例子,说明ColorMatrix的具体应用。

a.灰度化

灰度化是指去除图像的彩色信息,讲所有的色调归为0,所有的饱和度也归为零。这个世界上有很多种不同的灰度化的算法,随便写个算法,弄篇paper搞个硕士毕业应该不成问题,比如说所有的颜色替换成R' = G' = B' = (R+B+G)/3。有一种很通用的灰度化算法如下,这其实是NTSC的色彩权重。

R'=B'=G' = 0.299*R + 0.587*G + 0.114*B

那如果我们要使用ColorMatrix, 可以用以下的矩阵:

// ColorMatrix elements
float[][] ptsArray = 

new float[] {0.299f0.299f0.299f00},
new float[] {0.518f0.518f0.518f00},
new float[] {0.114f0.114f0.114f00},
new float[] {00010},
new float[] {00001}
};

再引用一下博客园里的这篇文章http://www.cnblogs.com/sunbingzibo/archive/2008/09/11/1289260.html,如果用他的算法,那么矩阵如下  

// ColorMatrix elements
float[][] ptsArray = 

new float[] {cr,  cr, cr00},
new float[] {cg, cg, cg00},
new float[] {cb, cb, cb00},
new float[] {00010},
new float[] {00001}
};

 

b.调整色彩

使用ColorMatrix调整色彩很简单,用m11对红色乘一个系数,用m51对红色加一个值,这样就可以简单地调整红色。其他B,G,A通道以此类推。例如下面这个矩阵可以把增加红色25.5个像素(如果使用24bppArgb):

            // ColorMatrix elements
            float[][] ptsArray = 
            { 
                
new float[] {10000},
                
new float[] {01000},
                
new float[] {00100},
                
new float[] {00010},
                
new float[] {0.1f0001}
            };

c. 调整亮度, 可以用以下矩阵,将每个通道增加25.5的亮度

            // ColorMatrix elements
            float[][] ptsArray = 
            { 
                
new float[] {10000},
                
new float[] {01000},
                
new float[] {00100},
                
new float[] {00010},
                
new float[] {0.1f0.1f0.1f01}
            };

d.调整对比度,可以使用以下矩阵,将每个通道升高10%的对比度

            // ColorMatrix elements
            float[][] ptsArray = 
            { 
                
new float[] {1.1f0000},
                
new float[] {01.1f000},
                
new float[] {001.1f00},
                
new float[] {00010},
                
new float[] {00001}
            };

很不幸,这是错的。这个算法里面有个关键的问题是Overflow,如果我们直接使用这个矩阵,你会看到图像上会有溢出,导致你的图像惨不忍睹。我在网上查到有个很发指的做法可以解决这个问题,虽然发指,但是能解决!就是把最下面的项修正一点点,这样图像就不溢出了。看下面这个矩阵。

            // ColorMatrix elements
            float[][] ptsArray = 
            { 
                
new float[] {1.5f0000},
                
new float[] {01.5f000},
                
new float[] {001.5f00},
                
new float[] {00010},
                
new float[] {0.001f0.001f0.001f01}
            };

e.调整饱和度

这个矩阵比较复杂,饱和度需要通过不同的色彩权值来修正。我这里只提供一个能用的矩阵,具体可以参考这篇paper:http://www.graficaobscura.com/matrix/index.html

            float rwgt = 0.3086f;
            
float gwgt = 0.6094f;
            
float bwgt = 0.0820f;

            
float s = 1.2f;
            
float[][] ptsArray = 
            { 
                
new float[] {(1f-s)*rwgt+s, (1f-s)*rwgt, (1f-s)*rwgt, 00},
                
new float[] {(1f-s)*gwgt, (1f-s)*gwgt +s, (1f-s)*gwgt, 00},
                
new float[] {(1f-s)*bwgt, (1f-s)*bwgt, (1f-s)*bwgt + s, 00},
                
new float[] {00010},
                
new float[] {00001}
            };

 

讲了那么多个矩阵,最后让我们来看看在GDI+里面ColorMatrix这个类到底怎么用:

            FileStream fs = new FileStream(image, FileMode.Open, FileAccess.Read);
            Image img 
= Image.FromStream(fs, falsefalse);
            Bitmap bmp 
= new Bitmap(img);
            img.Dispose();
            fs.Close();

            Graphics g 
= this.CreateGraphics();

            
float rwgt = 0.3086f;
            
float gwgt = 0.6094f;
            
float bwgt = 0.0820f;

            
float s = 1.2f;
            
float[][] ptsArray = 
            { 
                
new float[] {(1f-s)*rwgt+s, (1f-s)*rwgt, (1f-s)*rwgt, 00},
                
new float[] {(1f-s)*gwgt, (1f-s)*gwgt +s, (1f-s)*gwgt, 00},
                
new float[] {(1f-s)*bwgt, (1f-s)*bwgt, (1f-s)*bwgt + s, 00},
                
new float[] {00010},
                
new float[] {00001}
            };

            
// Create a ColorMatrix
            ColorMatrix matrix = new ColorMatrix(ptsArray);

            ImageAttributes attr 
= new ImageAttributes();
            
// Set color matrix
            attr.SetColorMatrix(matrix,
            ColorMatrixFlag.Default,
            ColorAdjustType.Default);
            
// Draw image with no affects
            g.DrawImage(bmp, 00200150);
            
// Draw image with ImageAttributes
            g.DrawImage(bmp,
            
new Rectangle(2050200150),
            
00, bmp.Width, bmp.Height,
            GraphicsUnit.Pixel, attr);
            
// Dispose
            bmp.Dispose();
            g.Dispose();           

 

多少博士大牛在研究这些不同的矩阵以期获得更强悍的效果。此外还有好多人申请了各种各样的专利来保护这个色彩变换,所以如果大家想混一篇简单的paper好毕业,这是个很好的方向。随便改两个数字,一个新的矩阵就出来了,然后版面费一交,就可以发表了。当然,这也是个蛮有意思的题目,可以做很多比较和研究,这些就不是我这种IT民工该讲的东西了。

posted @ 2008-11-20 15:15 Hotcan 阅读(2241) | 评论 (5)编辑
  2008年11月14日

哈哈,这个星期Heroes第八集终于出来了,我继续顺着上一节外传讲下去,修改颜色怎么做。

8.1 使用原始的方法修改图像的RGB以及色调,饱和度和亮度

最简单的办法,很容易,就是用之前的LockBits,然后直接修改R,G,B的数值,具体的就不多说了。在GDI+里面,Color有3个方法,分别是GetHue(), GetSaturation(), GetBrightness()。它是图像的色调,饱和度和亮度。其中Hue取值为[0,360),表示当前颜色在哪一个角度,Saturation和Brightness都是从[0,1],表示色彩的饱和度和亮度。这里GDI+的注释又犯了一个错误,比如说GetSaturation():Gets the hue-saturation-brightness (HSB) saturation value for this Color structure.,说自己是HSB,但是其实它的数值是HSL的结果。写注释的人应该拉出去暴打一顿,不知道让我在这个上面浪费了多少时间。

HSB也叫HSV,也是一种非常常用的色彩空间,它根据分离的亮度信息和色彩信息,广泛地应用在了各种计算机图像软件中。另外的一种色彩空间叫HSL,跟HSV类似,只是在亮度和饱和度的处理上稍有不同,有兴趣的同学可以去查这篇文章http://en.wikipedia.org/wiki/HSL_color_space,里面有很多好看的图和详细的比较,我这里就不多说了。在这里只给大家看一下HSV色彩空间的模型:

 

 

言归正传,如果我想修改一幅图像的饱和度,怎么做呢?GDI+又做了个半吊子的事情,Color里面有个静态方法叫FromArgb,但是没有方法叫FromHSL(float hue, float Saturation, float lightness)。所以搞得大家都不开心。这里我把brightness改成lightness,以避免出现注释中的错误。

 1         private Color FromHSL(float hue, float saturation, float lightness)
 2         {
 3             double q = lightness < 0.5d ? lightness * (1 + saturation) : lightness + saturation - (lightness * saturation);
 4             double p = 2 * lightness - q;
 5             double hk = hue / 360d;
 6 
 7             double[] t = new double[3]; //save RGB in array
 8             t[0= hk + 1 / 3d;
 9             t[1= hk;
10             t[2= hk - 1 / 3d;
11 
12             for (int i = 0; i < 3; i++)
13             {
14                 if (t[i] < 0) t[i] += 1d;
15                 if (t[i] > 1) t[i] -= 1d;
16             }
17 
18             double[] color = new double[3];
19             for (int i = 0; i < 3; i++)
20             {
21                 if (t[i] < 1 / 6d)
22                 {
23                     color[i] = p + ((q - p) * 6 * t[i]);
24                 }
25                 else if (t[i] < 1 / 2d)
26                 {
27                     color[i] = q;
28                 }
29                 else if (t[i] < 2 / 3d)
30                 {
31                     color[i] = p + ((q - p) * 6 * (2 / 3d - t[i]));
32                 }
33                 else
34                 {
35                     color[i] = p;
36                 }
37             }
38 
39             return Color.FromArgb(0,
40                 (int)Math.Round(color[0* 255d),
41                 (int)Math.Round(color[1* 255d),
42                 (int)Math.Round(color[2* 255d));
43 
44         }

 

这个函数是通过以下公式计算的。

通过这个函数,Color你就可以很简单地修改颜色的饱和度,色调和亮度了。不过这种方法还是需要LockBits/UnlockBits。还有一种更有趣的方法叫做色彩矩阵的仿射变换,是从图像坐标系的仿射变换来的。只是色彩用ColorMatrix,而坐标的变换直接有一个matrix类。下一节我会介绍ColorMatrix的使用方法,而把Matrix的使用留到以后,要看Heroes能放多少集了。

posted @ 2008-11-14 16:24 Hotcan 阅读(1805) | 评论 (6)编辑
  2008年11月7日

8. 颜色修正

我最近一直在颜色空间中纠结,前面讲的透明不透明只是一种特殊的颜色。今天我准备要讲的是真正的修正颜色。我们使用的数码相机有不同的型号,感光的CCD性能也是不一样的,再加上天气或者周围光线的原因,我们排出来的照片可能会偏色。此外,为了做一些特殊处理,可能需要将照片中某一个特殊的区域颜色进行修正。比如脸色可以变得更好一点,或者头发更黑一点等等。这个Topic很大,我会花好几个星期来讲这些内容,因为涉及到许多图像处理的基本知识。今天咱们不写code,只讲理论(谁让这个星期美国大选,Heroes第八集居然没有出,我只好写外传)。

外传1. RGB色彩空间

在之前的分析中,相信所有的人都知道R,G,B是什么东西了。我们在描述色彩的时候,最常用的就是用RGB色彩空间。通过描述颜色的三个不同的分量,我们可以记录某个像素的颜色值。我们在此不涉及设备色彩空间的概念,但是有一点需要大家记住的,(0,0,0)并不代表全黑,(255,255,255)也并不代表全白,在不同的设备上,显示出的内容是不完全一样的。这个问题的解决需要依靠我之前讲的ICM(http://www.color.org/)。如果要加上透明,那就是四维的空间,(A,R,G,B)。各个分量可以被量化为不同的级别,所以才造成了8位色,16位色等等,这种量化级别可以区分各种不同的颜色,直到人眼无法察觉的程度。所以对一个初学者来说,不透明的颜色就是个Cube,在一个三维空间中的一个点。如下图

这个图很好看吧,只是很可惜,这只是对颜色描述的一种最简单的方式,它所能描述颜色内容是极其有限的,也不精确。要彻底理解这个问题,我要帮大家分析什么光的原理,颜色的波长,材料的对不同波长光的吸收和反射或者漫反射。这里我就不多说了,有兴趣的同学去找物理系光学专业的老师好好问问,人家一辈子都研究着这个问题。更有兴趣的同学可以去问问物理系的大教授讨论一下光的波粒二象性,再研究一下人眼对光的感受,再研究不同材料表面对光的反应,再研究……,打住了~!再研究下去您这辈子就结束了,所以只要简单地理解颜色就是RGB就好了。IT民工能理解到这个程度已经很不错了。

这里再给大家看个有趣的图,表示的是一个色彩空间叫sRGB能描述的颜色,灰色区域是人眼可以感知的颜色,里面的那个三角就是sRGB色彩空间能描述的颜色。还有一点要注意的是RGB色彩空间只是描述颜色的一种手段。具体还可以参考wikipedia:http://en.wikipedia.org/wiki/RGB

RGB色彩空间并不是唯一的能用来描述色彩的方法,它是最简单的一种。如果你需要修改图像区域的R,G,B分量,以及亮度,对比度分量。那么使用这种色彩空间是最简单的。但是如果你想修正色度(hue),饱和度(Saturation),那么这种色彩空间就不是那么简单了,要经过一定的换算。色彩空间有很多种,比如RGBA,包括透明的RGB四维空间;CMYK:主要用于印刷业;YIQ/YUV:主要用于NTSC/PAL彩色电视制式系统;YPbPr/YCrBr:主要用于视频压缩等领域。HSB/HSV/HSL,这是一个非常常用的色彩空间,描述色度,饱和度和亮度,这个色彩空间我们会在下一节详细讲,它是RGB色彩空间的一种变形。

posted @ 2008-11-07 15:33 Hotcan 阅读(1763) | 评论 (3)编辑
  2008年10月31日
     摘要: 7. 多帧图像为了赶上英雄第三季的播放日程,我决定一个星期出一集。在第七集Heroes里面,Peter的功能都被他老爸吸收掉了。所以我的这个系列的第七集来讲讲GDI+没完全实现的一部分功能。多帧图像是指在一幅图像中有多个帧,支持多帧图像的格式不多,只有TIFF和GIF。其他格式都不能作为多帧图像存储。其中TIFF可以支持很多页,GIF动画也支持多帧。使用GDI+可以生成多帧TIFF,却没办法实现G...  阅读全文
posted @ 2008-10-31 14:51 Hotcan 阅读(1461) | 评论 (5)编辑
  2008年10月29日
     摘要: 6.2 GIFGIF的全称是图像交换格式Graphics Interchange Format,是CompuServe公司在1987年创建并使用的。这种格式使用8位索引值来表达一个像素,也就是说1个像素1个byte,最多可以表示256种颜色。它使用LZW无损压缩算法来对图像进行压缩,之后这家公司又和几家其他的公司发明了PNG文件格式,并被更广泛地应用在Web以及其他领域。GIF支持动画,可以保存数...  阅读全文
posted @ 2008-10-29 18:21 Hotcan 阅读(1534) | 评论 (4)编辑
     摘要: 6.透明,半透明和不透明这是个大题目。在WinForm/WPF里面我们经常会看到一些关于透明的属性,比如Backcolor里面可以选择Transparant, Form里面有一个叫Opacity的属性。都是和透明以及透明度相关的。在其实是在GDI+应用层上的一些东西,在这里我就不讲了。主要从更基本的地方讲起,其中还包括两块完全不同的内容。6.1 Alpha我们在上一讲中提到了PixelFormat...  阅读全文
posted @ 2008-10-29 16:16 Hotcan 阅读(1425) | 评论 (5)编辑
  2008年10月23日
     摘要: 5.读图是快了,处理怎么还是慢?GDI+的Bitmap类提供了两个罪恶的函数GetPixel, SetPixel,用来获取某个像素点的颜色值。这个2个函数如果只调用一次两次也就罢了,万一我想把整张图片加红一点,用下面的代码,我估计你等到黄花菜都凉了,还没有算完呢。 看看下面的代码是怎么写的。[代码]代码逻辑很清楚,第1到第5行,写得很好,用了我们在前几节里面的方法,读图速度飞快且不锁文件。当然如果...  阅读全文
posted @ 2008-10-23 11:51 Hotcan 阅读(1760) | 评论 (12)编辑
  2008年10月21日
     摘要: 4. 为啥读个图那么慢?一般来说,读图可以用以下几种方法:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1publicstaticImageFromFile(stringfilename);2publicstaticImageFromFile(str...  阅读全文
posted @ 2008-10-21 18:05 Hotcan 阅读(1761) | 评论 (5)编辑
     摘要: 3. System.OutOfMemoryException首先我们还是来看一段代码[代码]前一段我们还是使用了在第2节中介绍的读图像文件的方法,之后我们使用Bitmap.Clone()方法复制一份拷贝。其实这是除了new Bitamp()之外的另一种复制图像的方法。这个方法强大的地方是它可以复制图像的一块区域。不幸的是上面那句话会给你一个System.OutOfMemoryException。这...  阅读全文
posted @ 2008-10-21 14:11 Hotcan 阅读(1358) | 评论 (2)编辑
     摘要: 今天突然收到一封信,说我那个极度复杂的Marshal的问题被解决了(http://www.cnblogs.com/hotcan/archive/2005/01/12/91007.html)。顿时感觉好久没有在这个blog上写东西了。想当年刚毕业没事情干的时候,还是写得很不亦乐乎的。所以决定炒炒冷饭,写一篇技术文章,以说明我还没有忘记这里。 1.GDI+的前世今生GDI+全称图形设备接口,Graph...  阅读全文
posted @ 2008-10-21 11:58 Hotcan 阅读(2010) | 评论 (7)编辑
  2007年4月1日
     摘要: 好久没有在这里写Blog了,发现最早的一篇还是去年的4月。其他陆陆续续的东西也都在MSN Space上。不争气的MSN Space也实在让人觉得不爽,动不动就Not available, sigh....今天一定要过来擦擦灰,让Blog 焕发生机。日子过的依然是忙碌,但是终于归于平淡,鉴于2006年自我感觉没有做出什么成绩,所以也有一些压抑和郁闷。我应该继续想想自己究竟想做什么事情,不想做什么事情...  阅读全文
posted @ 2007-04-01 01:25 Hotcan 阅读(395) | 评论 (0)编辑
  2006年4月24日
     摘要: 去年1月,快要毕业的时候,Java同学永远离开了我们。最近一个和我很要好的朋友,居然查出得了红斑狼疮。刚才看blog,又发现Grace身边也有一个这样的事情(http://www.cityzhi.com/blogs/cityzhi/31/archives/2006/6791.shtml#cmt),这种悲伤总是无法用言语表达。大家平时工作都不要太累,尽量关心身边的人,身边的事情。天长地久永远都是一种...  阅读全文
posted @ 2006-04-24 23:18 Hotcan 阅读(454) | 评论 (3)编辑
  2006年4月1日
     摘要: 澄清一下,买房只是为了自己住得开心,结婚的事情,大概八字还没有一撇。  阅读全文
posted @ 2006-04-01 18:42 Hotcan 阅读(481) | 评论 (4)编辑
     摘要: 都说房子要跌了,不过我还是莫名其妙出手买了一套房子,付出了去年所有的积蓄还背了一身的债。那个小区居然卖房的时候还有人排队,房子的环境不错,质量也不错。今年继续存钱,为了明年的装修,要不了多久,我的存款数又会变成零。人总是在赚钱,花钱,这个过程不知道什么时候才会结束。  阅读全文
posted @ 2006-04-01 18:37 Hotcan 阅读(322) | 评论 (3)编辑
  2006年3月15日
     摘要: Hi, Everyone,Thanks for enthusiasm in my blog. Today, I would like to broadcast an advertisement. Microsoft SH ATC is eager for technical talents. We are currently hiring Software Development Engineer...  阅读全文
posted @ 2006-03-15 11:49 Hotcan 阅读(894) | 评论 (2)编辑
  2005年8月27日
     摘要: http://blog.run2me.com/fish/archive/2005/08/23/9732.aspx  阅读全文
posted @ 2005-08-27 08:55 Hotcan 阅读(601) | 评论 (1)编辑
  2005年8月10日
     摘要: 前年的生日,上午在家里和爸爸妈妈吃饭,下午去女朋友家里吃饭,一个小蛋糕,几张照片。然后生活发生变化。去年的生日,北京,晚上在网上陪女朋友。被问到一个问题,回答不了。然后生活再次变化。今年的生日,持续了2天,昨天是中国的生日,今天在美国还是生日。和同事去中餐馆吃饭,生活还会变化么?  阅读全文
posted @ 2005-08-10 13:29 Hotcan 阅读(962) | 评论 (7)编辑
  2005年7月17日
     摘要: 上周五搞定了签证,在美国领事馆呆了一个下午,签证官就问了我一个问题,你是写什么软件的?就用中文对我说,通过了。现在这个team要做的事情也基本上做完了,下个星期休息三天以后,我就要飞到地球的另一端去了。  阅读全文
posted @ 2005-07-17 20:59 Hotcan 阅读(669) | 评论 (0)编辑
  2005年7月3日
     摘要: 随着去美国的日子越来越近,我在美国2个多月的住所也已经确定了,可以从Google Map上很方便地找到: http://maps.google.com/maps?q=16623+NE+39th+Way+Redmond&spn=0.004260,0.006941&t=k&hl=en  阅读全文
posted @ 2005-07-03 22:39 Hotcan 阅读(861) | 评论 (1)编辑
  2005年6月28日
     摘要: 今天是我第二次走美罗大厦的楼梯。第一次应该是在3年前,当时在23楼当intern的时候。那次请师姐吃可爱多,然后她说要走楼梯消耗掉吃可爱多的能量,于是从1楼走到了23楼。今天看到中午的时候楼下人太多,于是便决定锻炼一把,从1楼走到25楼。感觉真是比上次要累多了,看来很久不锻炼,真是体力不支,sigh,不得不感叹老了。  阅读全文
posted @ 2005-06-28 13:31 Hotcan 阅读(1004) | 评论 (4)编辑
  2005年6月15日
     摘要: 看来我的blog又有东西可以写了,如果不是太忙的话。我将在2005年7月25日这个日子开始在美国工作至9月30日,然后大概可以在美国享受一下国庆的假期,在美国到处玩玩。鉴于我已经拿到了驾照,所以活动范围也变得非常大了,各位可以期待我的新游记了。  阅读全文
posted @ 2005-06-15 12:50 Hotcan 阅读(1417) | 评论 (6)编辑
  2005年6月5日
     摘要: 很多人在问我在干啥,我说我主要在做Indigo上面的一些东西。接下来别人定然会问我Indigo是啥,于是要大段大段地解释什么是Indigo。所以在这里解释一下Indigo及其相关的内容。所有内容参考MSDN上的官方解释。indigo的本意是靛, 靛青,现在是微软用于构建面向服务应用程序的框架的一个代号。通过Indigo,可以实现现有的大部分的分布式应用程序,例如Interoperable Web ...  阅读全文
posted @ 2005-06-05 00:32 Hotcan 阅读(1102) | 评论 (3)编辑
  2005年4月30日
     摘要: 由于工作过于繁忙,而且我已经没有什么兴趣无病呻吟,感叹来感叹去,所以我决定从5月1日起改变这个Blog的基调。以后在这个blog中会出现以下三种类型的文章。 1,技术型, 对一些计算机技术问题的分析和研究,更偏重于.NET,有兴趣的话我会写一些关于Indigo, .NET 2.0上的内容。 2,探讨型, 对一些事件或现象的评论,但不会涉及政治等敏感内容。 3,游记及其他,一些照片等等,如果没有什么...  阅读全文
posted @ 2005-04-30 16:50 Hotcan 阅读(1405) | 评论 (9)编辑
  2005年4月15日
     摘要: 头疼,一开始以为是长智齿,痛苦得一塌糊涂,忍不住去拔掉了,可是还痛。再次去医院,做CT,验血,发现是蝶窦炎,脓流不出来,痛苦至极。然后再去五官科医院看,医生似笑非笑地说这个是很痛的,也没什么办法把它弄出来,开了点扩张鼻孔的东西,继续吃消炎药,止痛片。我的命咋那么苦?  阅读全文
posted @ 2005-04-15 08:40 Hotcan 阅读(1420) | 评论 (10)编辑
  2005年4月8日
     摘要: 感觉很久没有写Blog了,每天在SharpReader上看着朋友们的blog一篇一篇地更新,而我的blog却总是保持停滞。不是没有什么好写,而是真的没有时间。转眼工作已经2个星期了,虽然说没有做什么具体的事情,但是总有不同的事情吃掉时间,什么感觉都没有,就这样过去了。  阅读全文
posted @ 2005-04-08 18:56 Hotcan 阅读(896) | 评论 (6)编辑
  2005年3月31日
     摘要: L'invitation au Voyage “旅行的邀约”摄影展Photographers:Jian shuo Wang; Edward Wang; Claire HuVenue:上海市莫干山路50号苏州河艺术区4号楼B座9室建议交通方式:地铁轻轨三号线中潭路站+TaxiExhibition Opening:2005年4月1日至2005年4月30日每天10点至18...  阅读全文
posted @ 2005-03-31 13:12 Hotcan 阅读(600) | 评论 (1)编辑
  2005年3月28日
     摘要: Blog for the first day.  阅读全文
posted @ 2005-03-28 11:45 Hotcan 阅读(690) | 评论 (2)编辑
  2005年3月26日
     摘要: 3月25日是必须离校的日子,这个星期五是我最后一天呆在徐汇校区,这个校区我总共呆了3年半。 早上一早8点起来,赶到学校去参加实验室的项目总结会,然后又参加了项目申请会。这样一个上午就没有了。中午去取我的硕士毕业照,英文的硕士学位证书之类的东西,然后把实验室最后的东西搬走,并把所有的文档资料当作废纸卖了。下午回去发现电脑实在不行了,决定重装的过程中发现combo已经没有办法读CD了,这样我就不能直接...  阅读全文
posted @ 2005-03-26 22:28 Hotcan 阅读(739) | 评论 (2)编辑
  2005年3月24日
     摘要: 说了那么长时间开车,现在也有点眉目了。前一段时间一直在练习侧方移位,倒车现在也差不多了,所以可以开开小路了。昨天第一次去开了小路,几个项目做得还有些问题。今天就直接冲上了大路,从驾校开到了嘉定镇上,中途差点撞到了一个老太太。幸好反应及时,看来开车还是很玄的,昨天睡觉太少了。下下周考试,然后继续路考,争取5月份拿到驾照。  阅读全文
posted @ 2005-03-24 21:57 Hotcan 阅读(641) | 评论 (4)编辑
  2005年3月17日
     摘要: 晚上心血来潮冲到了闵行,乘上了久违的徐闵线,在办完上海交通大学离校手续的这天,再次去生活过3年的地方看看,因为那里已经发生了巨大的变化,而我以后也不会再属于这个学校。走在过去的路上,会勾起一幕幕的回忆,哪怕是经过一幢楼,一幢房子,都会让我想起以前的点点滴滴。毕竟生活过三年的地方,或多或少会留下些什么。前几天看一篇文章,上面说“和你一起相处过的人,或许最后因为这种或那种原因离开了你,但是...  阅读全文
posted @ 2005-03-17 23:07 Hotcan 阅读(665) | 评论 (8)编辑
     摘要: 东芝掌上电脑 Toshiba Pocket PC e350 主要参数: Intel PXA255 Processor at 300MHz 64MB RAM SDRAM 3.5'' diagnal reflective TFT color display SD slot for expandability Infrared port Built-in microphone &...  阅读全文
posted @ 2005-03-17 13:21 Hotcan 阅读(2157) | 评论 (1)编辑
     摘要: 今天在家,没有做什么特别的事情,只是看了两部电影。 第一部来自于亚历山大-佩恩导演的《杯酒人生》,原名Sideways,讲述了步入中年的2个人在一次旅行中各自遇到了自己姓欣赏的女人,从而刻画他们之间心理的变化,并因此获得第62届金球奖7项提名。麦尔斯在和妻子离婚以后2年都非常郁闷,把自己沉浸在写小说之中,没有办法打开心扉去接受新的女人。而Jack却在快要结婚之前,又不断和其他的女人发生关系。他们...  阅读全文
posted @ 2005-03-17 00:18 Hotcan 阅读(514) | 评论 (4)编辑
  2005年3月14日
     摘要: A love story from S.H.E. It tells a love story for 40 years: "我爱你"  阅读全文
posted @ 2005-03-14 00:51 Hotcan 阅读(2817) | 评论 (6)编辑
  2005年3月12日
     摘要: 发信人: yaoxing (幸福深处 ), 信区: Love 标  题: zz女人跟着你,是要你疼的发信站: 日月光华 (2005年03月11日19:19:33 星期五), 站内信件    女孩喜欢上了男人,对他很好,是很好的那种。她给他洗衣服,收拾房间,早晨买早点给他,小鸟依人的靠在男人身边。男人觉得有人这样无微不至的照顾是件很惬意的事情,于是他们顺理成章...  阅读全文
posted @ 2005-03-12 22:20 Hotcan 阅读(2168) | 评论 (5)编辑
  2005年3月9日
     摘要: On Sherry Lee's blog: ※※十字峡谷穿越计划新鲜出炉※※  可惜啊,黄了。  阅读全文
posted @ 2005-03-09 15:35 Hotcan 阅读(382) | 评论 (0)编辑
  2005年3月5日
     摘要: 在厦门的最后几天,我们要好好享受一下厦门岛的亚热带景致,不同的植物,沙滩,以及香火很旺盛的南普陀寺。 厦门园林植物园是全国唯一紧邻市区的植物园,里面有无数无数我看不懂的植物,包括热带的,亚热带的,看上去枝繁叶茂的样子,只是我也只能看看而已,有些花我觉得很不错,很漂亮的样子,恨不得能放在家里养着。不过像我这样的人肯定是养不活的,还是养养仙人掌好了。植物园里面路并不好走,爬山很累,让我回想起当年在昆明...  阅读全文
posted @ 2005-03-05 23:39 Hotcan 阅读(1955) | 评论 (2)编辑
  2005年2月22日
     摘要: 本来我觉得今年的情人节对我而言,只能算是一声叹息。不过厦门的海风似乎可以把这种叹息吹到无边无际的海洋中,享受美丽的风景和快乐的人生,才是最重要的。 来到厦门的第三天,我们要离开厦门,去大嶝岛的一个老大的朋友家里做客,顺便去参观那里炮击金门的遗迹,而且在渔民家里,还可以享受最新鲜的海鲜。有可能的话,我们还会坐上渔民的船出海近距离去参观金门。 汽车在厦门的高速公路上飞驰,大约开1个多小时就可以到达大嶝...  阅读全文
posted @ 2005-02-22 14:43 Hotcan 阅读(4991) | 评论 (6)编辑
  2005年2月19日
posted @ 2005-02-19 17:21 Hotcan 阅读(5140) | 评论 (2)编辑
<2010年2月>
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

搜索

 

常用链接

随笔档案

文章分类

文章档案

Blog to Blog

Friends

积分与排名

  • 积分 - 169948
  • 排名 - 369

最新评论

阅读排行榜

评论排行榜