我正在尝试使用Python Image Library使所有白色像素透明.(我是一个C黑客试图学习python所以要温柔)我已经有转换工作(至少像素值看起来正确)但我无法弄清楚如何将列表转换为缓冲区来重新创建图片.这是代码
img = Image.open('img.png')
imga = img.convert("RGBA")
datas = imga.getdata()
newData = list()
for item in datas:
if item[0] == 255 and item[1] == 255 and item[2] == 255:
newData.append([255, 255, 255, 0])
else:
newData.append(item)
imgb = Image.frombuffer("RGBA", imga.size, newData, "raw", "RGBA", 0, 1)
imgb.save("img2.png", "PNG")
Run Code Online (Sandbox Code Playgroud) 我在增加图像的不透明度方面遇到问题。我的原始图像是 230 KB

在我使用代码调整图像大小后:
Method 1: imh=imgg.resize((1000,500),Image.ANTIALIAS) #filesize is 558 KB
Method 2: imh=imgg.resize((1000,500),Image.ANTIALIAS)
im2 = imh.convert('P', palette=Image.ADAPTIVE) #filesize is 170KB
Run Code Online (Sandbox Code Playgroud)
现在我使用以下代码添加图像的透明度:
def reduce_opacity(im, opacity,pathname):
assert opacity >= 0 and opacity <= 1
if im.mode != 'RGBA':
im = im.convert('RGBA')
else:
im = im.copy()
alpha = im.split()[3]
alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
im.putalpha(alpha)
jj=<pathname>
im.save(jj)
return im
Run Code Online (Sandbox Code Playgroud)
方法 1:文件大小为 598 KB 方法 2:文件大小为 383 KB
所以到目前为止我得到的最好的代码是
imh=imgg.resize((1000,500),Image.ANTIALIAS)
im2 = imh.convert('P', palette=Image.ADAPTIVE)
reduce_opacity(im2,0.5,name)
Run Code Online (Sandbox Code Playgroud)
这给了我 383KB 的文件大小。要添加不透明度,它必须以 RGBA 模式打开,这会将文件大小从 170 KB 增加到 383 KB。我对此不满意,我需要进一步减小大小,有什么办法可以实现这一点,而不是妥协质量在很大程度上?
下面我的python脚本在使用Basemap模块生成的地图上添加了一张图片(这个简单示例中生成的矩形)和GPS轨迹.
现在我想让两个轨道都是透明的.通过alphakwarg 的赛道没有问题,但我无法想象如何为图片做这件事.
import matplotlib.pyplot as plt
from PIL import Image
from matplotlib.offsetbox import AnnotationBbox, OffsetImage
from mpl_toolkits.basemap import Basemap
lats = [ 45, 15 ]
lons = [ 0 , 100 ]
fig = plt.figure( dpi = 300 )
ax = plt.subplot(111)
myBaseMap = Basemap( projection='ortho', lat_0=lats[-1], lon_0=lons[-1] )
myBaseMap.bluemarble()
planeImg = Image.new('RGB', (600, 300), color = 'red')
planeXY = myBaseMap( lons[-1], lats[-1] )
x,y = myBaseMap( lons, lats )
plt.plot( x, y, color='r', alpha=0.5, linewidth=3 ) …Run Code Online (Sandbox Code Playgroud)