相关疑难解决方法(0)

使用PIL使所有白色像素透明?

我正在尝试使用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)

python image python-imaging-library

54
推荐指数
6
解决办法
7万
查看次数

使用 PIL 压缩 PNG 图片

我在增加图像的不透明度方面遇到问题。我的原始图像是 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。我对此不满意,我需要进一步减小大小,有什么办法可以实现这一点,而不是妥协质量在很大程度上?

png python-imaging-library

5
推荐指数
0
解决办法
1916
查看次数

在图上添加透明图片

下面我的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)

python image matplotlib matplotlib-basemap

5
推荐指数
1
解决办法
838
查看次数