最新主题
最优秀的发帖人
Yangrousi (3703) | ||||
Cathiec (2165) | ||||
Rousiyang (1680) | ||||
Kramer (1334) | ||||
TehDDA (1131) | ||||
云朵 (712) | ||||
avacyn (401) | ||||
大菊花 (296) | ||||
xintiaoboy (273) | ||||
Cryingclown (254) |
登录
c小程序
+5
Yangrousi
obelin
Cathiec
大菊花
miskayle
9 posters
c小程序
写一个小程序希望能引起大家对C的兴趣。希望能抛砖引玉。
大家用QQ的时候截图功能用的很多。但是程序上如何实现其实还比较有趣。这里就说说怎么用c来截取一个图片的一部分。
当然首先需要一个c的工程作为EEA的学生。大多是面向对象编程的。所以之后学弟学妹们这种编程最多。工程就如下图
这里我们后很多控件可以使用。这里主要用到2个按钮和2个picturebox 和一个openfiledialog 如图
当然picbox没有填色。所以看不到。不过一会就能看到了。
首先是如何打开一个文件。其实这里openfiledialog的作用是方便查找。如果清楚文件路径的话能直接打开。不过介绍一下openfiledialog的作用也好。一般用这个控件都是快速获得文件路径已经名字。所以能够直接得到filename的返回值。
所以在按钮1我们写这样的代码
openFileDialog1.ShowDialog(); 这里是显示出对话框。来选择你需要的文件。当然也能缩小查询范围用filter参数。
name = openFileDialog1.FileName; 这里获取文件名,当然名字中是包含路径的。类似一个指针指向你选择的文件。
之后就是在picturebox中显示图片了。直接写如下代码
pictureBox1.Image = Image.FromFile(name); Image.FromFile这个函数就是从固定路径读取图片返回值是个systeme.drawing.image类的参数。说白了就是一个包涵了图片每一个像素格颜色的数组。不过在VC里面专有定义成一类。不算严格意义的数组。那就来看看执行结果如何
萌妹子什么的大家就不要在意了!!!
之后就是重点了。。加入我只想要这个妹子的脸那一片。怎么办。
在QQ截图中。我们按下快捷键后会提示我们用鼠标滑动来确定一片区域。这里面发生了什么???
其实这里面发生了2个事件。。1 你鼠标按左键点下去。。2 你鼠标在某一点松开左键。
这么说起来感觉很2B。。但是就是这点事情决定了你的截取坐标。
所以我们在VC中构造同样的事件。鼠标down事件和鼠标up事件。
在picturebox1就是左边的那个。在事件栏找到这2个事件然后双击就能进入事件的代码编写
和上面说的一样。我们做的事情也就只是确定你想要截取的是那一片区域。最直观的表达方式就是坐标点。
所以2个事件中我们只要将坐标值赋值出来即可。
代码如下
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 这里大家注意。虽说是个事件但是也是子函数,那么括号后面的也就是进入变量。大家想想。你在点击鼠标的时候事件的进入变量是什么。就是你的鼠标点击。这里也就解释了为啥能简单的用e.x和e.y得到坐标。因为这里进入变量MouseEventArgs e就是指的你的鼠标参数。而事件名称也就是子函数的名称了。
{
label3.Text = Convert.ToString( x = e.X);
label4.Text = Convert.ToString( y = e.Y);这里的label只是为了显示具体坐标值。其实不写也没关系。
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
label5.Text = Convert.ToString( x1 = e.X);
label6.Text = Convert.ToString( y1 = e.Y);
}
之后就是如何“画”出我们想要的那一片区域了。
这里我们需要用到VC的一个类。bitmap类 当然也有image类(为啥不用后面的,呵呵我绝对不会告诉你我也不怎么了解后面的,我也是小白一个)
所以我们定义2个bitmap
Bitmap text,m;
然后我们让m等于原图
m=new Bitmap(pictureBox1.Image);
text是我们要画的那个图。
小科普一下。。任何图在电脑里面其实都是有很多很多小格子组成的。一个小格子只能填充单一的一种颜色。而一个图的清晰度则是由格子的数量所决定的。格子越多越小。则图片越清晰,也就是所谓的像素越高。
那么我们要画一张图的一部分说白了就是挨个把我们确定坐标的区域里每一个小格子的颜色数据挨个复制给text里的小格子这样就达到了截图的效果。
所以在按钮2里写下了如下代码
private void button2_Click(object sender, EventArgs e)
{
int i,j;
for (i = x; i < x1; i++) 从x到x1也就是截取的长度
{
for (j = y; j < y1; j++) 这里是宽度
{
text.SetPixel(i-x,j-y,m.GetPixel(i,j)); 这里的pixel是在VC里一种颜色数据的储存方法。使用的RBG方法(打魔兽的童鞋应该很容易记下来吧哦呵呵呵呵积分战场什么的)其实RBG对应就是red blue green 电脑三原色。他们的值分别是0-255的8为二进制.pixel的值也可以自己直接设置三原色的值。不过这里我们要做的是复制。所以就用get和set.
}
}
pictureBox2.Image = text; 这里当然就是在picturebox2里显示结果啦
}
来看看最后的效果。
这样咱们就有一个萌妹子的头像了。偶哈哈哈哈
虽然QQ未必用的是c语言写的。但是算法。也就是实现方法应该和这个是一样的。领会了精神。哪怕换VB,java也能够实现。
虽然不复杂。但是也是很有意思的。总结一下。其实编程像我们EEA最重要的编程是想办法构造事件。怎样去实现你想要的结果。实现这个结果的过程中发生了什么这个最重要。弄清各个事件之间的逻辑关系。这个就是咱们的算法。多写写程序也就有体会了
PS、EEA的童鞋。这个是L3c/c++一个选修的小题目哦。虽然每一年的题目未必一样。但是了解下总是好的。
大家用QQ的时候截图功能用的很多。但是程序上如何实现其实还比较有趣。这里就说说怎么用c来截取一个图片的一部分。
当然首先需要一个c的工程作为EEA的学生。大多是面向对象编程的。所以之后学弟学妹们这种编程最多。工程就如下图
这里我们后很多控件可以使用。这里主要用到2个按钮和2个picturebox 和一个openfiledialog 如图
当然picbox没有填色。所以看不到。不过一会就能看到了。
首先是如何打开一个文件。其实这里openfiledialog的作用是方便查找。如果清楚文件路径的话能直接打开。不过介绍一下openfiledialog的作用也好。一般用这个控件都是快速获得文件路径已经名字。所以能够直接得到filename的返回值。
所以在按钮1我们写这样的代码
openFileDialog1.ShowDialog(); 这里是显示出对话框。来选择你需要的文件。当然也能缩小查询范围用filter参数。
name = openFileDialog1.FileName; 这里获取文件名,当然名字中是包含路径的。类似一个指针指向你选择的文件。
之后就是在picturebox中显示图片了。直接写如下代码
pictureBox1.Image = Image.FromFile(name); Image.FromFile这个函数就是从固定路径读取图片返回值是个systeme.drawing.image类的参数。说白了就是一个包涵了图片每一个像素格颜色的数组。不过在VC里面专有定义成一类。不算严格意义的数组。那就来看看执行结果如何
萌妹子什么的大家就不要在意了!!!
之后就是重点了。。加入我只想要这个妹子的脸那一片。怎么办。
在QQ截图中。我们按下快捷键后会提示我们用鼠标滑动来确定一片区域。这里面发生了什么???
其实这里面发生了2个事件。。1 你鼠标按左键点下去。。2 你鼠标在某一点松开左键。
这么说起来感觉很2B。。但是就是这点事情决定了你的截取坐标。
所以我们在VC中构造同样的事件。鼠标down事件和鼠标up事件。
在picturebox1就是左边的那个。在事件栏找到这2个事件然后双击就能进入事件的代码编写
和上面说的一样。我们做的事情也就只是确定你想要截取的是那一片区域。最直观的表达方式就是坐标点。
所以2个事件中我们只要将坐标值赋值出来即可。
代码如下
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 这里大家注意。虽说是个事件但是也是子函数,那么括号后面的也就是进入变量。大家想想。你在点击鼠标的时候事件的进入变量是什么。就是你的鼠标点击。这里也就解释了为啥能简单的用e.x和e.y得到坐标。因为这里进入变量MouseEventArgs e就是指的你的鼠标参数。而事件名称也就是子函数的名称了。
{
label3.Text = Convert.ToString( x = e.X);
label4.Text = Convert.ToString( y = e.Y);这里的label只是为了显示具体坐标值。其实不写也没关系。
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
label5.Text = Convert.ToString( x1 = e.X);
label6.Text = Convert.ToString( y1 = e.Y);
}
之后就是如何“画”出我们想要的那一片区域了。
这里我们需要用到VC的一个类。bitmap类 当然也有image类(为啥不用后面的,呵呵我绝对不会告诉你我也不怎么了解后面的,我也是小白一个)
所以我们定义2个bitmap
Bitmap text,m;
然后我们让m等于原图
m=new Bitmap(pictureBox1.Image);
text是我们要画的那个图。
小科普一下。。任何图在电脑里面其实都是有很多很多小格子组成的。一个小格子只能填充单一的一种颜色。而一个图的清晰度则是由格子的数量所决定的。格子越多越小。则图片越清晰,也就是所谓的像素越高。
那么我们要画一张图的一部分说白了就是挨个把我们确定坐标的区域里每一个小格子的颜色数据挨个复制给text里的小格子这样就达到了截图的效果。
所以在按钮2里写下了如下代码
private void button2_Click(object sender, EventArgs e)
{
int i,j;
for (i = x; i < x1; i++) 从x到x1也就是截取的长度
{
for (j = y; j < y1; j++) 这里是宽度
{
text.SetPixel(i-x,j-y,m.GetPixel(i,j)); 这里的pixel是在VC里一种颜色数据的储存方法。使用的RBG方法(打魔兽的童鞋应该很容易记下来吧哦呵呵呵呵积分战场什么的)其实RBG对应就是red blue green 电脑三原色。他们的值分别是0-255的8为二进制.pixel的值也可以自己直接设置三原色的值。不过这里我们要做的是复制。所以就用get和set.
}
}
pictureBox2.Image = text; 这里当然就是在picturebox2里显示结果啦
}
来看看最后的效果。
这样咱们就有一个萌妹子的头像了。偶哈哈哈哈
虽然QQ未必用的是c语言写的。但是算法。也就是实现方法应该和这个是一样的。领会了精神。哪怕换VB,java也能够实现。
虽然不复杂。但是也是很有意思的。总结一下。其实编程像我们EEA最重要的编程是想办法构造事件。怎样去实现你想要的结果。实现这个结果的过程中发生了什么这个最重要。弄清各个事件之间的逻辑关系。这个就是咱们的算法。多写写程序也就有体会了
PS、EEA的童鞋。这个是L3c/c++一个选修的小题目哦。虽然每一年的题目未必一样。但是了解下总是好的。
miskayle- 论坛元老
- 帖子数 : 9
注册日期 : 12-10-22
回复: c小程序
Cathiec 写道:Yangrousi 写道:没力啊..
你是不是看到与CS有关的东西就虚啊...
Yangrousi没问题的
avacyn- 论坛普通会员
- 帖子数 : 401
注册日期 : 12-10-22
回复: c小程序
avacyn 写道:Cathiec 写道:Yangrousi 写道:没力啊..
你是不是看到与CS有关的东西就虚啊...
Yangrousi没问题的
你也没问题的,相信我...
Cathiec- 救世主
- 帖子数 : 2165
注册日期 : 12-10-22
回复: c小程序
Cathiec 写道:avacyn 写道:Cathiec 写道:Yangrousi 写道:没力啊..
你是不是看到与CS有关的东西就虚啊...
Yangrousi没问题的
你也没问题的,相信我...
我相信你,你也要相信自己。
avacyn- 论坛普通会员
- 帖子数 : 401
注册日期 : 12-10-22
回复: c小程序
这个是很重要的,据我所知国外计算机专业的学生上课真正学到的东西是非常少的,大菊花 写道:恩 这门课L3EAII上学期可选 4选2的科目之一 我们今年没做这道题
另外这门课最麻烦的部分是上网搜指令怎么用
他们主要的能力就是上网去搜寻获取信息和资料
这个能力是非常强的也是非常重要的
colorjack- 论坛普通会员
- 帖子数 : 224
注册日期 : 12-10-31
回复: c小程序
+1
所有的实验和projet都是要自己补知识 所有学习的过程就是获得短时间内处理一个完全不熟的projet的能力和经验
所有的实验和projet都是要自己补知识 所有学习的过程就是获得短时间内处理一个完全不熟的projet的能力和经验
Yangrousi- 论坛超级会员
- 帖子数 : 3703
注册日期 : 12-10-22
您在这个论坛的权限:
您不能在这个论坛回复主题
周五 24 七月 - 14:02 由 TehDDA
» 好好学习贴
周一 9 三月 - 23:00 由 Yangrousi
» [2014年7月]第二十二期水楼
周六 20 九月 - 17:22 由 Yangrousi
» 世界杯吐槽帖
周五 4 七月 - 14:15 由 Cathiec
» [2014年6月]第二十一期水楼
周四 3 七月 - 21:31 由 大菊花
» [2014年5月]第二十期水楼
周五 23 五月 - 7:43 由 Yangrousi
» C和C++集中交流帖
周三 7 五月 - 15:44 由 Cathiec
» [2014年4月]第十九期水楼
周日 27 四月 - 12:16 由 Yangrousi
» 【本版特典】故事接龙(规则说明及讨论)
周日 27 四月 - 12:00 由 Yangrousi
» [2014年3月]第十八期水楼
周三 2 四月 - 9:35 由 Cathiec