1 python buffer python-imaging-library rgba raspberry-pi3
我需要保存由 numpy 数组制成的透明图像。我可以使用以下命令保存图像:
img = Image.fromarray(data, 'RGB')
Run Code Online (Sandbox Code Playgroud)
但我需要它是透明的,所以我尝试用以下方法保存它:
img = Image.fromarray(data, 'RGBA')
Run Code Online (Sandbox Code Playgroud)
然后我得到这个错误:
File "/home/pi/Documents/Projet/GetPos.py", line 51, in click
img = Image.fromarray(data, 'RGBA')
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 2217, in
fromarray
return frombuffer(mode, size, obj, "raw", rawmode, 0, 1)
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 2162, in
frombuffer
core.map_buffer(data, size, decoder_name, None, 0, args)
ValueError: buffer is not large enough
Run Code Online (Sandbox Code Playgroud)
我做了一些研究,但对于我想做的简单事情来说,一切看起来都非常复杂......有人可以帮助我吗?
这是我的完整代码(我对 python 还很陌生:)):
mouse = pymouse.PyMouse()
posX, posY = mouse.position()
print(mouse.position())
w, h = 1920, 1080
data = np.zeros((h, w, 3), dtype=np.uint8)
for x in range(posX-20, posX+20):
if x > 1679:
data[posY, w-1] = [255, 0, 0]
else:
data[posY, x] = [255, 0, 0]
for y in range(posY-20, posY+20):
if y > 1049:
data[h-1, posX] = [255, 0, 0]
else:
data[y, posX] = [255, 0, 0]
img = Image.fromarray(data, 'RGBA')
##img = Image.frombuffer('RGBA', [1080, 1920], data, "raw", 'RGBA', 0, 1)
img.save('my.png')
Run Code Online (Sandbox Code Playgroud)
为了保存透明图像,每个像素需要有第四个值,称为 Alpha 通道,它决定像素的不透明度。(RGBA 代表红色、绿色、蓝色和 alpha。)因此,代码中唯一需要更改的就是本质上使用 4 个值的元组而不是 3 个像素的元组来提供第 4 个 alpha 值。将第四个值设置为 255 意味着它完全可见,0 则使其 100% 透明。在下面的示例中,我只是将绘制红色的每个像素设置为完全可见,其他像素将是透明的:
mouse = pymouse.PyMouse()
posX, posY = mouse.position()
w, h = 1920, 1080
data = np.zeros((h, w, 4), dtype=np.uint8)
for x in range(posX-20, posX+20):
if x > 1679:
data[posY, w-1] = [255, 0, 0, 255]
else:
data[posY, x] = [255, 0, 0, 255]
for y in range(posY-20, posY+20):
if y > 1049:
data[h-1, posX] = [255, 0, 0, 255]
else:
data[y, posX] = [255, 0, 0, 255]
img = Image.fromarray(data, 'RGBA')
img.save('my.png')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12848 次 |
| 最近记录: |