。。。。。。。。
......
默认设计:
每一个像素由(r,g,b,a)确定,这是一种由4个通道构成的元组,其中每个通道取值0~255。
rgb就是红绿蓝,a是不透明度。
为什么要有a通道呢?有时候会想要把几个图拼在一起。
与二维的序列一一对应,这是位图,显示的最基础层面。
区分开它与矢量图等图形形式的概念。
对于python,一般用pickle库或二进制方法去处理这些像素信息。
使用pickle库更容易体现逻辑。就像写python的大多情况一样,我习惯先写软件的pickle版本,再试着用更高效的二进制方法重写。
(下面这张图只是想说,位图可以以很多种形式存储,在操作的过程中通常会借助PIL库的Image类)
操作一个位图,这是相对而言比较陌生的概念,但是操作列表很容易,python的基础知识。
后面会说列表和为位图的互相转化,所以只要有一个指定格式的列表,就相当于有了一个位图。
实现这个功能的代码:
i是宽,j是长。习惯上处理完一列再进入下一列。
输入两个维度的值,返回二维方格,其每一项都是一个像素颜色的默认值。
运用python的基础知识,主要是有关于列表的基础知识,处理好这些格点,就基本上相当于制作图片。
创建一个专门用于测试的文件夹。文件夹里放脚本和一个图。
明确一下什么是本文所说的作为变量的位图。借助一个叫PIL的拓展库,将位图视作“Image”变量。(相信在座的都会装PIL,网上教程排山倒海的。)
可以生成白色的图片,大小为256*256,格式为.bmp。
可以将文件加载为位图。还可以预览、保存。
显然,平面格点可以转成像素,要不然前面那么多就是等于没讲。
可以讲二维列表转化为位图,并保存、预览。
反之亦然,位图可以加载为列表。
(如果要打开文件,记得先把文件准备好)
这已经是一个思维系统。
在这里给两个例子而已,流程还是那样。
1_指定倍数放大图片
enlarge的意思是放大,在代码中意思是放大倍数,这是input()让用户通过控制台定义的正整数。
所谓ImageDraw就是字面意思(你看设计师多好,生怕我们看不懂),可以理解成画师,在指定位置以指定颜色放上图形。这里放的是矩形,意思就是让像素按照整数倍放大。当然像素间距和位图的长宽也会跟着放大。
2_十六进制表示。。。
在网上刷到一些“高级感配色”之类的贴子都是形如#83A9E7这样的乱。。。
#000000~#ffffff可以转成rgb数组,但是管不了a(因为不透明度是属于像素本身的,只是默认所取得的a=255)。
3_一个堆方块的脚本
(我会努力去慢慢解释明白这些的。。。)主要是注意看这个ch类,tr类和一个不起眼的dr()方法。
_ 与本文关系不的一些事
1_
圆括号和方括号都可以用于表示序列。
只不过圆括号封闭一些,就是那种定下来就不准备改的,要改就替换。方括号的项,相对而言是想换就换,......
甚至可以把它自己塞里边然后一大团就这么扔到别的方括号序列里也不会报错。
2_
还记得它么?注意看这个代码的第二行开头,代码默认每一项是(0,0,0,0)而不是0,看似很耗内存,实际上是想在处理的时候减少内存消耗。
另,如果想写一个创建任意维格点图的网格,可以像这样用*args表示接收元组中的多个参数:
使用示例:
也可以让同一个文件夹内的别的脚本调用这个函数:
这个代码可以压成一行:
实际上并没有像这样写,因为字太挤看得实在难受。
另一方面,有没有比这更高效的方法?
试了5个小时找到一个更快的函数(第三个),当创建一张分辨率为12000x12000的位图时,这函数比原来的快了0.1秒,但是解释什么是“yield”须要我准备一个星期的草稿。
3_
实际上没有必要用二维列表表示位图,有时候用一维列表甚至更快一些,比如说从位图到序列的代码。
4_
OpenCV和Numpy太难学了qwq
这两个库似乎更适合图形处理,但是我。。。
不务正业。。。
5_
。。。。。