使用底图 warpimage 保持透明度

Keep transparency with basemap warpimage

我有一个所有海洋都是透明的 RGBA png 贴图。

我想在北极立体投影中使用底图,而这张地图带有扭曲图像。当我想保留它时,透明度丢失并被黑色取代。我能做什么 ? 我的最终目标是在海洋中绘制彩色网格,然后在其上方绘制透明地图。

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

m = Basemap(projection='npstere',boundinglat=60,lon_0=300,resolution='l',round=True)
m.drawlsmask(ocean_color='white')
m.warpimage("land.png")
plt.show()

我认为这是函数 warpimage 中的错误。如果投影不是圆柱形的,则必须转换原始图像,这就是透明度丢失的地方。即,在文件 mpl_toolkits/basemap/__init__.py 中的函数 warpimage:

1> 4141                 for k in range(3):
   4142                     self._bm_rgba_warped[:,:,k],x,y = \
   4143                     self.transform_scalar(self._bm_rgba[:,:,k],\
   4144                     self._bm_lons,self._bm_lats,nx,ny,returnxy=True)

在这里,来自原始文件 (self._bm_rgba) 的 RGB 通道(对于 k=0,1,2)被转换并传递给变形图像,但 alpha 通道(索引为 k = 3 ) 不是。

解决方案

如果您可以修改 python 分配, 找到文件 mpl_toolkits/basemap/__init__.py,找到函数 warpimage 并将行 for k in range(3):(如上述代码中的第 4141 行左右)更改为

for k in range(self._bm_rgba.shape[2]):

这解决了问题。

行号可能不同。我使用 basemap-1.0.7.


顺便说一下,我用你的 jpg 文件进行测试,发现它没有 alpha 通道。我希望你知道它。

更新

实际上,这个错误已经 fixed in the github version of basemap