视频制作平台,网站推广优化方式,在建设厅网站上下载资质标准,新网站 蜘蛛在《使用numpy处理图片——基础操作》一文中#xff0c;我们通过对所有像素的alpha值做修改#xff0c;让图片变成半透明。 我们看到本来是黑色的字体也因为半透明的原因变得颜色比较淡。 本文我们将判断每个像素的RGB值。如果是纯白底色#xff0c;则将该像素的alpha值调…在《使用numpy处理图片——基础操作》一文中我们通过对所有像素的alpha值做修改让图片变成半透明。 我们看到本来是黑色的字体也因为半透明的原因变得颜色比较淡。 本文我们将判断每个像素的RGB值。如果是纯白底色则将该像素的alpha值调整到0以达到全透明的程度否则不做调整。 我们基本的思路就是遍历这个三维数组。这次使用的是nditer方法它可以辅助我们进行遍历操作而不是写三层for循环。 由于我们的逻辑需要将RGBA当做一个像素点去看待而遍历操作会将它们当成4个独立的迭代器去看失去了关联性。于是我们需要引入每个迭代器所代表元素的坐标来建立它们之间的关系。这样nditer的flags参数我们就传递了multi_index以让迭代器返回坐标。比如第一个迭代器的multi_index值就是[0,0,0]。第三个维度就是RGBA的信息坐标0表示红色R坐标1表示绿色G坐标2表示蓝色B坐标3表示Alpha值。如果RGB的值都是255则说明其是白色那就直接修改其alpha的值为0以让这个像素点全透明。为了在遍历过程中可以修改被遍历的对象需要给op_flags传递和“写入”相关的选项比如writeonly和readwrite。否则nditer的迭代器就是只读的写入将失败。 在进行修改操作时nditer迭代器并不会马上修改原来的数据而是将修改后的值放在一个缓冲区数组中。我们需要在适当的时机告诉它可以将换冲区数组复制到原数组中。于是可以通过with关键字来管理其上下文以在迭代结束后通知nditer去回写或者主动调用close方法来触发回写。
import numpy as np
from PIL import Imageimg Image.open(example.png)
data np.array(img)with np.nditer(data, flags[multi_index], op_flags[writeonly]) as it:while not it.finished:if it.multi_index[2] 3:if r g b 255:it[0] 0elif it.multi_index[2] 0:r it[0]elif it.multi_index[2] 1:g it[0]elif it.multi_index[2] 2:b it[0]is_not_finished it.iternext()horizontalImg Image.fromarray(data)
horizontalImg.save(alpha0.png)我们看到生成的图片比之前粗暴的将所有像素的alpha改成32的图上的字要清楚。