[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.76,0:00:06.26,Default,,0000,0000,0000,,在本节,我们要将之前讲过的代码概念 Dialogue: 0,0:00:06.26,0:00:11.91,Default,,0000,0000,0000,,和图像、像素和 RGB 值的概念结合起来 Dialogue: 0,0:00:11.91,0:00:16.98,Default,,0000,0000,0000,,本节的实例中,我们一次只研究一个像素 Dialogue: 0,0:00:16.98,0:00:21.51,Default,,0000,0000,0000,,下一节中,我们会将数量增大,一次研究上万个像素 Dialogue: 0,0:00:21.51,0:00:27.04,Default,,0000,0000,0000,,开始之前,我想要看看这个名为 x.png 的图像 Dialogue: 0,0:00:27.04,0:00:32.70,Default,,0000,0000,0000,,这个图像非常小,是10×10的图像,在这页的这个地方 Dialogue: 0,0:00:32.70,0:00:38.23,Default,,0000,0000,0000,,它是一个黑色的图像,上面有个白色的 x Dialogue: 0,0:00:38.23,0:00:43.76,Default,,0000,0000,0000,,图像非常小,我们稍后会将它放大 Dialogue: 0,0:00:43.76,0:00:49.21,Default,,0000,0000,0000,,png 是一种图像格式,叫便携式网络图像格式 Dialogue: 0,0:00:49.21,0:00:54.97,Default,,0000,0000,0000,,jpeg 可能是你比较熟悉的一种图像格式,这两个都是图像格式 Dialogue: 0,0:00:54.97,0:01:00.94,Default,,0000,0000,0000,,我要看的是这里,这里有一些代码,加载并显示 x.png 图像 Dialogue: 0,0:01:00.94,0:01:05.68,Default,,0000,0000,0000,,这是第一个、非常简单的图像处理代码实例 Dialogue: 0,0:01:05.68,0:01:10.17,Default,,0000,0000,0000,,代码在这里,我讲一下每一行的内容 Dialogue: 0,0:01:10.17,0:01:14.49,Default,,0000,0000,0000,,第一行:image = new SimpleImage("x.png"); Dialogue: 0,0:01:14.67,0:01:19.34,Default,,0000,0000,0000,,这行代码的意思是右边的代码将 x.png 图像加载到存储器中 Dialogue: 0,0:01:19.34,0:01:23.70,Default,,0000,0000,0000,,我们以后会讨论什么是存储器 Dialogue: 0,0:01:23.70,0:01:27.89,Default,,0000,0000,0000,,图像载入计算机后,计算机就可以处理图像了 Dialogue: 0,0:01:27.89,0:01:32.52,Default,,0000,0000,0000,,加载图像后,这里的等号就是 Dialogue: 0,0:01:32.52,0:01:36.98,Default,,0000,0000,0000,,把图像存储在变量里,我将变量命名为 image.setZoom(20) Dialogue: 0,0:01:36.98,0:01:41.39,Default,,0000,0000,0000,,这个变量和我们前面讲的变量是一样的\N第二行:image.setZoom(20) Dialogue: 0,0:01:41.39,0:01:46.02,Default,,0000,0000,0000,,它调用图像所带的 setZoom 函数,传递数字20 Dialogue: 0,0:01:46.02,0:01:51.96,Default,,0000,0000,0000,,这行代码的作用是设定选项,用于显示20倍的图像 Dialogue: 0,0:01:51.96,0:01:57.19,Default,,0000,0000,0000,,对于这么小的图像 Dialogue: 0,0:01:57.19,0:02:00.66,Default,,0000,0000,0000,,用这种方法来将它放大,我们就可以看得到 Dialogue: 0,0:02:00.66,0:02:04.04,Default,,0000,0000,0000,,最后,print(image)和以前讲的非常相似,就是在右边输出图像 Dialogue: 0,0:02:04.04,0:02:07.42,Default,,0000,0000,0000,,跟输出字符串和数字一样 Dialogue: 0,0:02:07.42,0:02:12.33,Default,,0000,0000,0000,,我们来试一下。运行后,你看到这里显示 x.png 这个图像 Dialogue: 0,0:02:12.33,0:02:16.91,Default,,0000,0000,0000,,其实你可以数出来,1,2,3,4 Dialogue: 0,0:02:16.91,0:02:21.98,Default,,0000,0000,0000,,你可以将像素数出来,是10像素×10像素 Dialogue: 0,0:02:22.16,0:02:27.23,Default,,0000,0000,0000,,在这里显示的是20倍大 Dialogue: 0,0:02:27.23,0:02:31.63,Default,,0000,0000,0000,,将数字改成10,再次运行 Dialogue: 0,0:02:31.63,0:02:35.48,Default,,0000,0000,0000,,改成40,运行,图像就大了许多 Dialogue: 0,0:02:35.48,0:02:40.01,Default,,0000,0000,0000,,这只是代码的第一个实例 Dialogue: 0,0:02:40.01,0:02:44.88,Default,,0000,0000,0000,,继续往下学,我们就可以加载和处理图像 Dialogue: 0,0:02:44.88,0:02:50.47,Default,,0000,0000,0000,,再来做一点更有趣的事情。我要扩展代码,从而可以处理单个像素 Dialogue: 0,0:02:50.47,0:02:55.25,Default,,0000,0000,0000,,我在程序中间加两行代码 Dialogue: 0,0:02:55.25,0:02:59.46,Default,,0000,0000,0000,,这一行是 pixel = image.getPixel(0,0) Dialogue: 0,0:02:59.46,0:03:04.36,Default,,0000,0000,0000,,这行代码的作用是根据我们在这里指定的 x y 坐标 Dialogue: 0,0:03:04.36,0:03:09.52,Default,,0000,0000,0000,,在图像中获取某个像素点,0,0指向是左上角的像素点 Dialogue: 0,0:03:09.52,0:03:14.86,Default,,0000,0000,0000,,所以它获取左上角的像素点,并将其存储到变量 Dialogue: 0,0:03:14.86,0:03:20.22,Default,,0000,0000,0000,,这行是 pixel.setRed(255) Dialogue: 0,0:03:20.22,0:03:25.72,Default,,0000,0000,0000,,这行代码调用 setRed 函数 Dialogue: 0,0:03:25.72,0:03:31.09,Default,,0000,0000,0000,,setRed的作用是获取括号里面的数值 Dialogue: 0,0:03:31.09,0:03:36.33,Default,,0000,0000,0000,,将该数值设为像素的红色值,运行一下,看结果如何 Dialogue: 0,0:03:36.33,0:03:41.50,Default,,0000,0000,0000,,结果是代码获取左上角这个原本是黑色的像素点 Dialogue: 0,0:03:41.50,0:03:46.42,Default,,0000,0000,0000,,要记得每个像素有三个值,红绿蓝 Dialogue: 0,0:03:46.42,0:03:51.60,Default,,0000,0000,0000,,这行代码访问红色值 Dialogue: 0,0:03:51.60,0:03:56.38,Default,,0000,0000,0000,,将其改成255,就是覆盖原来的数值 Dialogue: 0,0:03:56.38,0:04:01.62,Default,,0000,0000,0000,,所以我们看到这个像素点是红色的 Dialogue: 0,0:04:01.62,0:04:07.100,Default,,0000,0000,0000,,setRed 改变红色值,有类似的函数 setGreen 和 setBlue Dialogue: 0,0:04:07.100,0:04:12.81,Default,,0000,0000,0000,,就有三个函数 setRed,setGreen 和setBlue Dialogue: 0,0:04:12.81,0:04:17.62,Default,,0000,0000,0000,,有这些函数,就可以任意改变红绿蓝的值 Dialogue: 0,0:04:17.62,0:04:22.08,Default,,0000,0000,0000,,这里我提一下附加材料 Dialogue: 0,0:04:22.08,0:04:25.50,Default,,0000,0000,0000,,我刚介绍了三种函数 Dialogue: 0,0:04:25.50,0:04:29.33,Default,,0000,0000,0000,,Image functions reference (图像函数参考)是独立的页面,用一个表列出所有函数 Dialogue: 0,0:04:29.33,0:04:33.11,Default,,0000,0000,0000,,在以后的练习中,假如你要知道函数的作用,就可以作为参考 Dialogue: 0,0:04:33.11,0:04:36.53,Default,,0000,0000,0000,,但在我的讲课中,我就只用一部分函数 Dialogue: 0,0:04:36.53,0:04:40.24,Default,,0000,0000,0000,,下面我要演示这些函数的作用 Dialogue: 0,0:04:40.24,0:04:44.27,Default,,0000,0000,0000,,我们来看一些实例 Dialogue: 0,0:04:44.27,0:04:48.23,Default,,0000,0000,0000,,就是用函数执行一些任务 Dialogue: 0,0:04:48.23,0:04:52.12,Default,,0000,0000,0000,,实例的格式是这个小代码框里有一些初始代码 Dialogue: 0,0:04:52.12,0:04:55.86,Default,,0000,0000,0000,,下面的表格列出一些难题 Dialogue: 0,0:04:55.86,0:04:59.64,Default,,0000,0000,0000,,如设置绿色、黄色等,我们逐个来分析 Dialogue: 0,0:04:59.64,0:05:03.58,Default,,0000,0000,0000,,表格的右边都有一个小小的显示按钮 Dialogue: 0,0:05:03.58,0:05:07.70,Default,,0000,0000,0000,,你可以点击按钮,查看解答代码 Dialogue: 0,0:05:07.70,0:05:11.73,Default,,0000,0000,0000,,稍后你可以自己访问这页,亲自试一下我演示过的实验,或做点修改 Dialogue: 0,0:05:11.73,0:05:15.42,Default,,0000,0000,0000,,我们来试第一个 Dialogue: 0,0:05:15.42,0:05:19.28,Default,,0000,0000,0000,,我运行代码,看代码做什么 Dialogue: 0,0:05:19.28,0:05:23.58,Default,,0000,0000,0000,,现在,代码只是获取0,0像素点,改成红色,是之前讲过的 Dialogue: 0,0:05:23.58,0:05:28.59,Default,,0000,0000,0000,,看看第一个问题,将0,0像素点设为绿色 Dialogue: 0,0:05:28.59,0:05:33.54,Default,,0000,0000,0000,,这个表格是用英文的,它的意思是 Dialogue: 0,0:05:33.54,0:05:38.56,Default,,0000,0000,0000,,你要根据我们已经学过的步骤来达到某些效果 Dialogue: 0,0:05:38.56,0:05:43.64,Default,,0000,0000,0000,,就函数调用和数值而言,代码框里应该写些什么 Dialogue: 0,0:05:43.64,0:05:48.85,Default,,0000,0000,0000,,我们要进行什么运算来取得想要的效果 Dialogue: 0,0:05:48.85,0:05:53.98,Default,,0000,0000,0000,,基本上,你是把英语转换成计算机的语言 Dialogue: 0,0:05:53.98,0:05:58.79,Default,,0000,0000,0000,,这个例子是要设绿色,我要做的不是调用 serRed 函数 Dialogue: 0,0:05:58.79,0:06:03.90,Default,,0000,0000,0000,,而是将它改成调用 setGreen 函数。我们来试试看,是成功的 Dialogue: 0,0:06:03.90,0:06:09.47,Default,,0000,0000,0000,,有了绿色的像素点。试试下一个例子 Dialogue: 0,0:06:09.47,0:06:15.32,Default,,0000,0000,0000,,下一个例子说要将像素 (0,0) 设成黄色。 Dialogue: 0,0:06:15.32,0:06:20.66,Default,,0000,0000,0000,,要让像素变成黄色,我要将红色值和绿色值设成255 Dialogue: 0,0:06:20.66,0:06:25.94,Default,,0000,0000,0000,,黄色等于红色加绿色,我将红色和绿色都改变 Dialogue: 0,0:06:25.94,0:06:30.20,Default,,0000,0000,0000,,复制这行,然后贴到这里 Dialogue: 0,0:06:30.20,0:06:34.28,Default,,0000,0000,0000,,将这里改成红色。我的根据是一旦可以获取像素点 Dialogue: 0,0:06:34.28,0:06:38.31,Default,,0000,0000,0000,,我就可以对像素点做几样事情。因此,在第一行,我调用了 setRed,改变红色值 Dialogue: 0,0:06:38.31,0:06:42.24,Default,,0000,0000,0000,,接着我可以调用下一行的 setGreen 来改变绿色 Dialogue: 0,0:06:42.24,0:06:46.43,Default,,0000,0000,0000,,代码会完成每一步 Dialogue: 0,0:06:46.43,0:06:50.51,Default,,0000,0000,0000,,我们试试看。果然,是黄色 Dialogue: 0,0:06:50.51,0:06:54.44,Default,,0000,0000,0000,,这其实是回到以前的概念,这有一个像素点 Dialogue: 0,0:06:54.44,0:06:58.62,Default,,0000,0000,0000,,该像素点有三个值,我逐行写代码,在计算机里改变这些值 Dialogue: 0,0:06:58.62,0:07:04.41,Default,,0000,0000,0000,,我们试试下一个,将像素 1,0 改成黄色 Dialogue: 0,0:07:04.41,0:07:10.24,Default,,0000,0000,0000,,这个像素在哪里呢?回到这一行,pixel = image.getPixel(0,0) Dialogue: 0,0:07:10.24,0:07:14.75,Default,,0000,0000,0000,,我还没有改这一行 Dialogue: 0,0:07:14.75,0:07:19.63,Default,,0000,0000,0000,,不管这里设的是什么值,如0,0,都只是用来识别不同像素而已 Dialogue: 0,0:07:19.63,0:07:24.57,Default,,0000,0000,0000,,如果说1,0,就是获取x=1和y=0的像素 Dialogue: 0,0:07:24.57,0:07:29.26,Default,,0000,0000,0000,,习惯是先x后y Dialogue: 0,0:07:29.26,0:07:34.21,Default,,0000,0000,0000,,运行来看看。我们看到的是往右移了一个 Dialogue: 0,0:07:34.21,0:07:39.02,Default,,0000,0000,0000,,所以我们可以在这里设定任何值 Dialogue: 0,0:07:39.02,0:07:43.25,Default,,0000,0000,0000,,譬如2,4,看看运行的结果,很显然像素在这里 Dialogue: 0,0:07:43.41,0:07:47.28,Default,,0000,0000,0000,,这回到我们几节前的内容 Dialogue: 0,0:07:47.28,0:07:51.67,Default,,0000,0000,0000,,这是x=0,这是x=1,这是x=2 Dialogue: 0,0:07:51.67,0:07:55.70,Default,,0000,0000,0000,,我们不去细看不同x和y值的结果了 Dialogue: 0,0:07:55.70,0:08:00.46,Default,,0000,0000,0000,,我们只要知道以下这点就可以了,即使有一百万个像素点 Dialogue: 0,0:08:00.46,0:08:05.14,Default,,0000,0000,0000,,我们都可以用特定的x值和y值来设定每个像素点 Dialogue: 0,0:08:05.14,0:08:13.93,Default,,0000,0000,0000,,好,这里要将像素0,0设成白色,将这里改回像素0,0 Dialogue: 0,0:08:13.93,0:08:23.19,Default,,0000,0000,0000,,我要如何处理红绿蓝来产生白色呢 Dialogue: 0,0:08:23.19,0:08:30.07,Default,,0000,0000,0000,,答案是将三个值都设成255,请注意,不用重新输入像素 Dialogue: 0,0:08:30.07,0:08:35.04,Default,,0000,0000,0000,,我发现复制现有的像素,再进行修改,通常会容易一些 Dialogue: 0,0:08:35.04,0:08:39.19,Default,,0000,0000,0000,,我在这里设置第三个函数 Dialogue: 0,0:08:39.37,0:08:43.60,Default,,0000,0000,0000,,pixel.setBlue(255),看看这三个的结果 Dialogue: 0,0:08:43.60,0:08:47.24,Default,,0000,0000,0000,,果然,设成了白色,我将三个值都设成了255 Dialogue: 0,0:08:47.24,0:08:51.26,Default,,0000,0000,0000,,这里还有一些问题,我就不解答了 Dialogue: 0,0:08:51.26,0:08:55.17,Default,,0000,0000,0000,,但如果你想的话,可以到这个页面 Dialogue: 0,0:08:55.17,0:08:59.28,Default,,0000,0000,0000,,试一下任何数值 Dialogue: 0,0:08:59.28,0:09:02.88,Default,,0000,0000,0000,,你理解了这些内容后,我们就可以做一些练习